在我将我的 Android-JNI 项目升级到 cmake 构建系统后,当我的 c++ 后端抛出std:: exception时,我总是会收到崩溃(SIGSEGV) 。这只发生在华为手机上。
我无法在一个最小的例子中重建问题。
以下是建筑规格:
- Android SDK 构建工具:25.0.2、26.0.2
- Android SDK 平台工具:26.0.1
- Android SDK 工具: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:: 异常时崩溃只出现在华为手机上(升级到 cmake 构建系统后)?
(顺便说一句:摆脱所有 std:: 异常不是一个好主意)