2023-01-20 256
当我将Android-Jni项目升级到CMake BuildSystem后,当我的C ++后端 throws and std ::异常时,我总是会收到崩溃(sigsegv).这仅在华为手机上发生.
我无法在最小的示例中重建问题.
这是建筑物规格:
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 BUILDSYSTYSTYS)?
?
(顺便说一句:摆脱所有STD ::例外不是一个好主意)
我在评论中看到的帮助找到了解决问题的方法.当库本身的大小大小时,华为似乎在 gnustl_shared 库中遇到了问题.因此,我将我的外部企业更改为 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'
}
}
我遇到了同样的问题,堆栈就像:
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例外.
但是我仍然发现是谁造成的?
以上所述是小编给大家介绍的std :: exception sigsegv on huawei jni,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/26181.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态