2016-08-31 43 views
7

Używam Androida Studio 2.2 Beta 3, a mój projekt testowy wykorzystuje CMake do zbudowania hybrydowej aplikacji C++ i Java. Interfejs JNI jest generowany przez SWIG. Oznacza to, że chciałbym wygenerować wrappery SWIG przed zewnętrznymi zadaniami gradacyjnymi NativeBuild i JavaCompile; to znaczy mój plik CMakeLists.txt określa plik opakowaniowy cpp generowany przez SWIG, a mój kod java importuje pliki opakowania Java wygenerowane przez SWIG.Problem z zamawianiem zadań Gradle w Androidzie Studio

Aby zapewnić SWIG jest prowadzony i generuje niezbędne pliki otoki przed wszelkimi zadaniami, I określa następujące w moim app pliku

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

/build.gradle Kiedy uruchomić z linii poleceń za pomocą polecenia

./gradlew assembleDebug 

nie napotkają żadnych problemów i zgodnie z oczekiwaniami moje zadanie „runSwig” biegnie zanim którykolwiek z pozostałych zadań

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

Ale problem jest, gdy projekt jest otwarty w Android Studio, wygląda zewnętrzny rodzimy build zostanie wywołana przed runSwig i pojawia się błąd

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. 

Błąd nie odejdzie dopóki nie albo zmontować za pomocą polecenia linii LUB, usuń plik wrap.cxx z mojego CMakeLists.txt i dodaj go ponownie po tym, jak swig zostanie uruchomiony co najmniej raz.

Odpowiedz

1

Tak, ponieważ Android Studio IDE potrzebuje, aby pliki zostały wyświetlone w IDE przed kompilacją: ujawniają różne zachowanie między wierszem poleceń a kompilacją IDE. W wersji here próbuję pobrać potrzebne repozytorium wcześniej niż cokolwiek innego, dlatego Android Studio nie będzie narzekać. Ale to nie jest ładne ... i długi czas uruchamiania Android Studio ...

0

Wpadłem na ten sam problem z kolejnością kompilacji w Android Studio 3 (i 2.3 chyba).

Nie wiem, czy jest to tradycyjnie ważne rozwiązanie, ale -seems- pracować w moim przykładzie Android/SWIG/NDK (tu: https://github.com/sureshjoshi/android-ndk-swig-example)

Dodałem to do mojego Gradle plik, tak CMake jest wywoływany, zanim kompilacja nie powiedzie się na brakujących plikach. CMake dzwoni do SWIG, aby automatycznie generować pliki Java i umieszczać je w odpowiedni sposób.

project.afterEvaluate { 
    javaPreCompileDebug.dependsOn externalNativeBuildDebug 
} 

pewnie też potrzebują

javaPreCompileRelease.dependsOn externalNativeBuildRelease 

lub coś podobnego ... Po prostu nie testowałem go jeszcze.

Wywołany z tego numeru: https://github.com/sureshjoshi/android-ndk-swig-example/issues/8