Merge pull request #9877 from JosJuice/android-early-panic

Android: Avoid crash on early panic alert
This commit is contained in:
Léo Lam 2021-07-13 03:27:12 +02:00 committed by GitHub
commit b09347c160
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 14 additions and 6 deletions

View File

@ -175,13 +175,21 @@ void Host_TitleChanged()
static bool MsgAlert(const char* caption, const char* text, bool yes_no, Common::MsgType style) 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.
// Execute the Java method. jboolean result;
jboolean result =
env->CallStaticBooleanMethod(IDCache::GetNativeLibraryClass(), IDCache::GetDisplayAlertMsg(), std::thread([&] {
ToJString(env, caption), ToJString(env, text), yes_no, JNIEnv* env = IDCache::GetEnvForThread();
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; return result != JNI_FALSE;
} }