Проблема заказа задач Gradle в Android Studio

Я использую 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 хотя бы один раз.

8

Решение

Да, это потому, что в Android Studio IDE нужно получить файлы для отображения в IDE перед компиляцией: показать различное поведение между командной строкой и сборкой IDE. В Вот Я взломал, чтобы скачать нужный репо раньше, чем что-либо еще, поэтому Android Studio не будет жаловаться. Но это не красиво … и долгое время запуска студии Android …

1

Другие решения

Я столкнулся с этой же проблемой с порядком сборки в 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