ปัญหาการเรียงลำดับงาน Gradle ใน Android Studio

ฉันใช้ Android Studio 2.2 Beta 3 และโปรเจ็กต์ทดสอบของฉันใช้ CMake เพื่อสร้างแอป C++ และ Java แบบไฮบริด อินเทอร์เฟซ JNI ถูกสร้างขึ้นโดย SWIG ซึ่งหมายความว่าฉันต้องการสร้าง SWIG wrappers ก่อนงาน gradle ภายนอกNativeBuild และ JavaCompile เช่น CMakeLists.txt ของฉันระบุไฟล์ wrapper cpp ที่สร้างโดย SWIG และโค้ด java ของฉันนำเข้าไฟล์ java wrapper ที่สร้างโดย SWIG

เพื่อให้แน่ใจว่า SWIG ทำงานและสร้างไฟล์ wrapper ที่จำเป็นก่อนงานใดๆ ฉันจึงระบุสิ่งต่อไปนี้ในไฟล์ app/build.gradle ของฉัน

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

เมื่อฉันรันจาก commandline โดยใช้คำสั่ง

./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 ในที่นี่ ฉันแฮ็กเพื่อดาวน์โหลด repo ที่จำเป็น เร็วกว่าสิ่งอื่นใด ดังนั้น Android Studio จะไม่บ่น แต่มันไม่สวยเลย...และเวลาสตาร์ท android studio ยาวมาก...

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