CMAKE_CURRENT_BINARY_DIR的Gradle模拟是什么?

时间:2018-08-14 17:12:19

标签: android android-gradle build.gradle

我正在开发一个包含本机代码的Android应用程序。我运行javac来生成JNI标头。

我想以编程方式确定这些JNI标头的目标目录,以便将它们放在它们所属的模块附近。

最好的方法是什么?

在CMake中,我只需在Javac命令行中放入-h ${CMAKE_CURRENT_BINARY_DIR}/headers之类的东西,但这就是Gradle。

当前,我模块的build.graddle包含以下几行

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs += ["-h", "app/build/headers"]
    }
}

在这里,"app"是模块的名称。这段代码创建了app/build/headers目录和其中的头文件。

如果我省略它,那么将build/headersapp目录一起在上一级创建。

如何以编程方式获得"app"?我希望,这将使我能够将这些说明移至项目的build.gradle

1 个答案:

答案 0 :(得分:0)

project.getBuildDir()

我还发现我可以删除gradle.projectsEvaluatedtasks的帮助说该对象拥有该项目的所有任务。

现在我在模块的build.gradle中:

def JNI_header_path = new File(project.getBuildDir(), "headers")

tasks.withType(JavaCompile) {
    options.compilerArgs += ["-h", JNI_header_path]
}

...
android {
...
    defaultConfig { 
    ...
        externalNativeBuild {
            cmake {
                arguments "-DJNI_INCLUDE_DIR="+JNI_header_path
            }
        }

...
}

并在模块的CMakeLists.txt中:

include_directories(${JNI_INCLUDE_DIR})

我还发现DSL中有一些不匹配的地方。 Android studio将其称为“模块”,但Gradle将其称为“项目”。然后,Android Studio将“项目”称为更大的实体,其中包含多个模块。