我正在使用 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.
直到我使用命令行组装或者从我的 CMakeLists.txt 中删除 wrap.cxx 文件并在 swig 成功运行至少一次后重新添加它,该错误才会消失。