根据 gradle 中的 Android buildType 切换 Application.mk 文件
Switch Application.mk file based on Android buildType in gradle
在我的项目中,我正在使用 gradle 构建一个 NDK 库,并且需要找到一种方法来使用基于 android buildType
的不同 Application.mk
文件] 在 gradle。
(需要不同的 make 文件来包含一些预处理器宏和其他编译器标志。)
我尝试根据构建类型在 gradle 构建中的项目 属性 中设置 make-file,并在我的自定义 ndk-build 任务中使用此 属性 .
不幸的是,总是使用最后一个生成文件,独立于 buildVariant
(如果构建类型的顺序是 release
- debug
调试文件,如果顺序是 debug
- release
发布文件)
这是 android 构建类型:
buildTypes {
release {
project.ext.set("makefile", "Application_release.mk");
...
}
debug{
project.ext.set("makefile", "Application_debug.mk");
...
}
}
这是 ndk 任务:
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
println "buildNative $project.makefile"
def ndkDir = android.plugin.ndkFolder
commandLine "$ndkDir/ndk-build",
'-C', file('jni').absolutePath,
'-j', Runtime.runtime.availableProcessors(),
"NDK_APPLICATION_MK=$project.makefile",
'V=1'
}
我对 gradle 不是很熟悉,所以可能有一个我还没有找到的简单解决方案。
不幸的是,这并不像您想象的那么容易。亲身,
我通过为每个构建创建一个单独的任务并为其分配相应的编译任务来做到这一点。
例如:
//noinspection GroovyAssignabilityCheck
task ndkBuildDebug(type: Exec) {
println "buildNative $project.makefile"
def ndkDir = android.plugin.ndkFolder
commandLine "$ndkDir/ndk-build",
'-C', file('jni').absolutePath,
'-j', Runtime.runtime.availableProcessors(),
"NDK_APPLICATION_MK=Application_debug.mk",
'V=1'
}
//noinspection GroovyAssignabilityCheck
task ndkBuildRelease(type: Exec) {
println "buildNative $project.makefile"
def ndkDir = android.plugin.ndkFolder
commandLine "$ndkDir/ndk-build",
'-C', file('jni').absolutePath,
'-j', Runtime.runtime.availableProcessors(),
"NDK_APPLICATION_MK=Application_release.mk",
'V=1'
}
tasks.whenTaskAdded { task ->
if (task.name == 'compileDebugJava') {
task.dependsOn ndkBuildDebug
} else if (task.name == 'compileReleaseJava') {
task.dependsOn ndkBuildRelease
}
}
如果有更好的方法,我很想听听,但目前这对我有用。
在我的项目中,我正在使用 gradle 构建一个 NDK 库,并且需要找到一种方法来使用基于 android buildType
的不同 Application.mk
文件] 在 gradle。
(需要不同的 make 文件来包含一些预处理器宏和其他编译器标志。)
我尝试根据构建类型在 gradle 构建中的项目 属性 中设置 make-file,并在我的自定义 ndk-build 任务中使用此 属性 .
不幸的是,总是使用最后一个生成文件,独立于 buildVariant
(如果构建类型的顺序是 release
- debug
调试文件,如果顺序是 debug
- release
发布文件)
这是 android 构建类型:
buildTypes {
release {
project.ext.set("makefile", "Application_release.mk");
...
}
debug{
project.ext.set("makefile", "Application_debug.mk");
...
}
}
这是 ndk 任务:
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
println "buildNative $project.makefile"
def ndkDir = android.plugin.ndkFolder
commandLine "$ndkDir/ndk-build",
'-C', file('jni').absolutePath,
'-j', Runtime.runtime.availableProcessors(),
"NDK_APPLICATION_MK=$project.makefile",
'V=1'
}
我对 gradle 不是很熟悉,所以可能有一个我还没有找到的简单解决方案。
不幸的是,这并不像您想象的那么容易。亲身, 我通过为每个构建创建一个单独的任务并为其分配相应的编译任务来做到这一点。
例如:
//noinspection GroovyAssignabilityCheck
task ndkBuildDebug(type: Exec) {
println "buildNative $project.makefile"
def ndkDir = android.plugin.ndkFolder
commandLine "$ndkDir/ndk-build",
'-C', file('jni').absolutePath,
'-j', Runtime.runtime.availableProcessors(),
"NDK_APPLICATION_MK=Application_debug.mk",
'V=1'
}
//noinspection GroovyAssignabilityCheck
task ndkBuildRelease(type: Exec) {
println "buildNative $project.makefile"
def ndkDir = android.plugin.ndkFolder
commandLine "$ndkDir/ndk-build",
'-C', file('jni').absolutePath,
'-j', Runtime.runtime.availableProcessors(),
"NDK_APPLICATION_MK=Application_release.mk",
'V=1'
}
tasks.whenTaskAdded { task ->
if (task.name == 'compileDebugJava') {
task.dependsOn ndkBuildDebug
} else if (task.name == 'compileReleaseJava') {
task.dependsOn ndkBuildRelease
}
}
如果有更好的方法,我很想听听,但目前这对我有用。