Android NDK R5 et prise en charge de l'exception C ++
Je suis en train d'utiliser le NDK 5 C++ gnustl:
La CPLUSPLUS-SUPPORT.html
états:
Le NDK la chaîne prend en charge les exceptions C++, depuis NDK r5, cependant tous C++
les sources sont compilées avec -fno-exceptions support par défaut, pour
des raisons de compatibilité avec les versions précédentes.Pour l'activer, utilisez l'option '-fexceptions' compilateur C++ drapeau. Cela peut être fait
par adjonction, pour chaque module de définition dans votre Android.mk:LOCAL_CPPFLAGS += -fexceptions
Plus simplement, d'ajouter une seule ligne de votre Application.mk, le réglage
s'appliquent automatiquement à tous de votre projet NDK modules:APP_CPPFLAGS += -fexceptions
sources/cxx-stl/gnu-libstdc++/README
états:
Ce répertoire contient les en-têtes et prêts à l'emploi binaires pour la
GNU libstdc++-v3 C++ Standard Template Library mise en œuvre.Celles-ci sont générées à partir de la chaîne de compilation des sources par l'rebuild-all-prebuilt.sh
script en cours de fabrication et des outils.Pour l'utiliser, définir APP_STL 'gnustl_static" dans votre Application.mk.
Voir docs/CPLUSPLUS-SUPPORT.html pour plus de détails.Cette mise en œuvre prend entièrement en charge les exceptions C++ et RTTI.
Mais toutes les tentatives à l'aide d'exceptions échouer. Une alternative NDK existe sur http://www.crystax.net/android/ndk-r4.php. À l'aide de la bonjour-jni exemple de cette NDK ne fonctionne pas. Compliation avec le NDK 5 œuvres après la création d'un Application.xml
avec
APP_STL := gnustl_static
Réglage APP_STL à gnustl_static
également active automatiquement -frtti
et -fexceptions
. Mais il meurt la même mort horrible comme mes propres expériences.
J'ai réussi à obtenir un exemple minimal de code qui est en échec pour moi:
try {
__android_log_write(ANDROID_LOG_DEBUG,"foobar","trhown!");
throw "Wrong object type.";
} catch (char* b) {
__android_log_write(ANDROID_LOG_DEBUG,"foobar","catched!");
}
Suis me manque quelque chose ou est l'instruction dans la README
et CPLUSPLUS-SUPPORT.html
tout simplement faux?
source d'informationauteur plaisthos
Vous devez vous connecter pour publier un commentaire.
Il s'avère que les exceptions de travail, mais seulement si l'exception sont héritées de std::exception. Dans mon cas, à l'exception de la hiérarchie n'a pas toujours std::exception qui a brisé l'attraper/lancer. Curieusement, le fait de lancer des chaînes comme des exceptions œuvres lors de la compilation pour les architectures x86/Mac OS. J'ai réglé mon problème en modifiant les exceptions que j'utilise.
Le NDK-r5 outils de soutien à l'utilisation des exceptions et RTTI dans le code C++. L'utilisation de la STL autre que la GNU STL comme une bibliothèque statique n'est pas, cependant, pris en charge, en présence de RTTI ou des exceptions.
La STLport fourni n'est pas utilisable avec des exceptions ou RTTI.
Noter qu'il peut être nécessaire de nettoyer l'accumulation des objets lors de la permutation entre la STL implémentations.
Autant que je sache, l'Android NDK n'a jamais pris en charge les exceptions. libstdc++ lui-même prend en charge les exceptions, mais lors de la compilation pour android, à l'exception de support est éteint (grep "-fno-exceptions").
Voir ce fil sur l'android ndk liste de diffusion.
J'ai un problème similaire en utilisant JNI. Toutes les exceptions levées à partir d'un JNI méthode sont à l'origine d'un SIGILL erreur sous Android 1.6 et 2.1. Il fonctionne sous Android 2.2+
Voir mon problème (s'il vous plaît n'hésitez pas à voter pour elle ou poster un commentaire) :
http://code.google.com/p/android/issues/detail?id=20176
Donc, actuellement, Android 1.6 et 2.1 ne supportent pas des exceptions de la JNI de méthodes avec la dernière NDK.
Peut-être pourrait-il être corrigé dans une future NDK libération...