Jestem bardzo nowy w tej całej obsłudze Gradle i Android Studio. Udało mi się przekonwertować mój projekt na Androida do gradle przy użyciu opcji eksportu.
Ale szukam dokumentacji lub punktu wyjścia, jak zintegrować kompilację NDK z procesem budowania gradle.
Jeśli to możliwe, potrzebuję również jakiegoś etapu „po”, który kopiuje pliki binarne kompilacji (pliki .so) do katalogu zasobów.
android
android-ndk
gradle
android-studio
plaisthos
źródło
źródło
Odpowiedzi:
Udostępniliśmy pierwszą wersję integracji jako podgląd w 1.3: http://tools.android.com/tech-docs/android-ndk-preview
Integracja pozostanie podglądem nawet wtedy, gdy wersja 1.3 stanie się ostateczna. Brak aktualnego czasu ETA określającego, kiedy będzie ostateczny (od 2015/07/10).
Więcej informacji tutaj: http://tools.android.com/tech-docs/android-ndk-preview
źródło
AKTUALIZACJA: Android Studio z obsługą NDK jest już dostępne: http://tools.android.com/tech-docs/android-ndk-preview
Aby zbudować za pomocą skryptu, poniższe rozwiązanie gradle powinno działać:
Używam skryptu kompilacji i dodałem go do mojego pliku (wydaje się, że działa
0.8+
): Wydaje się, że jest to odpowiednik poniższego rozwiązania (ale wygląda ładniej w pliku gradle):Kompilacja niestety nie kończy się niepowodzeniem, jeśli katalog nie istnieje lub nie zawiera żadnych
.so
plików.źródło
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { it.jniFolders = [file("libs")] as Set }
. Dziękuję za pomoc!jni.srcDirs = [] //disable automatic ndk-build
jest bardzo ważna, ponieważ uniemożliwi Android Studio przebudowanie kodu źródłowego C / C ++. Próbowałem to rozgryźć przez dwa dni, aż zobaczyłem twój post i to rozwiązało mój problem. Naprawdę uważam, że kompilacja NDK jest lepsza oddzielnie budowana przez makefile wiersza poleceń Android.mk, a nie przez skrypt gradle, ponieważ C / C ++ było budowane przez Makefile od ponad 40 lat!Wraz z aktualizacją Android Studio do 1.0, obsługa łańcucha narzędzi NDK znacznie się poprawiła ( uwaga: przeczytaj moje aktualizacje na dole tego postu, aby zobaczyć użycie z nową eksperymentalną wtyczką Gradle i Android Studio 1.5 ).
Android Studio i NDK są wystarczająco dobrze zintegrowane, więc wystarczy utworzyć blok ndk {} w pliku build.gradle swojego modułu i ustawić pliki źródłowe w katalogu (module) / src / main / jni - i jesteś Gotowe!
Koniec z ndk-build z linii poleceń.
O tym wszystkim napisałem w moim poście na blogu tutaj: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
Najistotniejsze punkty to:
i umieść to w pliku build.gradle swojego modułu:
To jest proces kompilowania kodu w C ++, stamtąd musisz go załadować i utworzyć opakowania - ale sądząc po twoim pytaniu, już wiesz, jak to wszystko zrobić, więc nie będę ponownie haszował.
Umieściłem również repozytorium Github tego przykładu tutaj: http://github.com/sureshjoshi/android-ndk-swig-example
AKTUALIZACJA: 14 czerwca 2015 r
Kiedy pojawi się Android Studio 1.3, powinno być lepsze wsparcie dla C ++ poprzez wtyczkę JetBrains CLion. Obecnie zakładam, że pozwoli to na rozwój Java i C ++ z poziomu Android Studio; jednak myślę, że nadal będziemy musieli używać sekcji Gradle NDK, jak wspomniałem powyżej. Dodatkowo myślę, że nadal będzie potrzeba pisania plików opakowujących Java <-> C ++, chyba że CLion zrobi to automatycznie.
AKTUALIZACJA: 5 stycznia 2016 r
Zaktualizowałem swojego bloga i repozytorium Github (w gałęzi deweloperskiej), aby używać Androida Studio 1.5 z najnowszą eksperymentalną wtyczką Gradle (0.6.0-alpha3).
http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/ http://github.com/sureshjoshi/android-ndk-swig-example
Kompilacja Gradle dla sekcji NDK wygląda teraz następująco:
Co ciekawe, Android Studio ma funkcję autouzupełniania dla C ++ - otoki generowane przez Javę przy użyciu słowa kluczowego „natywny”:
Jednak nie jest to całkowicie różowe ... Jeśli używasz SWIG do pakowania biblioteki w celu automatycznego generowania kodu, a następnie spróbujesz użyć natywnego automatycznego generowania słowa kluczowego, umieści kod w niewłaściwym miejscu w twoim Swig _wrap Plik .cxx ... Musisz więc przenieść go do bloku „extern C”:
AKTUALIZACJA: 15 października 2017 r
Byłbym niedbały, gdybym nie wspomniał, że Android Studio 2.2 i nowsze wersje mają zasadniczo „natywne” (bez kalamburów) wsparcie dla łańcucha narzędzi NDK za pośrednictwem Gradle i CMake. Teraz, kiedy tworzysz nowy projekt, po prostu wybierz obsługę C ++ i gotowe.
Nadal będziesz musiał wygenerować własny kod warstwy JNI lub użyć techniki SWIG, o której wspomniałem powyżej, ale tworzenie szkieletów C ++ w projekcie na Androida jest teraz trywialne.
Zmiany w pliku CMakeLists (w którym umieszczasz swoje pliki źródłowe C ++) zostaną odebrane przez Android Studio i automatycznie przekompilują wszystkie powiązane biblioteki.
źródło
W Google IO 2015 Google ogłosił pełną integrację NDK w Android Studio 1.3.
Jest teraz poza podglądem i jest dostępny dla wszystkich: https://developer.android.com/studio/projects/add-native-code.html
Stara odpowiedź: Gradle automatycznie wywołuje,
ndk-build
jeśli maszjni
katalog w źródłach projektu.To działa na Android Studio 0.5.9 (wersja kanaryjska).
Pobierz NDK
Albo dodaj
ANDROID_NDK_HOME
do zmiennych środowiskowych lub dodajndk.dir=/path/to/ndk
do swojegolocal.properties
projektu Android Studio. Dzięki temu Android Studio może automatycznie uruchomić ndk.Pobierz najnowsze przykładowe projekty firmy Gradle aby zobaczyć przykład projektu ndk. (Są na dole strony). Dobry przykładowy projekt to
ndkJniLib
.Skopiuj
gradle.build
z przykładowych projektów NDK. Będzie wyglądać mniej więcej tak. Togradle.build
tworzy inny apk dla każdej architektury. Musisz wybrać architekturę, którą chcesz, korzystając zbuild variants
panelu.Pamiętaj, że spowoduje to zignorowanie plików Android.mk i Application.mk. Aby obejść ten problem, możesz powiedzieć gradle, aby wyłączył wywołanie atuomatic ndk-build, a następnie ręcznie określić katalog dla źródeł ndk.
Ponadto prawdopodobnie będziesz chciał jawnie wywołać ndk-build w swoim skrypcie budowania gradle, ponieważ właśnie wyłączyłeś automatyczne wywołanie.
źródło
tasks.all { task -> if (task.name.contains('Ndk')) task.enabled = false }
Znalazłem "gradle 1.11 com.android.tools.build:gradle:0.9.+" obsługuje teraz pre-build ndk, możesz po prostu umieścić * .so w katalogu src / main / jniLibs. podczas budowania gradle zapakuje ndk we właściwe miejsce.
oto mój projekt
źródło
Jak powiedział Xavier, możesz umieścić swoje prekompilowane pliki w / src / main / jniLibs /, jeśli używasz gradle 0.7.2+
zaczerpnięte z: https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/ctDp9viWaxoJ
źródło
Jak na razie (Android Studio v0.8.6) jest to dość proste. Oto kroki, aby utworzyć aplikację typu „Hello world”:
Pobierz Android NDK i umieść folder główny w jakimś rozsądnym miejscu - być może w tej samej lokalizacji co folder SDK.
Dodaj do swojego
local.properties
pliku:ndk.dir=<path-to-ndk>
Dodaj następujący kod do pliku build.gradle wewnątrz
defaultConfig
zamknięcia, zaraz poversionName
wierszu:ndk { moduleName="hello-world" }
W
main
katalogu modułu aplikacji utwórz nowy folder o nazwiejni
.W tym folderze utwórz plik o nazwie
hello-world.c
, który zobaczysz poniżej.Patrz przykład
Activity
poniższy kod na przykład, jak wywołać metodę (czy jest to funkcja?) Whello-world.c
.hello-world.c
MainActivity.java
build.gradle
Znajdź tutaj pełny kod źródłowy bardzo podobnej aplikacji (bez NDK).
źródło
Java_me_mattlogan_ndktest_MainActivity_stringFromJNI
na własną :)Jeśli używasz Uniksa, najnowsza wersja (0.8) dodaje ndk-build. Oto jak to dodać:
Oczekuje, że znajdzie JNI w 'src / main / jni', w przeciwnym razie możesz go zdefiniować za pomocą:
Od 28 stycznia 2014 r. Z wersją 0.8 kompilacja nie działa w systemie Windows, musisz wyłączyć kompilację za pomocą:
źródło
Eleganckie obejście jest pokazane na https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J .
Zasadniczo tworzysz jar, który zawiera „lib / armeabi / yourlib.so”, a następnie dołączasz go do kompilacji.
źródło
ndk-build
, generuje.jar
S dla każdego.so
i umieszcza je w ścieżki budowania Gradle do złagodzić ten ból. Sprawdź to.Dobra odpowiedź, automatyzująca pakowanie łatwo skompilowanych
.so
-plików, znajduje się w innym (zamkniętym) wątku . Aby to zadziałało, musiałem zmienić linię:w:
Bez tej zmiany
.so
pliki nie zostałyby znalezione, a zatem zadanie ich pakowania nigdy by się nie uruchomiło.źródło
Odpowiedź od @plaisthos zepsuła się w najnowszej wersji gradle, ale wciąż jest na to sposób. Stwórz
native-libs
katalog w katalogu głównym swojego projektu i skopiuj wszystkie nasze biblioteki do tego katalogu.Dodaj następujące wiersze do pliku build.gradle. Buduj i bądź szczęśliwy.
źródło
To jest kod, którego używam do budowania za pomocą android-ndk z gradle. W tym celu dodaj ścieżkę do katalogu ndk w
gradle.properties
ie. dodawaćndkdir=/home/user/android-ndk-r9d
i umieścić wszystkie pliki w folderze JNInative
wsrc/main/
jak widać kod pisał poniżej. Utworzy jar z natywnymi bibliotekami, których możesz używać normalnie, jak wSystem.loadLibrary("libraryname");
źródło
Użyłem następującego kodu do skompilowania natywnych bibliotek Dropbox, używam Android Studio v1.1.
źródło
Użyłem
ndk.dir=/usr/shareData/android-ndk-r11b
// ścieżkę NdKw local.properties plik w android projekt studyjny. i dodaj tę linię:
android.useDeprecatedNdk=true
w pliku gradle.properties w projekcie Android Studio.
Więcej informacji tutaj: http://tools.android.com/tech-docs/android-ndk-preview
źródło
Aby rozwinąć to, co powiedział Naxos (Dzięki Naxos za wysłanie mnie we właściwym kierunku!), Nauczyłem się sporo z niedawno wydanych przykładów NDK i zamieściłem odpowiedź w podobnym pytaniu tutaj.
Jak skonfigurować NDK z wtyczką Android Gradle 0.7
Ten post zawiera szczegółowe informacje na temat łączenia gotowych bibliotek natywnych z aplikacją dla różnych architektur, a także informacje o tym, jak dodać obsługę NDK bezpośrednio do skryptu build.gradle. W większości przypadków nie musisz już wykonywać żadnych czynności związanych z zipem i kopiowaniem.
źródło
Oto kroki, które wykonałem, aby NDK działał w moim projekcie Android Studio. Użyłem tego samouczka, aby mi pomóc https://software.intel.com/en-us/videos/using-the-ndk-with-android-studio
Aby używać NDK, musisz dodać wiersz NDK do local.properties. Więc pod twoim sdk.dir dodaj
W moich aplikacjach build.gradle mam następujący kod
nazwa modułu to nazwa, którą chcesz nadać swojemu natywnemu kodowi. Wierzę, że tak będzie się nazywała biblioteka współdzielona. ldLibs pozwala mi zalogować się do LogCat, stl to plik STL, który chcesz zaimportować. Istnieje wiele opcji, takich samych jak Eclipse NDK. ( http://www.kandroid.org/ndk/docs/CPLUSPLUS-SUPPORT.html )
cFlagi to dla mnie nadal pewna ilość czarnej magii. Nie znalazłem dobrego źródła dla wszystkich opcji i tego, co mi dają. Przeszukaj StackOverflow w poszukiwaniu wszystkiego, czego potrzebujesz, to jest tam, gdzie to znalazłem. Wiem, że c ++ 11 pozwala mi używać nowego standardu c ++ 11.
Oto przykład, jak loguję się do LogCat z kodu natywnego
źródło
skonfiguruj projekt w android studio z eclipse: musisz zaimportować projekt eclipse ndk do android studio bez eksportowania do gradle i działa, musisz również dodać ścieżkę ndk w local.properties , jeśli wyświetla błąd, dodaj
w pliku build.gradle , a następnie utwórz folder jni i plik za pomocą terminala i uruchom go
źródło
Teraz, gdy Android Studio jest w stabilnym kanale, uruchomienie próbek android-ndk jest całkiem proste . Te przykłady używają eksperymentalnej wtyczki ndk i są nowsze niż te, do których linki znajdują się w dokumentacji online systemu Android NDK. Gdy już wiesz, że działają, możesz przestudiować pliki build.gradle, local.properties i gradle-wrapper.properties i odpowiednio zmodyfikować projekt. Oto kroki, które pozwolą im działać.
Przejdź do ustawień, Wygląd i zachowanie, Ustawienia systemu, Android SDK, wybierz kartę Narzędzia SDK i sprawdź Android NDK w wersji 1.0.0 u dołu listy. Spowoduje to pobranie NDK.
Wskaż lokalizację nowo pobranego NDK. Zauważ, że zostanie on umieszczony w katalogu sdk / ndk-bundle. Zrób to, wybierając plik, strukturę projektu, lokalizację zestawu SDK (po lewej) i podając ścieżkę w lokalizacji Android NDK. To doda wpis ndk do local.properties podobny do tego:
Z powodzeniem zbudowałem i wdrożyłem wszystkie projekty w repozytorium w ten sposób, z wyjątkiem gles3gni, natywnego kodeka i kreatora. Używam następujących:
Android Studio 1.3 kompilacja AI-141.2117773
próbki android -ndk opublikowane 28 lipca 2015 r. (Link powyżej)
SDK Tools 24.3.3
NDK r10e wyodrębniony do C: \ Android \ sdk \ ndk-bundle Wtyczka
Gradle 2.5
Gradle 0.2.0
Windows 8.1 64 bit
źródło
NDK Builds i Gradle (podstawowe)
Generalnie budowanie za pomocą NDK jest tak proste, jak prawidłowe określenie ścieżki ndkBuild do Android.mk lub ścieżki cmake do CMakeLists.txt. Polecam CMake zamiast starszego Android.mk, ponieważ obsługa C / C ++ w Android Studio jest oparta na CLion i używa CMake jako formatu projektu. Z mojego doświadczenia wynika, że powoduje to, że IDE jest bardziej responsywne w przypadku większych projektów. Wszystko skompilowane w twoim projekcie zostanie automatycznie zbudowane i skopiowane do APK.
Dodawanie gotowych bibliotek do projektu (zaawansowane)
Biblioteki statyczne (.a) w twojej kompilacji NDK zostaną automatycznie uwzględnione, ale wstępnie skompilowane biblioteki dynamiczne (.so) będą musiały zostać umieszczone w
jniLibs
. Można to skonfigurować za pomocąsourceSets
, ale należy przyjąć standard. NIE POTRZEBUJESZ żadnych dodatkowych poleceń w programiebuild.gradle
gdy dołączasz wstępnie skompilowane biblioteki.Układ
jniLibs
Więcej informacji na temat struktury można znaleźć w Podręczniku użytkownika wtyczki Android Gradle .
Następnie możesz sprawdzić, czy wynikowy pakiet APK zawiera Twoje pliki .so, zwykle pod
build/outputs/apk/
, używającunzip -l myApp.apk
do wyświetlenia zawartości.Budowanie bibliotek współdzielonych
Jeśli tworzysz bibliotekę współdzieloną w NDK, nie musisz nic więcej robić. Zostanie poprawnie dołączony do pakietu APK.
źródło
Po prostu dodaj te linie do aplikacji
build.gradle
źródło
teraz mogę załadować taki sukces!
1. dodaj plik .so do tej ścieżki
| --src | - | --main | - | - | --java | - | - | --jniLibs | - | - | - | --armeabi | - | - | - | - | -. so pliki
2. dodaj ten kod do gradle.build
}
3.
System.loadLibrary("yousoname");
źródło
Jeśli twój projekt został wyeksportowany z eclipse, dodaj poniższe kody w pliku gradle :
2.Jeśli tworzysz projekt w Android Studio:
utwórz folder o nazwie jniLibs w src / main / , i umieść swoje pliki * .so w folderze jniLibs.
I skopiuj kod jak poniżej w swoim pliku gradle :
źródło
Chociaż uważam, że SJoshi (wyrocznia) ma najbardziej kompletną odpowiedź, projekt SWIG jest przypadkiem specjalnym, interesującym i użytecznym, ale nie uogólnionym dla większości projektów, które dobrze sobie radziły ze standardowymi projektami opartymi na SDK mrówek. NDK. Wszyscy chcielibyśmy teraz najprawdopodobniej używać Android Studio lub chcieć bardziej przyjaznego dla CI narzędzia do budowania dla urządzeń mobilnych, który teoretycznie oferuje gradle.
Opublikowałem moje podejście, pożyczone skądś (znalazłem to na SO, ale zamieściłem streszczenie aplikacji build.gradle: https://gist.github.com/truedat101/c45ff2b69e91d5c8e9c7962d4b96e841 ). Krótko mówiąc, polecam:
Gradle na Androida był moim zdaniem bałaganem, ponieważ podobają mi się zapożyczone koncepcje mavena i uparta struktura katalogów dla projektu. Ta funkcja NDK jest „dostępna wkrótce” od prawie 3 lat.
źródło