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!
źródło
X
katalog android-ndk-r5 \ build \ platform \ android- \ arch-arm \ usr \ include - czyvector
naprawdę tam jest?Odpowiedzi:
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 :
#include <string.h> #include <jni.h> #include <android/log.h> #include <iostream> #include <vector> #define LOG_TAG "hellojni" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #ifdef __cplusplus extern "C" { #endif // Comments omitted. void Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { std::vector<std::string> vec; // Go ahead and do some stuff with this vector of strings now. } #ifdef __cplusplus } #endif
Jedyne, co mnie tu gryzie, to #ifdef __cplusplus.
Obejrzyj katalogi.
Aby skompilować, użyj
ndk-build clean && ndk-build
.źródło
Android NDK: You might want to use $NDK/build/tools/build-stlport.sh
. UWAGA: to nie działa pod cygwinJeś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:
android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.domain.app" minSdkVersion 15 targetSdkVersion 21 versionCode 1 versionName "1.0" ndk { moduleName "myModuleName" stl "stlport_shared" } } }
źródło
stlport_shared
a niestlport_static
?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:
model { ... android.ndk { moduleName = "gl2jni" cppFlags.add("-Werror") ldLibs.addAll(["log", "GLESv2"]) stl = "gnustl_shared" // <-- this is the line that I added } ... }
źródło
gnustl_shared
zamiastgnustl_static
?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?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:
fatal error: map: No such file or directory fatal error: vector: No such file or directory
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.
źródło
Dodam trochę do odpowiedzi Sebastiana Rotha.
Twój projekt można skompilować za pomocą
ndk-build
wiersza 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ędnieniaKliknij przycisk Tak, gdy pojawi się okno dialogowe.
Przed
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 .
źródło
Jeśli używasz ndk r10c lub nowszego, po prostu dodaj APP_STL = c ++ _ static do Application.mk
źródło
Oto, co spowodowało problem w moim przypadku (
CMakeLists.txt
):set (CMAKE_CXX_FLAGS "...some flags...")
Sprawia, że wszystkie wcześniej zdefiniowane katalogi include stają się niewidoczne. Po usunięciu / refaktoryzacji tej linii wszystko działa dobrze.
źródło
W Android NDK przejdź do android-ndk-r9b> / sources / cxx-stl / gnu-libstdc ++ / 4.X / include in Linux machine
Znalazłem rozwiązanie z poniższego linku http://osdir.com/ml/android-ndk/2011-09/msg00336.html
źródło