summaryrefslogtreecommitdiff
path: root/Source/Android/jni/MainAndroid.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2021-07-08 10:37:36 +0200
committerJosJuice <josjuice@gmail.com>2021-07-08 10:37:36 +0200
commit44c99f8cc149e753566ded9331fe824f201c6fe0 (patch)
treee2d7ac354d2a35b4bc19c9ae6d1857412251b320 /Source/Android/jni/MainAndroid.cpp
parentde1289058885233be1fb29b16a239530b9c697d6 (diff)
Android: Avoid crash on early panic alert
Diffstat (limited to 'Source/Android/jni/MainAndroid.cpp')
-rw-r--r--Source/Android/jni/MainAndroid.cpp20
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;
}