diff options
| author | JosJuice <josjuice@gmail.com> | 2021-07-08 10:37:36 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2021-07-08 10:37:36 +0200 |
| commit | 44c99f8cc149e753566ded9331fe824f201c6fe0 (patch) | |
| tree | e2d7ac354d2a35b4bc19c9ae6d1857412251b320 /Source/Android/jni/MainAndroid.cpp | |
| parent | de1289058885233be1fb29b16a239530b9c697d6 (diff) | |
Android: Avoid crash on early panic alert
Diffstat (limited to 'Source/Android/jni/MainAndroid.cpp')
| -rw-r--r-- | Source/Android/jni/MainAndroid.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp index 2634cb97e8..e1066f1584 100644 --- a/Source/Android/jni/MainAndroid.cpp +++ b/Source/Android/jni/MainAndroid.cpp @@ -175,13 +175,21 @@ void Host_TitleChanged() static bool MsgAlert(const char* caption, const char* text, bool yes_no, Common::MsgType style) { - JNIEnv* env = IDCache::GetEnvForThread(); + // If a panic alert happens very early in the execution of a game, we can crash here with + // the error "JNI NewString called with pending exception java.lang.StackOverflowError". + // As a workaround, let's put the call on a new thread with a brand new stack. + + jboolean result; + + std::thread([&] { + JNIEnv* env = IDCache::GetEnvForThread(); - // Execute the Java method. - jboolean result = - env->CallStaticBooleanMethod(IDCache::GetNativeLibraryClass(), IDCache::GetDisplayAlertMsg(), - ToJString(env, caption), ToJString(env, text), yes_no, - style == Common::MsgType::Warning, s_need_nonblocking_alert_msg); + // Execute the Java method. + result = env->CallStaticBooleanMethod( + IDCache::GetNativeLibraryClass(), IDCache::GetDisplayAlertMsg(), ToJString(env, caption), + ToJString(env, text), yes_no, style == Common::MsgType::Warning, + s_need_nonblocking_alert_msg); + }).join(); return result != JNI_FALSE; } |
