在gradle中切换基于Android buildType的Application.mk文件

时间:2015-04-16 17:17:42

标签: android gradle android-ndk android-gradle

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

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

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

不幸的是,总是使用最后一个make文件,独立于buildVariant(如果构建类型的顺序是release - debug调试文件,如果订单是debug - release发布文件)

这是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,所以可能有一个简单的解决方案,我还无法找到。

1 个答案:

答案 0 :(得分:4)

不幸的是,它并不像你想象的那么容易。亲身, 我是通过为每个构建创建一个单独的任务并为其分配相应的编译任务来完成的。

例如:

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

如果有更好的方法,我很乐意听到它们,但现在这对我有用。