我正在使用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至少成功运行一次后重新添加它。
是的,这是因为Android Studio IDE需要在编译之前让文件显示在IDE中:暴露命令行和IDE构建之间的不同行为。在这里,我可以抢先下载所需的存储库,因此Android Studio不会抱怨。但这不是很漂亮...而且Android Studio的启动时间很长...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句