首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std:华为JNI的例外SIGSEGV

std:华为JNI的例外SIGSEGV
EN

Stack Overflow用户
提问于 2017-10-23 11:38:10
回答 2查看 663关注 0票数 3

在我将Android项目升级到cmake之后,当我的c++后端抛出(一个std::exception )时,我总是会收到一个崩溃(SIGSEGV)。这种情况只发生在华为的手机上。

我不能用一个很小的例子来重建这个问题。

这是建筑规格:

  • Android构建-Tools:25.0.2,26.0.2
  • Android平台-Tools:26.0.1
  • Android工具:26.1.1
  • CMake:3.6.4111459
  • NDK:15.2.4203891

Gradle:(也尝试使用'-DANDROID_TOOLCHAIN=gcc')

代码语言:javascript
复制
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))

使用以下堆栈跟踪:

代码语言:javascript
复制
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

这是在我的后端调用的第一个函数:

代码语言:javascript
复制
#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 in。还有其他静态链接库(OpenSSL/FFmpeg/opus/zip)。

因此,我的问题是如何解决这个问题,为什么库在抛出std::exception时崩溃,只出现在华为手机上(升级到cmake之后)?

(顺便说一句:摆脱所有的性病::异常不是一个好主意)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-25 13:24:13

在评论中看到的帮助下,我找到了解决问题的方法。看来,当gnustl_shared图书馆本身规模扩大时,华为在该图书馆方面存在问题。因此,我相应地将我的externalNativeBuild改为c++_shared。

代码语言:javascript
复制
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'
    }
}
票数 3
EN

Stack Overflow用户

发布于 2020-12-11 06:59:05

我遇到同样的问题,堆栈就像:

代码语言:javascript
复制
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异常,但它还是崩溃了。

代码语言:javascript
复制
'-DANDROID_STL=c++_static' -> '-DANDROID_STL=c++_shared'

以上修改救了我。现在可以捕获cpp异常。

但我还是找到了是谁造成的?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46888420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档