2011-01-11 3 views
13

Sto cercando di utilizzare l'NDK 5 pieno C gnustl ++:Android NDK R5 e il supporto di C++ eccezione

I CPLUSPLUS-SUPPORT.html stati:

La toolchain NDK supporta eccezioni C++, dal momento che NDK R5, ma tutti Le origini C++ sono compilate con il supporto -fno-exceptions per impostazione predefinita, per i motivi di compatibilità con le versioni precedenti.

Per abilitarlo, utilizzare il flag del compilatore C++ '-fexceptions'. Questo può essere fatto aggiungendo quanto segue a ogni definizione modulo nel Android.mk:

LOCAL_CPPFLAGS += -fexceptions 

Più semplicemente, aggiungere una sola riga al vostro Application.mk, l'impostazione applicherà automaticamente a NDK di tutto il progetto moduli:

APP_CPPFLAGS += -fexceptions 

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

Questa directory co conserva le intestazioni e i binari precompilati per l'implementazione della libreria di modelli standard C++ libstdC++ - v3 di GNU GNU.

Questi sono generati dalle origini della toolchain dallo script rebuild-all-prebuilt.sh in build/tools.

Per utilizzarlo, definire APP_STL su "gnustl_static" in Application.mk. Vedere i documenti/CPLUSPLUS-SUPPORT.html per ulteriori dettagli.

Questa implementazione supporta pienamente le eccezioni C++ e RTTI.

Ma tutti i tentativi che utilizzano eccezioni non riescono. Un NDK alternativo esiste su http://www.crystax.net/android/ndk-r4.php. L'utilizzo dell'esempio ciao-jni da quell'NDK non funziona. Compliation con NDK 5 opere dopo la creazione di un Application.xml con

APP_STL := gnustl_static 

Impostazione APP_STL a gnustl_static anche abilita automaticamente -frtti e -fexceptions. Ma muore la stessa morte orribile dei miei esperimenti.

sono riuscito a ottenere un esempio minimo di codice che viene blocca per me:

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 che mi manca qualcosa o è l'affermazione nel README e CPLUSPLUS-SUPPORT.html semplicemente sbagliato?

+0

Non hai detto che cosa il vostro fallimento è, quindi è difficile aiutare; Eccezioni, RTTI e static_gnustl funzionano per me su NDK-r5. – grrussel

+0

Ho aggiunto un esempio che si blocca. – plaisthos

+0

Richiamare il comando ndk_build con l'argomento V = 1 e vedrete i comandi dati per creare e collegare. Sei sicuro che l'arresto sia dovuto a delle eccezioni? – grrussel

risposta

8

Si scopre che le eccezioni funzionano ma solo se l'eccezione è ereditata da std :: exception. Nel mio caso la gerarchia di eccezioni non includeva sempre std :: exception che ha rotto il catch/throw. Curiosamente le stringhe di lancio come eccezioni funzionano quando compilate per x86/Mac OS. Ho risolto il problema modificando le eccezioni che uso.

+2

L'uso di tipi non derivati ​​da std :: exception in C++ è abbastanza legale, quindi non è sorprendente che funzioni su OSX. Il codebase su cui lavoro genera gli interi come eccezioni e funziona su Android. – grrussel

+1

L'ndk viene fornito con versioni individuali di stdC++, uno se fornisce l'implementazione di gnu: quando collego /android-ndk-r5b/sources/cxx-stl/gnu-libstdc++/libs/armeabi/libstdc++.a in modo esplicito, il problema è andato. Ma sono sicuro che c'è un modo più semplice. – paniq

1

Per quanto ne so, Android NDK non ha mai supportato eccezioni. libstdC++ stesso supporta le eccezioni, ma quando compilato per Android, il supporto delle eccezioni è disattivato (grep per "-fno-exceptions").

Vedere this thread nella mailing list di Android ndk.

+2

Supporto per eccezioni/rtti ist nuovo con la versione r5. Secondo le modifiche e il README di gnustl dovrebbe essere supportato. – plaisthos

+0

http://developer.android.com/sdk/ndk/index.html ha ancora "Eccezioni C++ e RTTI non sono supportate nell'implementazione STL predefinita." nella sezione delle note generali. Dove hai visto che hanno aggiunto il supporto per le eccezioni abilitato in r5? E sì, l'implementazione della libreria standard che usano supporta le eccezioni, tuttavia, quando la compilano per Android, disabilitano esplicitamente le eccezioni. (O almeno avere fino a r4) –

+0

Ora che sto rileggendo questo, quando hai provato il crystax ndk, hai fatto la compilazione completa di libstdC++ con la loro patch e poi link hello-jni contro quel libstdC++, o fatto usi semplicemente il codice in hello-jni e lo colleghi al libstdC++ predefinito? Il primo dovrebbe darti pieno supporto alle eccezioni; quest'ultimo morirà in modo orribile. –

7

Gli strumenti NDK-r5 supportano l'utilizzo di eccezioni e RTTI in codice C++. L'uso di un STL diverso da GNU STL come libreria statica non è, tuttavia, supportato, in presenza di RTTI o eccezioni.

L'STLport fornito non è utilizzabile insieme alle eccezioni o RTTI.

Si noti che potrebbe essere necessario pulire gli oggetti di compilazione durante lo scambio tra le implementazioni STL.

+0

Non hai letto correttamente la domanda. – paniq

+1

La domanda chiede se l'istruzione della documentazione NDK sul supporto per le eccezioni è errata; non è. – grrussel

+3

In questo caso non ho letto correttamente la risposta. – paniq

1

Ho un problema simile con JNI. Tutte le eccezioni generate da un metodo JNI stanno causando un errore SIGILL sotto Android 1.6 e 2.1. Va bene che lavorano sotto Android 2.2 +

Vedere il mio problema (per favore non esitate a votare per esso o pubblicare un commento):

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

Quindi, attualmente, Android 1.6 e 2.1 non lo fanno supporta le eccezioni dai metodi JNI con l'ultimo NDK.

Forse potrebbe essere risolto in una versione futura NDK ...