Huawei JNI 中的 std::exception SIGSEGV

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

{btsdaf} - hauron
{btsdaf} - Da Maex
{btsdaf} - Da Maex
1
{btsdaf} - hauron
问题确实是gnustl_shared,改成c++_shared就可以了。 - Da Maex
2个回答

3

在评论区的帮助下,我找到了解决问题的方法。看起来华为在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'
    }
}

我也遇到了完全相同的问题,但是当使用你提供的解决方案时,屏幕会变黑并且应用程序会冻结甚至没有崩溃。你能否建议其他解决方案? - user3406222
你能具体说一下你使用的版本(平台、工具链、SDK、NDK、CMake),这只在华为设备上吗? - Da Maex

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)

在搜索了全球后,我发现这是由于C++抛出异常引起的。我已经捕获了C++异常,但它仍然崩溃。

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

上述修改对我很有帮助。现在可以捕获C++异常了。
但我仍然想知道是谁引起了这个问题?


这个也适用于华为设备吗? - Da Maex
不是每个安卓设备都有这个问题,"oppo/xiaomi"同样存在这个问题。 - bluesky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接