Android NDK R5 и поддержка исключения С++
Я пытаюсь использовать NDK 5 полный С++ gnustl:
В CPLUSPLUS-SUPPORT.html
указано:
Инструментальная цепочка NDK поддерживает исключения С++, поскольку NDK r5, однако все С++ источники скомпилированы с поддержкой -fno-exceptions по умолчанию, для соображения совместимости с предыдущими версиями.
Чтобы включить его, используйте флаг компилятора '-fexceptions' С++. Это можно сделать добавив следующее к каждому определению модуля в вашем Android.mk:
LOCAL_CPPFLAGS += -fexceptions
Проще говоря, добавьте одну строку в ваш Application.mk, настройка будет автоматически применяются ко всем вашим проектным модулям NDK:
APP_CPPFLAGS += -fexceptions
sources/cxx-stl/gnu-libstdc++/README
:
Этот каталог содержит заголовки и готовые двоичные файлы для GNU libstdС++ - v3 Стандартная реализация библиотеки шаблонов С++.
Они генерируются из источников инструментальной привязки командой rebuild-all-prebuilt.sh script в разделе build/tools.
Чтобы использовать его, определите APP_STL в gnustl_static в приложении Application.mk. Подробнее см. Docs/CPLUSPLUS-SUPPORT.html.
Эта реализация полностью поддерживает исключения С++ и RTTI.
Но все попытки использования исключений терпят неудачу. Альтернативный NDK существует на http://www.crystax.net/android/ndk-r4.php. Использование примера hello-jni из этого NDK не работает. Согласование с NDK 5 работает после создания Application.xml
с
APP_STL := gnustl_static
Настройка APP_STL на gnustl_static
также автоматически включает -frtti
и -fexceptions
. Но он умирает той же ужасной смертью, что и мои собственные эксперименты.
Мне удалось получить минимальный пример кода, который рушится для меня:
try {
__android_log_write(ANDROID_LOG_DEBUG,"foobar","trhown!");
throw "Wrong object type.";
} catch (char* b) {
__android_log_write(ANDROID_LOG_DEBUG,"foobar","catched!");
}
Мне что-то не хватает или это утверждение в README
и CPLUSPLUS-SUPPORT.html
просто неправильно?
Ответы
Ответ 1
Оказывается, что исключения работают, но только если исключение наследуется от std:: exception. В моем случае иерархия исключений не всегда включала std:: exception, которая нарушила catch/throw. Любопытно, что метательные строки как исключения работают при компиляции для x86/Mac OS. Я исправил свою проблему, изменив исключения, которые я использую.
Ответ 2
Инструменты NDK-r5 поддерживают использование исключений и RTTI в коде на С++. Однако использование STL, отличного от GNU STL, как статической библиотеки, не поддерживается при наличии RTTI или исключений.
Предоставленный STLport не может использоваться вместе с исключениями или RTTI.
Обратите внимание, что может потребоваться очистка объектов сборки при замене между реализациями STL.
Ответ 3
Насколько я знаю, Android NDK никогда не поддерживал исключения. libstdС++ сам поддерживает исключения, но при компиляции для android поддержка исключений отключена (grep для "-fno-exceptions" ).
См. этот поток в списке рассылки android ndk.
Ответ 4
У меня есть аналогичная проблема с использованием JNI. Все исключения, исходящие из метода JNI, вызывают ошибку SIGILL под Android 1.6 и 2.1. Он отлично работает под Android 2.2 +
Смотрите мою проблему (пожалуйста, не стесняйтесь проголосовать за нее или оставить комментарий):
http://code.google.com/p/android/issues/detail?id=20176
Итак, в настоящее время Android 1.6 и 2.1 не поддерживают исключения из JNI-методов с последним NDK.
Возможно, это может быть исправлено в будущей версии NDK...