3

Android-JNI プロジェクトを cmake buildsystem にアップグレードした後、c++ バックエンドがstd:: exceptionをスローすると、常にクラッシュ (SIGSEGV) が発生します。これはHuawei電話でのみ発生します。

最小限の例で問題を再構築できませんでした。

建物の仕様は次のとおりです。

  • 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'
}

The Signal is: 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:: 例外を取り除くことは良い考えではありません)

4

2 に答える 2