我正在开发一个包含本机代码的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/headers
与app
目录一起在上一级创建。
如何以编程方式获得"app"
?我希望,这将使我能够将这些说明移至项目的build.gradle
答案 0 :(得分:0)
是project.getBuildDir()
我还发现我可以删除gradle.projectsEvaluated
:tasks
的帮助说该对象拥有该项目的所有任务。
现在我在模块的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将“项目”称为更大的实体,其中包含多个模块。