Я использую Android Studio 2.2 Beta 3, и мой тестовый проект использует CMake для создания гибридного приложения на C ++ и Java. Интерфейс JNI генерируется SWIG. Это означает, что я хотел бы создать оболочки SWIG перед выполнением задач gradle 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 хотя бы один раз.
Да, это потому, что в Android Studio IDE нужно получить файлы для отображения в IDE перед компиляцией: показать различное поведение между командной строкой и сборкой IDE. В Вот Я взломал, чтобы скачать нужный репо раньше, чем что-либо еще, поэтому Android Studio не будет жаловаться. Но это не красиво … и долгое время запуска студии Android …
Я столкнулся с этой же проблемой с порядком сборки в 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