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