首页 > 解决方案 > CMAKE_CURRENT_BINARY_DIR 的 Gradle 模拟是什么?

问题描述

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

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

最好的方法是什么?

在 CMake 中,我会简单地-h ${CMAKE_CURRENT_BINARY_DIR}/headers在 javac 命令行中添加类似的内容,但它是 Gradle。

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

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

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

如果我省略它,那么将与目录build/headers一起创建上一层。app

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

标签: androidandroid-gradle-pluginbuild.gradle

解决方案


这是project.getBuildDir()

我还发现我可以删除gradle.projectsEvaluated: help fortasks表示该对象包含该项目的所有任务。

现在我在模块中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 将“项目”称为包含多个模块的更大实体。


推荐阅读