提问者:小点点

在编译Kotlin代码之前从gradle运行CMake


使用Gradle5.4.1,我想为一个Android应用程序构建一个CMake项目。这可以在app/build.gradle中通过以下方式完成:

externalNativeBuild {
    cmake {
        // Provides a relative path to your CMake build script.
        version "3.13.0+"
        path "../subproject/CMakeLists.txt"
    }
}

本项目通过使用SWIG生成一个共享库和一些Java文件。我可以通过-djava_output_dir=generated/Java指定Java源的输出目录。

我如何迫使gradle在编译主应用程序源代码(Kotlin)之前等待CMake构建?源代码导入生成的Java文件,当前由于缺少Java文件,构建过程失败。gradle似乎是并行运行cmake和Kotlin编译器。

附加问题:如何将生成的源输出目录作为生成源添加到AndroidStudio项目树中?树中有一个用于生成源的特殊条目。

版本信息:

$ ./gradlew --version

------------------------------------------------------------
Gradle 5.4.1
------------------------------------------------------------

Build time:   2019-04-26 08:14:42 UTC
Revision:     261d171646b36a6a28d5a19a69676cd098a4c19d

Kotlin:       1.3.21
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          11.0.5 (Debian 11.0.5+10-post-Debian-1deb10u1)
OS:           Linux 4.19.0-6-amd64 amd64


共1个答案

匿名用户

您应该将cmake任务添加为CompileKotlin任务的依赖项。

分级任务是部分排序的(某些任务应该在某些其他任务之前启动)。依赖项被用来表示这种关系。

若要声明对ExternalNativeBuild的依赖项,请将其追加到Build.Gradle

project.afterEvaluate {
    if (tasks.findByName("externalNativeBuildDebug")) {
        compileDebugKotlin.dependsOn externalNativeBuildDebug
    }
    if (tasks.findByName("externalNativeBuildRelease")) {
        compileReleaseKotlin.dependsOn externalNativeBuildRelease  
    }
}

>

  • 什么是afterevalue?这是Gradle的生命周期阶段。这是阅读和应用所有定义的时候。在这里阅读更多内容。

    什么是ExternalNativeBuildDebugExternalNativeBuildRease?这些是对ExternalNativeBuild任务的引用,具体取决于特定的生成命令