Android Studio中的Gradle任务排序问题

Har*_*ish 8 c++ swig cmake android-gradle-plugin 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")
}
Run Code Online (Sandbox Code Playgroud)

当我使用命令从命令行运行时

./gradlew assembleDebug
Run Code Online (Sandbox Code Playgroud)

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

:app:runSwig
:app:preBuild
:app:preDebugBuild
<blah blah more tasks>
:app:externalNativeBuildDebug
Run Code Online (Sandbox Code Playgroud)

但问题是当项目首次在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.
Run Code Online (Sandbox Code Playgroud)

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

Ger*_*rry 2

是的,这是因为 Android Studio IDE 需要在编译之前获取要在 IDE 中显示的文件:暴露命令行和 IDE 构建之间的不同行为。在这里,我比其他任何东西都更早下载所需的存储库,因此 Android Studio 不会抱怨。但它并不漂亮......而且 android studio 启动时间很长......