Я использую Android Studio 2.2 Beta 3, и мой тестовый проект использует CMake для создания гибридного приложения C++ и Java. Интерфейс JNI создается SWIG. Это означает, что я хотел бы сгенерировать оболочки SWIG перед задачами градации externalNativeBuild и JavaCompile; т.е. мой CMakeLists.txt указывает файл-оболочку cpp, сгенерированный SWIG, а мой код java импортирует файлы-оболочки java, сгенерированные SWIG.
Чтобы обеспечить запуск 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.
Ошибка не исчезнет, пока я не соберу с помощью командной строки ИЛИ не удалю файл wrap.cxx из моего CMakeLists.txt и повторно не добавлю его после успешного запуска swig хотя бы один раз.