华为JNI上的std :: exception SIGSEGV

时间:2017-10-23 11:38:11

标签: android c++ exception java-native-interface huawei

将我的Android-JNI项目升级到cmake构建系统后,当我的c ++后端抛出 std :: exception 时,我总是收到崩溃(SIGSEGV)。这只发生在华为手机上。

我无法在最小的例子中重建问题。

以下是建筑规格:

  • Android SDK Build-Tools :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))

使用以下stacktrace:

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 buildsystem之后)?

(顺便说一下:摆脱所有std :: exception不是一个好主意)

2 个答案:

答案 0 :(得分:2)

我通过评论中的帮助找到了解决问题的方法。当图书馆本身的规模很大时,华为似乎对 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'
    }
}

答案 1 :(得分:1)

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

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 throw异常引起的。 我已经捕捉到cpp异常,但仍然崩溃。

'-DANDROID_STL=c++_static' -> '-DANDROID_STL=c++_shared'

以上修改保存了我。现在可以捕获cpp异常。
但是我仍然发现是谁造成的?