после того, как я обновил свой проект Android-JNI до cmake buildsystem, я всегда получаю сбой (SIGSEGV), когда мой бэкэнд c++ выдает исключение std::. Это происходит только на телефонах Huawei.
У меня не получилось пересобрать задачу на минимальном примере.
Вот характеристики здания:
- Инструменты сборки Android SDK: 25.0.2, 26.0.2
- Инструменты платформы Android SDK: 26.0.1
- Инструменты SDK для Android: 26.1.1
- CMake: 3.6.4111459
- NDK: 15.2.4203891
Gradle: (также пытался использовать '-DANDROID_TOOLCHAIN=gcc')
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions -pthread -v -std=c++11"
arguments '-DANDROID_PLATFORM=android-9', '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_shared'
}
}
ndk {
abiFilters 'armeabi'
}
Сигнал: SIGSEGV (сигнал SIGSEGV: неверный адрес (адрес ошибки: 0x7))
Со следующей трассировкой стека:
unw_get_reg
_Unwind_VRS_Interpret
__gnu_Unwind_RaiseException
___Unwind_RaiseException
__cxxabiv1::__cxa_throw(void *, std::type_info *, void (*)(void *))
testTryCatch()
Java_de_company_project_wrapper_SystemWrapper_startApplication
art_quick_generic_jni_trampoline
art_quick_invoke_stub_internal
art_quick_invoke_stub
Это буквально первая функция, которая вызывается в моем бэкэнде:
#include <exception>
#include <android/log.h>
void testTryCatch() {
try {
throw std::exception();
}catch(std::exception &e){
__android_log_write(ANDROID_LOG_INFO, "testException", "done");
}
}
JNIEXPORT void JNICALL
Java_de_company_project_wrapper_SystemWrapper_startApplication(JNIEnv *env,
jclass obj)
{
testTryCatch();
}
Это происходит в большом проекте, библиотека c/c++ занимает около 16 МБ. Есть и другие библиотеки, статически связанные (OpenSSL/FFmpeg/opus/zip).
Итак, мой вопрос заключается в том, как решить эту проблему и почему библиотека аварийно завершает работу при выдаче исключения std::, появляется только на телефонах Huawei (после обновления до системы сборки cmake)?
(кстати: избавляться от всех исключений std:: не очень хорошая идея)