我正在使用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成功运行至少一次后重新添加它。
答案 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工作室启动时间......