代码之家  ›  专栏  ›  技术社区  ›  cytrinox

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

  •  0
  • cytrinox  · 技术社区  · 5 年前

    使用Gradle 5.4.1,我想为Android应用程序构建一个CMake项目。这可以在 应用程序/版本。格拉德尔 使用:

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

    该项目使用SWIG生成一个共享库和一些Java文件。我可以通过以下方式指定Java源代码的输出目录: -DJAVA\u OUTPUT\u DIR=generated/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
    
    
    0 回复  |  直到 5 年前
        1
  •  3
  •   cytrinox    5 年前

    您应该添加 cmake 任务作为 compileKotlin 任务

    Gradle任务是部分有序的(一些任务应该在其他一些任务之前启动)。依赖项用于表示这种关系。

    声明依赖项 externalNativeBuild -将此附加到 build.gradle

    project.afterEvaluate {
        if (tasks.findByName("externalNativeBuildDebug")) {
            compileDebugKotlin.dependsOn externalNativeBuildDebug
        }
        if (tasks.findByName("externalNativeBuildRelease")) {
            compileReleaseKotlin.dependsOn externalNativeBuildRelease  
        }
    }
    
    • 是什么 afterEvaluate ? 这是gradle的生命周期阶段。这是所有定义被阅读和应用的时候。阅读更多 here .

    • 是什么 externalNativeBuildDebug externalNativeBuildRelease ? 这些是对 任务,具体取决于特定的生成命令

        2
  •  2
  •   Dharman Aman Gojariya    3 年前

    虽然公认的答案很有效,但我使用了 libraryVariants

    android {
        libraryVariants.all {
            tasks.findByName("compile${name.capitalize()}Kotlin")
                ?.dependsOn(tasks.findByName("externalNativeBuild${name.capitalize()}"))
        }
    }
    

    此解决方案的显著优点是,它不知道您的构建变体,如果您更改/添加变体,它将继续工作而不进行修改。