2011-01-11 24 views
13

Próbuję użyć NDK 5 karta C++ gnustl:Android NDK R5 i wsparcie C++ wyjątek

W CPLUSPLUS-SUPPORT.html Zjednoczone:

NDK toolchain obsługuje wyjątków C++ od NDK R5, jednak wszystko Źródła C++ są kompilowane domyślnie z opcją -fno-wyjątków, z powodów związanych z kompatybilnością z poprzednimi wersjami w odniesieniu do .

Aby go włączyć, użyj flagi kompilatora C++ "-exception". Można to zrobić przez dodanie następujących do każdej definicji modułu w Twoim Android.mk:

LOCAL_CPPFLAGS += -fexceptions 

prościej dodać jedną linię do Application.mk, ustawienie automatyczne zastosowanie do NDK wszystkie Twoje projektu moduły:

APP_CPPFLAGS += -fexceptions 

sources/cxx-stl/gnu-libstdc++/README Zjednoczone:

To co katalog zawiera nagłówki i wstępnie skompilowane pliki binarne dla implementacji standardowej biblioteki szablonów GNU libstdC++ - v3 C++ Standard C++.

Są one generowane ze źródeł toolchain przez skrypt rebuild-all-prebuilt.sh w kompilacji/narzędziach.

Aby z niego skorzystać, zdefiniuj APP_STL na "gnustl_static" w pliku Application.mk. Aby uzyskać więcej informacji, zobacz dokumentację/CPLUSPLUS-SUPPORT.html.

Ta implementacja w pełni obsługuje wyjątki C++ i RTTI.

Jednak wszystkie próby użycia wyjątków kończą się niepowodzeniem. Alternatywny NDK istnieje pod adresem http://www.crystax.net/android/ndk-r4.php. Korzystanie z przykładu hello-jni z tego NDK nie działa. Compliation z NDK 5 utworów po utworzeniu Application.xml z

APP_STL := gnustl_static 

Ustawianie APP_STL do gnustl_static również automatycznie włącza -frtti i -fexceptions. Ale umiera ta sama straszliwa śmierć jak moje własne eksperymenty.

udało mi się uzyskać minimalny przykład kodu, który jest dla mnie upaść:

try { 
    __android_log_write(ANDROID_LOG_DEBUG,"foobar","trhown!"); 
    throw "Wrong object type."; 
} catch (char* b) { 
    __android_log_write(ANDROID_LOG_DEBUG,"foobar","catched!"); 
} 

Am ja czegoś brakuje lub jest oświadczenie w README i CPLUSPLUS-SUPPORT.html po prostu źle?

+0

Nie powiedział, co się awaria jest, więc trudno, aby pomóc; Wyjątki, RTTI i static_gnustl działają dla mnie w NDK-r5. – grrussel

+0

Dodałem przykład, który zawiesza się. – plaisthos

+0

Wywołaj polecenie ndk_build z argumentem V = 1, a zobaczysz polecenia do kompilacji i linkowania. Czy na pewno przyczyną awarii są wyjątki? – grrussel

Odpowiedz

8

Okazuje się, że wyjątki działają, ale tylko wtedy, gdy wyjątek jest dziedziczony ze std :: exception. W moim przypadku hierarchia wyjątków nie zawsze zawierała wyjątek std ::, który przerwał chwyt/rzut. Co ciekawe, rzucanie ciągów jako wyjątki działa po skompilowaniu dla x86/Mac OS. Rozwiązałem mój problem, modyfikując wyjątki, których używam.

+2

Użycie typów nie pochodzących z std :: exception w C++ jest dość legalne, więc nie jest to zaskakujące, że działa na OSX. Baza kodu, nad którą pracuję, wyrzuca liczby całkowite jako wyjątki i działa w systemie Android. – grrussel

+1

The ndk zawiera indywidualne wersje stdC++, z których jeden zapewnia implementację gnu: gdy połączę się z /android-ndk-r5b/sources/cxx-stl/gnu-libstdc++/libs/armeabi/libstdc++.a jawnie, problem zniknął. Ale jestem pewien, że jest łatwiejszy sposób. – paniq

1

O ile mi wiadomo, Android NDK nigdy nie obsługiwał wyjątków. libstdC++ sam obsługuje wyjątki, ale po skompilowaniu dla Androida obsługa wyjątków jest wyłączona (grep dla "-fno-wyjątków").

Zobacz this thread na liście dyskusyjnej android ndk.

+2

Obsługa wyjątków/rtti ist new z wersją r5. Zgodnie ze zmianami i README z gnustl powinno być obsługiwane. – plaisthos

+0

http://developer.android.com/sdk/ndk/index.html nadal ma "Wyjątki C++ i RTTI nie są obsługiwane w domyślnej implementacji STL." w dziale uwag ogólnych. Skąd wiesz, że dodali obsługę wyjątków w wersji r5? I tak, standardowa implementacja biblioteki, z której korzystają, obsługuje wyjątki, jednak gdy kompilują je dla Androida, wyłączają wyraźnie wyjątki. (Lub przynajmniej mieć maksymalnie przez R4) –

+0

Teraz jestem ponownie czytając to, kiedy próbowaliśmy NDK crystax, robiłeś pełną kompilację libstdC++ z ich plastra, a następnie połączyć hello-JNI przeciwko tej libstdC++, czy też po prostu używasz kodu w hello-jni i łączysz go z domyślnym libstdC++? Ten pierwszy powinien zapewniać pełną obsługę wyjątków; ten drugi umrze okropnie. –

7

Narzędzia NDK-r5 obsługują wykorzystanie wyjątków i RTTI w kodzie C++. Używanie STL innego niż GNU STL jako biblioteki statycznej nie jest jednak obsługiwane w obecności RTTI lub wyjątków.

STLport dostarczane nie nadaje się do użytku wraz z wyjątkami lub RTTI.

Należy pamiętać, że może być konieczne wyczyszczenie obiektów kompilacji podczas zamiany między implementacjami STL.

+0

Nie przeczytałeś poprawnie pytania. – paniq

+1

Pytanie dotyczy pytania, czy dokumentacja NDK na temat obsługi wyjątków jest błędna; nie jest. – grrussel

+3

W tym przypadku nie przeczytałem poprawnie odpowiedzi. – paniq

1

mam podobny problem przy użyciu JNI. Wszystkie wyjątki generowane z metody JNI powodują błąd SIGILL w systemie Android 1.6 i 2.1. To dobrze działa pod Androidem 2.2 i nowszym

Zobacz mój problem (proszę nie wahaj się do głosowania na niego lub skomentować):

http://code.google.com/p/android/issues/detail?id=20176

więc obecnie, Android 1.6 i 2.1 nie obsługuje wyjątki z metod JNI z ostatnim NDK.

Może to być ustalone w przyszłym wydaniu NDK ...