2017-01-26 18 views
0

Когда я выполняю команду throw в своей родной библиотеке, мое приложение для Android падает. Поддерживает ли Android эти вызовы? Он никогда не достигает улова.Try Catch в исходной библиотеке Android не работает

try 
{ 
    __android_log_print(ANDROID_LOG_ERROR, "nativeLib", "throw"); 
    throw; 
} 
catch (...) { 
    __android_log_print(ANDROID_LOG_ERROR, "nativeLib", "catch"); 
} 

Я недавно перешел с gnustl_shared на C++ _ общие, я не уверен, если это не имеет ничего общего с моей проблемой.

Руководства разработчика говорят, что gnustl_shared имеет исключения по умолчанию, но C++ _ shared не поддерживает. Я включил флаг -fexceptions, как описано в руководстве. https://developer.android.com/ndk/guides/cpp-support.html

+1

Возможный дубликат [почему бросок «ничего» вызывает завершение программы?] (Http://stackoverflow.com/questions/651154/why-does-throw-nothing-causes-program-termination) –

+0

Я откинул назад потому что это принципиально меняет смысл вопроса и текущего ответа. – njzk2

ответ

0

Похоже, это известная проблема:

https://developer.android.com/ndk/guides/cpp-support.html

Совместимость

НДК-х libC++ нестабилен. Не все тесты проходят, а набор тестов не является исчерпывающим. Некоторые известные проблемы:

• Использование C++ _ shared в ARM может привести к сбою при вызове исключения.

• Поддержка wchar_t и языковых API ограничена.

1

Ожидаемое поведение. Из стандарта C++:

Если в настоящее время не выполняется какое-либо исключение, выполнение выражения throw без вызова операнда завершает() (15.5.1).

Если вы хотите, чтобы поймать вам нужно бросить что-то:

try 
{ 
    __android_log_print(ANDROID_LOG_ERROR, "nativeLib", "throw"); 
    throw new std::exception(); 
} 
catch (...) { 
    __android_log_print(ANDROID_LOG_ERROR, "nativeLib", "catch"); 
    env->ExceptionCheck(); 
} 
+0

Приложение все еще терпит крах при добавлении нового std :: exception(); –

+0

Можете ли вы добавить стек к вопросу? –

+0

В стек входит информация, которую я не могу выпускать. но я получаю A/libc: Fatal signal 6 (SIGABRT) –