【问题标题】:Switch Application.mk file based on Android buildType in gradlegradle中基于Android buildType切换Application.mk文件
【发布时间】:2015-04-16 17:17:41
【问题描述】:

在我的项目中,我正在使用 gradle 构建一个 NDK 库,并且需要找到一种方法来使用基于 gradle 中的 android buildType 的不同 Application.mk 文件。

(不同的 make-file 需要包含一些预处理器宏和其他编译器标志。)

我尝试根据构建类型在 gradle 构建中的项目属性中设置 make-file,并在我的自定义 ndk-build 任务中使用此属性。

不幸的是,总是使用最后一个生成文件,独立于buildVariant(如果构建类型的顺序是release - debug 调试文件,并且如果顺序是debug - @987654328 @发布文件)

这是 android buildType:

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 不是很熟悉,所以可能有一个我找不到的简单解决方案。

【问题讨论】:

标签: android gradle android-ndk android-gradle-plugin


【解决方案1】:

不幸的是,这并不像您想象的那么容易。亲身, 我通过为每个构建创建一个单独的任务并将其分配给相应的编译任务来做到这一点。

例如:

//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
    }
}

如果有更好的方法可以做到这一点,我很想听听他们的意见,但现在这对我有用。

【讨论】:

  • 谢谢,这绝对有帮助。我明天试试看。
  • 如果您的源代码中没有更改,即使选择了不同的 Application.mk 文件,ndk-build 也不会重新构建这些文件。我已经为重复的问题编写了另一个解决方案:stackoverflow.com/questions/28878689/…
  • @ph0b 如果你想强制重建,你可以简单地使用 -B 标志调用 ndk-build。
  • 是的,这就是我在解决方案中所做的。我的意思是让它自动生成,因为在切换 buildType 时很容易忘记触发重建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2016-03-05
  • 2017-04-12
  • 2017-05-26
  • 1970-01-01
  • 2015-03-11
  • 2016-10-04
相关资源
最近更新 更多