std::exception SIGSEGV 是华为JNI
std::exception SIGSEGV on Huawei JNI
在我将我的 Android-JNI 项目升级到 cmake 构建系统后,当我的 c++ 后端 抛出 一个 std 时,我总是收到崩溃 (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:: 异常不是一个好主意)
我在评论中看到的帮助找到了解决我的问题的方法。当库本身变得很大时,似乎华为在 gnustl_shared 库方面存在问题。所以我相应地将 externalNativeBuild 更改为 c++_shared。
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'
}
}
我遇到同样的问题,堆栈是这样的:
backtrace:
#00 pc 00056dfe /apex/com.android.runtime/lib/bionic/libc.so (abort+166) (BuildId: b1803e2c54cf63f48664b8839ccf313b)
#01 pc 00014daf /data/app/org.swig.cppexception-TAwOh_fwpqXbW-uy7twUGg==/lib/arm/libnative-lib.so (BuildId: 030a2de7aefd84866dea1b48f592d7fdad70db2d)
#02 pc 00014851 /data/app/org.swig.cppexception-TAwOh_fwpqXbW-uy7twUGg==/lib/arm/libnative-lib.so (BuildId: 030a2de7aefd84866dea1b48f592d7fdad70db2d)
#03 pc 000146a9 /data/app/org.swig.cppexception-TAwOh_fwpqXbW-uy7twUGg==/lib/arm/libnative-lib.so (__gxx_personality_v0+100) (BuildId: 030a2de7aefd84866dea1b48f592d7fdad70db2d)
#04 pc 001bd04c /data/app/org.swig.cppexception-TAwOh_fwpqXbW-uy7twUGg==/lib/arm/libffmpeg.so (__gnu_Unwind_RaiseException+108)
#05 pc 001bdb90 /data/app/org.swig.cppexception-TAwOh_fwpqXbW-uy7twUGg==/lib/arm/libffmpeg.so (___Unwind_RaiseException+20)
一搜天下,发现是cpp抛出异常导致的。
我已经捕获了cpp异常,但它仍然崩溃了。
'-DANDROID_STL=c++_static' -> '-DANDROID_STL=c++_shared'
以上修改救了我。现在可以捕获 cpp 异常。
但是我还是找到了是谁造成的?
在我将我的 Android-JNI 项目升级到 cmake 构建系统后,当我的 c++ 后端 抛出 一个 std 时,我总是收到崩溃 (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:: 异常不是一个好主意)
我在评论中看到的帮助找到了解决我的问题的方法。当库本身变得很大时,似乎华为在 gnustl_shared 库方面存在问题。所以我相应地将 externalNativeBuild 更改为 c++_shared。
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'
}
}
我遇到同样的问题,堆栈是这样的:
backtrace:
#00 pc 00056dfe /apex/com.android.runtime/lib/bionic/libc.so (abort+166) (BuildId: b1803e2c54cf63f48664b8839ccf313b)
#01 pc 00014daf /data/app/org.swig.cppexception-TAwOh_fwpqXbW-uy7twUGg==/lib/arm/libnative-lib.so (BuildId: 030a2de7aefd84866dea1b48f592d7fdad70db2d)
#02 pc 00014851 /data/app/org.swig.cppexception-TAwOh_fwpqXbW-uy7twUGg==/lib/arm/libnative-lib.so (BuildId: 030a2de7aefd84866dea1b48f592d7fdad70db2d)
#03 pc 000146a9 /data/app/org.swig.cppexception-TAwOh_fwpqXbW-uy7twUGg==/lib/arm/libnative-lib.so (__gxx_personality_v0+100) (BuildId: 030a2de7aefd84866dea1b48f592d7fdad70db2d)
#04 pc 001bd04c /data/app/org.swig.cppexception-TAwOh_fwpqXbW-uy7twUGg==/lib/arm/libffmpeg.so (__gnu_Unwind_RaiseException+108)
#05 pc 001bdb90 /data/app/org.swig.cppexception-TAwOh_fwpqXbW-uy7twUGg==/lib/arm/libffmpeg.so (___Unwind_RaiseException+20)
一搜天下,发现是cpp抛出异常导致的。 我已经捕获了cpp异常,但它仍然崩溃了。
'-DANDROID_STL=c++_static' -> '-DANDROID_STL=c++_shared'
以上修改救了我。现在可以捕获 cpp 异常。
但是我还是找到了是谁造成的?