2011-01-11 6 views
13

Estoy tratando de utilizar el NDK 5 completa C++ gnustl:Android NDK R5 y el apoyo de C++ excepción

Los CPLUSPLUS-SUPPORT.html estados:

La cadena de herramientas NDK es compatible con excepciones de C++, ya que NDK R5, sin embargo todos Las fuentes de C++ se compilan con soporte -fno-exceptions de forma predeterminada, para razones de compatibilidad con versiones anteriores.

Para habilitarlo, utilice el indicador del compilador C++ '-fexceptions'. Esto se puede hacer añadiendo lo siguiente a cada definición de módulo en su Android.mk:

LOCAL_CPPFLAGS += -fexceptions 

Más simplemente, añadir una sola línea a su Application.mk, el ajuste se aplicará automáticamente a NDK todo de su proyecto módulos:

APP_CPPFLAGS += -fexceptions 

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

Este directorio co contiene los encabezados y los binarios precompilados para la implementación de la biblioteca de plantillas estándar de GNU libstdC++ - v3 C++ .

Estos se generan a partir de las fuentes de toolchain mediante el script rebuild-all-prebuilt.sh en construcción/herramientas.

Para usarlo, defina APP_STL a 'gnustl_static' en su Application.mk. Consulte docs/CPLUSPLUS-SUPPORT.html para obtener más detalles.

Esta implementación es totalmente compatible con las excepciones C++ y RTTI.

Pero todos los intentos que utilizan excepciones fallan. Existe un NDK alternativo en http://www.crystax.net/android/ndk-r4.php. Usar el ejemplo de hello-jni de ese NDK no funciona. Compliation con NDK 5 obras después de la creación de un Application.xml con

APP_STL := gnustl_static 

Configuración APP_STL a gnustl_static también permite automáticamente -frtti y -fexceptions. Pero muere la misma muerte horrible que mis propios experimentos.

he logrado obtener una mínima ejemplo de código que se estrellaba para mí:

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 me falta algo o es el estado en el README y CPLUSPLUS-SUPPORT.html simplemente mal?

+0

No has dicho lo que su fracaso es, así que es difícil para ayudar; Excepciones, RTTI y static_gnustl funcionan para mí en NDK-r5. – grrussel

+0

Agregué un ejemplo que falla. – plaisthos

+0

Invoque el comando ndk_build con el argumento V = 1 y verá los comandos dados para compilar y vincular. ¿Estás seguro de que el bloqueo se debe a excepciones? – grrussel

Respuesta

8

Resulta que las excepciones funcionan pero solo si la excepción se hereda de std :: exception. En mi caso, la jerarquía de excepciones no siempre incluía std :: exception, que rompió el catch/throw. Curiosamente, las cadenas de lanzamiento funcionan como excepciones cuando se compilan para x86/Mac OS. He solucionado mi problema modificando las excepciones que uso.

+2

El uso de tipos no derivados de std :: exception en C++ es bastante legal, por lo que no es sorprendente que funcione en OSX. La base de código en la que trabajo arroja enteros como excepciones, y funciona en Android. – grrussel

+1

El ndk viene con versiones individuales de stdC++, una si proporciona la implementación de gnu: cuando enlace con /android-ndk-r5b/sources/cxx-stl/gnu-libstdc++/libs/armeabi/libstdc++.a explícitamente, la el problema se fue Pero estoy seguro de que hay una manera más fácil. – paniq

1

Por lo que sé, el NDK de Android nunca ha admitido excepciones. libstdC++ sí admite excepciones, pero cuando se compila para android, el soporte de excepciones se desactiva (grep para "-fno-exceptions").

Ver this thread en la lista de distribución de android ndk.

+2

Soporte para excepciones/rtti es nuevo con la versión r5. De acuerdo con los cambios y el README del gnustl, debe ser compatible. – plaisthos

+0

http://developer.android.com/sdk/ndk/index.html todavía tiene "Excepciones de C++ y RTTI no son compatibles con la implementación predeterminada de STL". en la sección de notas generales. ¿Dónde viste que agregaron soporte para excepciones se habilitó en r5? Y sí, la implementación de la biblioteca estándar que usan admite excepciones, sin embargo, cuando lo compilan para Android, deshabilitan las excepciones explícitamente. (O al menos tener hasta r4) –

+0

Ahora que estoy volviendo a leer esto, cuando probaste el crystal ndk, hiciste la compilación completa de libstdC++ con su parche y luego vinculaste hello-jni contra libstdC++, o lo hiciste ¿solo usas el código en hello-jni y lo vincula con el libstdC++ predeterminado? El primero debe darle soporte completo de excepción; este último morirá horriblemente. –

7

Las herramientas NDK-r5 admiten el uso de excepciones y RTTI en código C++. Sin embargo, no se admite el uso de un STL que no sea el GNU STL como biblioteca estática, en presencia de RTTI o excepciones.

El STLport suministrado no se puede utilizar junto con excepciones o RTTI.

Tenga en cuenta que puede ser necesario limpiar los objetos de compilación al intercambiar entre las implementaciones de STL.

+0

No ha leído la pregunta correctamente. – paniq

+1

La pregunta es si la declaración de documentación NDK sobre soporte para excepciones es incorrecta; no lo es. – grrussel

+3

En este caso, no he leído su respuesta correctamente. – paniq

1

Tengo un problema similar con JNI. Todas las excepciones lanzadas desde un método JNI están provocando un error SIGILL en Android 1.6 y 2.1. Está bien que trabaja bajo Android 2.2 +

Ver mi problema (por favor, no dude en votar a favor o en publicar un comentario):

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

Así, en la actualidad, Android 1.6 y 2.1 no lo hacen admite excepciones de los métodos JNI con el último NDK.

Tal vez podría fijarse en una futura versión NDK ...