Masalah pengurutan tugas Gradle di Android Studio

Saya menggunakan Android Studio 2.2 Beta 3 dan proyek pengujian saya menggunakan CMake untuk membangun aplikasi hybrid C++ dan Java. Antarmuka JNI dihasilkan oleh SWIG. Ini berarti saya ingin membuat pembungkus SWIG sebelum tugas gradle externalNativeBuild dan JavaCompile; yaitu CMakeLists.txt saya menentukan file pembungkus cpp yang dihasilkan oleh SWIG dan kode java saya mengimpor file pembungkus java yang dihasilkan oleh SWIG.

Untuk memastikan SWIG dijalankan dan menghasilkan file pembungkus yang diperlukan sebelum tugas apa pun, saya menentukan yang berikut ini di file app/build.gradle saya

project.afterEvaluate {
    preBuild.dependsOn("runSwig")
}

Ketika saya menjalankan dari baris perintah menggunakan perintah

./gradlew assembleDebug

Saya tidak menghadapi masalah apa pun dan seperti yang diharapkan, tugas saya "runSwig" berjalan sebelum tugas lainnya

:app:runSwig
:app:preBuild
:app:preDebugBuild
<blah blah more tasks>
:app:externalNativeBuildDebug

Namun masalahnya adalah ketika proyek pertama kali dibuka di Android Studio, sepertinya build asli eksternal dipanggil sebelum runSwig dan saya mendapatkan kesalahan

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.

Kesalahan tidak hilang sampai saya merakit menggunakan baris perintah ATAU, menghapus file wrap.cxx dari CMakeLists.txt saya dan menambahkannya kembali setelah swig berhasil dijalankan setidaknya sekali.


person Harkish    schedule 31.08.2016    source sumber


Jawaban (2)


Ya, ini karena Android Studio IDE perlu menampilkan file di IDE sebelum dikompilasi: mengekspos perilaku berbeda antara baris perintah dan pembuatan IDE. Di di sini saya meretas untuk mengunduh repo yang diperlukan lebih awal dari apa pun, jadi Android Studio tidak akan mengeluh. Tapi itu tidak bagus... dan waktu start up studio Android yang lama...

person Gerry    schedule 13.10.2016

Saya mengalami masalah yang sama dengan urutan build di Android Studio 3 (dan saya kira 2.3).

Saya tidak tahu apakah ini merupakan solusi yang secara tradisional valid, tetapi -tampaknya- berfungsi pada contoh Android/SWIG/NDK saya (di sini: https://github.com/sureshjoshi/android-ndk-swig-example)

Saya menambahkan ini ke file Gradle saya, sehingga CMake dipanggil sebelum build gagal pada file yang hilang. CMake memanggil SWIG untuk membuat file Java saya secara otomatis dan menempatkannya dengan tepat.

project.afterEvaluate {
    javaPreCompileDebug.dependsOn externalNativeBuildDebug
}

Saya mungkin juga membutuhkan a

javaPreCompileRelease.dependsOn externalNativeBuildRelease

atau yang serupa... Hanya saja belum diuji.

Berasal dari masalah ini: https://github.com/sureshjoshi/android-ndk-swig-example/issues/8

person SJoshi    schedule 15.11.2017