Я пытаюсь использовать 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
просто неправильно?