Подтвердить что ты не робот

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

4b9b3361

Ответ 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...