Android Studio中的Gradle任务排序问题

时间:2016-08-31 22:58:52

标签: c++ cmake android-gradle swig android-studio-2.2

我正在使用Android Studio 2.2 Beta 3,我的测试项目使用CMake构建混合C ++和Java应用程序。 JNI接口由SWIG生成。这意味着我想在externalNativeBuild和JavaCompile gradle任务之前生成SWIG包装器;即我的CMakeLists.txt指定SWIG生成的cpp包装器文件,我的java代码导入SWIG生成的java包装器文件。

为了确保SWIG运行并在任何任务之前生成必要的包装器文件,我在app / build.gradle文件中指定了以下内容

project.afterEvaluate {
    preBuild.dependsOn("runSwig")
}

当我使用命令

从命令行运行时
./gradlew assembleDebug

我没有遇到任何问题,正如预期的那样,我的任务“runSwig”在任何其他任务之前运行

:app:runSwig
:app:preBuild
:app:preDebugBuild
<blah blah more tasks>
:app:externalNativeBuildDebug

但问题是在Android Studio中首次打开项目时,看起来在runSwig之前调用了外部本机构建,我得到了错误

CMake Error at CMakeLists.txt:79 (add_library):
  Cannot find source file:

    ../../../wrap.cxx

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx

FAILURE: Build failed with an exception.

在我使用命令行OR组装之前,错误不会消失,从我的CMakeLists.txt中删除wrap.cxx文件,并在swig成功运行至少一次后重新添加它。

2 个答案:

答案 0 :(得分:3)

我遇到了Android Studio 3中构建顺序的同样问题(我想是2.3)。

我不知道这是否是一个传统上有效的解决方案,但它似乎适用于我的Android / SWIG / NDK示例(此处:https://github.com/sureshjoshi/android-ndk-swig-example

我将此添加到我的Gradle文件中,以便在构建失败文件失败之前调用CMake。 CMake调用SWIG来自动生成我的Java文件并正确放置它们。

project.afterEvaluate {
    javaPreCompileDebug.dependsOn externalNativeBuildDebug
}

我可能还需要一个

javaPreCompileRelease.dependsOn externalNativeBuildRelease

或类似的东西......还没有测试过它。

源于此问题:https://github.com/sureshjoshi/android-ndk-swig-example/issues/8

答案 1 :(得分:2)

是的,这是因为Android Studio IDE需要在编译之前将文件显示在IDE中:暴露命令行和IDE构建之间的不同行为。在here我不得不提前下载所需的回购,因此Android Studio不会抱怨。但它并不漂亮......而且很长的android工作室启动时间......