Nie można dołączyć nagłówków C ++, takich jak vector, w Android NDK

84

Kiedy próbuję dołączyć dowolną klasę C ++, taką jak wektor, do mojego projektu Android NDK (używając NDK r5b, najnowszego), pojawia się błąd podobny do następującego ...

Compile++ thumb : test-libstl <= test-libstl.cpp /Users/nitrex88/Desktop/Programming/EclipseProjects/STLTest/jni/test-libstl.cpp:3:18: error: vector: No such file or directory

Inne osoby, które zgłosiły ten problem w Internecie, odniosły sukces, dodając

APP_STL := stlport_static

do ich pliku Application.mk. Zrobiłem to, a także wypróbowałem każdą inną możliwą wartość dla APP_STL. Wyczyściłem projekt, uruchomiłem ndk-build clean, usunąłem foldery obj i libs, a mimo to, kiedy kompiluję, nie mogę znaleźć klasy wektorowej. Pracuję nad tym od kilku tygodni (odkąd wyszedł NDK r5) i byłbym wdzięczny, gdyby ktoś miał jakąś radę. Dzięki!

Nitrex88
źródło
2
Po pierwsze, sprawdź Xkatalog android-ndk-r5 \ build \ platform \ android- \ arch-arm \ usr \ include - czy vectornaprawdę tam jest?
Seva Alekseyev
2
Nie, nie jest! Niewiele wiem o tym, jak działa NDK poza używaniem JNI i kompilacją źródeł. Jak mogę uzyskać wektor, aby tam był? Widzę wektor w android-ndk-r5b / sources / cxx-stl / stlport / stlport, jeśli to coś znaczy. Dzięki za szybką odpowiedź i naprawdę to doceniam!
Nitrex88
2
@seva Więc próbowałem uruchomić kilka narzędzi do odbudowy toolchain i prekompilowanych plików (pliki .sh w folderze narzędzi NDK) i nadal nie mogłem uruchomić nagłówków STL. Jeśli pobiorę NDK świeżo ze strony Androida, czy wszystko nie powinno po prostu działać? Próbowałem i nowe pobieranie niczego nie zmienia. Masz więcej informacji na temat sprawy, którą możesz zaoferować?
Nitrex88
[tak skonfigurowałem STLPort do pracy z Androidem Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian
[tak skonfigurowałem STLPort do pracy z Androidem Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian

Odpowiedzi:

121

To jest możliwe. Oto kilka kroków po kroku:

W katalogu $ PROJECT_DIR / jni / Application.mk :

Próbowałem użyć stlport_shared, ale bez powodzenia. To samo z libstdc ++.

W katalogu $ PROJECT_DIR / jni / Android.mk :

Nic specjalnego, ale upewnij się, że pliki mają format .cpp .

W katalogu $ PROJECT_DIR / jni / hello-jni.cpp :

Jedyne, co mnie tu gryzie, to #ifdef __cplusplus.

Obejrzyj katalogi.

Aby skompilować, użyj ndk-build clean && ndk-build.

Sebastian Roth
źródło
5
Dziękuję dziękuję!! W końcu rozwiązałeś mój problem. Okazuje się, że moja Application.mk znalazła się w złym miejscu! Miałem go w folderze projektu, ale nie w folderze JNI (nie jestem pewien, dlaczego, ale odkąd zacząłem programowanie dla Androida, zawsze myślałem, że tam trafił). Widząc, że umieszczasz ścieżkę Application.mk w folderze jni, uświadomiłem sobie. Dzięki i otrzymujesz nagrodę!
Nitrex88
2
Samo utworzenie niezbędnego pliku Application.mk rozwiązało problem, ale widzę komunikat Android NDK: You might want to use $NDK/build/tools/build-stlport.sh. UWAGA: to nie działa pod cygwin
Someone Somewhere
witam, jestem w stanie zbudować aplikację wykorzystującą wektor.
CoDe
witam, dodałem APP_STL: = stlport_static w pliku Application.mk i działa dla mojej aplikacji, ale ta sama aplikacja, którą umieszczam w Android Source, tutaj wyświetla mi błąd „Nie znaleziono klasy wektorowej ..” podczas kompilacji kodu. Pls zasugeruj, że ktoś ma o tym pojęcie.
CoDe
1
Być może możesz przesłać próbkę swojego projektu na github i udostępnić adres URL, wtedy moglibyśmy rzucić okiem.
Sebastian Roth
20

Jeśli korzystasz z Android Studio i nadal widzisz komunikat „error: vector: nie ma takiego pliku lub katalogu” (lub inne błędy związane z STL) podczas kompilowania przy użyciu ndk, to może ci pomóc.

W swoim projekcie otwórz plik build.gradle modułu (nie build.grade twojego projektu, ale ten, który jest przeznaczony dla twojego modułu) i dodaj „stl" stlport_shared "” w elemencie ndk w defaultConfig.

Na przykład:

rlcoder
źródło
1
Dlaczego stlport_shareda nie stlport_static?
Igor Ganapolsky
9

Używam Android Studio i od 19 stycznia 2016 roku to załatwiło sprawę. (Wygląda na to, że zmienia się co roku)

Idź do: app -> Gradle Scripts -> build.gradle (Module: app)

Następnie pod modelem {... android.ndk {... i dodaj wiersz: stl = "gnustl_shared"

Lubię to:

kynnysmatto
źródło
Hej, mam ten problem z ffmpeg, właściwie kompilacja ndk działa dobrze i pomyślnie generuje pliki .so, ale brakuje plików nagłówkowych. Czy masz o tym jakiś pomysł? (Używam Android Studio z eksperymentalną wtyczką
Gradle
To z wtyczką gradle-experimental?
Sebastian Roth,
Dlaczego gnustl_sharedzamiast gnustl_static?
Igor Ganapolsky
Działa, myślę, że to powinno być wybrane jako odpowiedź.
Vishnudev K,
Próbowałem tego z najnowszym Androidem Studio 2.1.3 i wydaje się, że nie działa. Aby to przetestować, wziąłem przykładową aplikację HelloJNI, przemianowałem hello-jni.c na .cpp i dodałem do niego #include <vector>. fatal error: 'vector' file not found #include <vector>Pojawia się błąd: Czy po dodaniu stl = "gnustl_static" lub "gnustl_shared" do pliku gradle modułu konieczne są dodatkowe kroki?
SideLobe
4

Nawet Sebastian udzielił tam dobrej odpowiedzi jeszcze 3 lata temu, nadal chciałbym podzielić się tutaj nowym doświadczeniem, na wypadek, gdybyś napotkał ten sam problem co ja w nowej wersji ndk.

Mam błąd kompilacji taki jak:

Moje środowisko to android-ndk-r9d i adt-bundle-linux-x86_64-20140702. Dodaję plik Application.mk do tego samego folderu jni i wstawiam jedną (i tylko jedną) linię:

Ale niestety nie rozwiązuje to mojego problemu! Aby rozwiązać ten problem, muszę dodać te 3 linie do Android.mk:

I widziałem tutaj dobre udostępnianie , które mówi, że „preferowane jest 'stlport_shared'”. Może więc lepszym rozwiązaniem jest użycie stlport jako biblioteki współdzielonej zamiast statycznej. Wystarczy dodać następujące wiersze do Android.mk, a następnie nie trzeba dodawać pliku Application.mk.

Mam nadzieję, że to jest pomocne.

Gary
źródło
Żeby było jasne, kiedy mówisz „ten sam folder jni”, masz na myśli folder jni projektu Androida? Chcę się upewnić, że nie ma innej lokalizacji, o której powinienem wiedzieć. uwaga boczna: ten dobry link do udostępniania jest teraz martwy :(
Hunter-Orionnoir
4

Dodam trochę do odpowiedzi Sebastiana Rotha.

Twój projekt można skompilować za pomocą ndk-buildwiersza poleceń po dodaniu kodu, który opublikował Sebastian. Ale jeśli chodzi o mnie, w Eclipse były błędy składniowe i nie miałem uzupełniania kodu.

Zwróć uwagę, że Twój projekt musi zostać przekonwertowany na projekt C / C ++.

Jak przekonwertować projekt C / C ++

Aby rozwiązać ten problem, kliknij prawym przyciskiem myszy projekt, kliknij opcję Właściwości

Wybierz C / C ++ Ogólne -> Ścieżki i symbole i dołącz katalogi${ANDROID_NDK}/sources/cxx-stl/stlport/stlport do uwzględnienia

Kliknij przycisk Tak, gdy pojawi się okno dialogowe.

Dialog

Przed

Przed

Po

Po

Aktualizacja nr 1

GNU C. Dodaje katalogi, odbudowuje. Tam nie będzie żadnych błędów w C plików źródłowych
GNU C ++. Dodaj katalogi, odbuduj. W plikach źródłowych CPP nie będzie żadnych błędów .

Maksim Dmitriev
źródło
3

Jeśli używasz ndk r10c lub nowszego, po prostu dodaj APP_STL = c ++ _ static do Application.mk

clark.li
źródło
1

Oto, co spowodowało problem w moim przypadku ( CMakeLists.txt):

Sprawia, że ​​wszystkie wcześniej zdefiniowane katalogi include stają się niewidoczne. Po usunięciu / refaktoryzacji tej linii wszystko działa dobrze.

Fedorov7890
źródło