после того, как я обновил свой проект Android-JNI до cmake buildsystem, я всегда получаю сбой (SIGSEGV), когда мой бэкэнд c ++ бросает стандартное исключение :: исключение. Это происходит только на телефонах Huawei.
Я не смог перестроить проблему в минимальном примере.
Вот технические характеристики здания:
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 :: exception появляется только на телефонах Huawei (после обновления до cmake buildsystem)?
(кстати: избавиться от всех std :: исключений не очень хорошая идея)
Я нашел решение моей проблемы с помощью увиденного в комментариях. Похоже, у Huawei проблемы с gnustl_shared библиотека, когда сама библиотека становится большой по размеру. Так что я изменил свой externalNativeBuild в C ++ _ общий соответственно.
externalNativeBuild {
cmake {
cppFlags "-pthread -v -std=c++11"arguments '-DANDROID_PLATFORM=android-9', '-DANDROID_CPP_FEATURES=rtti exceptions',
'-DANDROID_STL=c++_shared', '-DANDROID_TOOLCHAIN=clang'
}
}
Других решений пока нет …