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

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


person Harkish    schedule 31.08.2016    source источник


Ответы (2)


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

person Gerry    schedule 13.10.2016

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

person SJoshi    schedule 15.11.2017