在我将Android-JNI项目升级到cmake构建系统之后,每当我的C++后端抛出std::exception时,我总是会收到崩溃(SIGSEGV)。这只发生在华为手机上,我无法在最小的示例中重现此问题。以下是构建规格:
- Android SDK Build-Tools: 25.0.2、26.0.2 - Android SDK Platform-Tools: 26.0.1 - Android SDK Tools: 26.1.1 - CMake: 3.6.4111459 - NDK: 15.2.4203891
Gradle: (也尝试使用“-DANDROID_TOOLCHAIN=gcc”)
信号是: SIGSEGV (信号SIGSEGV:无效地址(故障地址:0x7)) 具有以下堆栈跟踪:
这是在一个大项目中发生的问题,c/c++库的大小约为16MB。还有其他静态链接的库(OpenSSL/FFmpeg/opus/zip)。 我的问题是如何解决这个问题,并且为什么只有在华为手机上抛出std::exception时库会崩溃(在升级到cmake构建系统后)?
(顺便说一句:摆脱所有std::exceptions并不是一个好主意)
- Android SDK Build-Tools: 25.0.2、26.0.2 - Android SDK Platform-Tools: 26.0.1 - Android SDK Tools: 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++库的大小约为16MB。还有其他静态链接的库(OpenSSL/FFmpeg/opus/zip)。 我的问题是如何解决这个问题,并且为什么只有在华为手机上抛出std::exception时库会崩溃(在升级到cmake构建系统后)?
(顺便说一句:摆脱所有std::exceptions并不是一个好主意)