Android NDK R5 и поддержка исключения C ++ - PullRequest
13 голосов
/ 12 января 2011

Я пытаюсь использовать полный C ++ NDK 5 gnustl:

Состояния CPLUSPLUS-SUPPORT.html:

Набор инструментов NDK поддерживает исключения C ++, поскольку NDK r5, однако все C ++исходники компилируются с поддержкой -fno-excptions по умолчанию, в целях совместимости с предыдущими выпусками.

Чтобы включить его, используйте флаг компилятора C ++ '-fexceptions'.Это можно сделать, добавив следующее к каждому определению модуля в вашем Android.mk:

LOCAL_CPPFLAGS += -fexceptions

Проще говоря, добавьте одну строку в Application.mk, настройка автоматически будет применена ко всем NDK вашего проекта.modules:

APP_CPPFLAGS += -fexceptions

sources/cxx-stl/gnu-libstdc++/README состояния:

Этот каталог содержит заголовки и готовые двоичные файлы для реализации стандартной библиотеки шаблонов GNU libstdc ++ - v3 C ++.

Они генерируются из источников набора инструментов скриптом rebuild-all-prebuilt.sh в build / tools.

Чтобы использовать его, определите APP_STL для gnustl_static в Application.mk.См. Docs / CPLUSPLUS-SUPPORT.html для получения более подробной информации.

Эта реализация полностью поддерживает исключения C ++ и 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 простопросто неправильно?

Ответы [ 4 ]

9 голосов
/ 16 января 2011

Оказывается, что исключения работают, но только если исключение наследуется от std :: exception. В моем случае иерархия исключений не всегда включала в себя std :: exception, что нарушало catch / throw. Любопытно, что бросающие строки как исключения работают при компиляции для x86 / Mac OS. Я исправил свою проблему, изменив используемые исключения.

7 голосов
/ 13 января 2011

Инструменты NDK-r5 поддерживают использование исключений и RTTI в коде C ++. Однако использование STL, отличного от GNU STL, в качестве статической библиотеки не поддерживается при наличии RTTI или исключений.

Поставляемый STLport не может использоваться вместе с исключениями или RTTI.

Обратите внимание, что может потребоваться очистить объекты сборки при переключении между реализациями STL.

1 голос
/ 20 сентября 2011

У меня похожая проблема с использованием 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 ...

1 голос
/ 12 января 2011

Насколько я знаю, Android NDK никогда не поддерживал исключения. libstdc ++ сама поддерживает исключения, но при компиляции для android поддержка исключений отключается (grep для "-fno-exceptions").

См. эту ветку в списке рассылки android ndk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...