From 0280f3557c703beb4c14df7aab543349bfc001ea Mon Sep 17 00:00:00 2001 From: JosJuice Date: Fri, 6 Nov 2020 19:26:56 +0100 Subject: [PATCH] Android: Finish EmulationActivity from C++ This makes EmulationActivity automatically close if booting fails, and lets us get rid of s_emulation_end_event. --- .../dolphinemu/dolphinemu/NativeLibrary.java | 14 ++++++++++++++ .../activities/EmulationActivity.java | 2 -- Source/Android/jni/AndroidCommon/IDCache.cpp | 8 ++++++++ Source/Android/jni/AndroidCommon/IDCache.h | 1 + Source/Android/jni/MainAndroid.cpp | 18 ++++++------------ 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java index 199d80cf72..9e7c9bb208 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -563,6 +563,20 @@ public final class NativeLibrary sEmulationActivity.clear(); } + public static void finishEmulationActivity() + { + final EmulationActivity emulationActivity = sEmulationActivity.get(); + if (emulationActivity == null) + { + Log.warning("[NativeLibrary] EmulationActivity is null."); + } + else + { + Log.verbose("[NativeLibrary] Finishing EmulationActivity."); + emulationActivity.runOnUiThread(emulationActivity::finish); + } + } + public static void updateTouchPointer() { final EmulationActivity emulationActivity = sEmulationActivity.get(); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java index 49f9704e86..daa202de7c 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java @@ -342,7 +342,6 @@ public final class EmulationActivity extends AppCompatActivity if (keyCode == KeyEvent.KEYCODE_BACK) { mEmulationFragment.stopEmulation(); - finish(); return true; } return super.onKeyLongPress(keyCode, event); @@ -617,7 +616,6 @@ public final class EmulationActivity extends AppCompatActivity case MENU_ACTION_EXIT: mEmulationFragment.stopEmulation(); - finish(); break; } } diff --git a/Source/Android/jni/AndroidCommon/IDCache.cpp b/Source/Android/jni/AndroidCommon/IDCache.cpp index bebdea1a4b..70d40da5d8 100644 --- a/Source/Android/jni/AndroidCommon/IDCache.cpp +++ b/Source/Android/jni/AndroidCommon/IDCache.cpp @@ -15,6 +15,7 @@ static jmethodID s_display_alert_msg; static jmethodID s_do_rumble; static jmethodID s_update_touch_pointer; static jmethodID s_on_title_changed; +static jmethodID s_finish_emulation_activity; static jclass s_game_file_class; static jfieldID s_game_file_pointer; @@ -94,6 +95,11 @@ jmethodID GetOnTitleChanged() return s_on_title_changed; } +jmethodID GetFinishEmulationActivity() +{ + return s_finish_emulation_activity; +} + jclass GetAnalyticsClass() { return s_analytics_class; @@ -221,6 +227,8 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) s_update_touch_pointer = env->GetStaticMethodID(s_native_library_class, "updateTouchPointer", "()V"); s_on_title_changed = env->GetStaticMethodID(s_native_library_class, "onTitleChanged", "()V"); + s_finish_emulation_activity = + env->GetStaticMethodID(s_native_library_class, "finishEmulationActivity", "()V"); env->DeleteLocalRef(native_library_class); const jclass game_file_class = env->FindClass("org/dolphinemu/dolphinemu/model/GameFile"); diff --git a/Source/Android/jni/AndroidCommon/IDCache.h b/Source/Android/jni/AndroidCommon/IDCache.h index 1b762edf4a..cd45b5d03f 100644 --- a/Source/Android/jni/AndroidCommon/IDCache.h +++ b/Source/Android/jni/AndroidCommon/IDCache.h @@ -15,6 +15,7 @@ jmethodID GetDisplayAlertMsg(); jmethodID GetDoRumble(); jmethodID GetUpdateTouchPointer(); jmethodID GetOnTitleChanged(); +jmethodID GetFinishEmulationActivity(); jclass GetAnalyticsClass(); jmethodID GetSendAnalyticsReport(); diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp index 4079f947dc..f852d61590 100644 --- a/Source/Android/jni/MainAndroid.cpp +++ b/Source/Android/jni/MainAndroid.cpp @@ -77,7 +77,6 @@ ANativeWindow* s_surf; // sequentially for access. std::mutex s_host_identity_lock; Common::Event s_update_main_frame_event; -Common::Event s_emulation_end_event; bool s_have_wm_user_stop = false; bool s_game_metadata_is_valid = false; } // Anonymous namespace @@ -210,17 +209,11 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_PauseEmulati JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_StopEmulation(JNIEnv*, jclass) { - { - std::lock_guard guard(s_host_identity_lock); - s_emulation_end_event.Reset(); - Core::Stop(); + std::lock_guard guard(s_host_identity_lock); + Core::Stop(); - // Kick the waiting event - s_update_main_frame_event.Set(); - } - - // Wait for shutdown, to avoid accessing the config at the same time as the shutdown code - s_emulation_end_event.Wait(); + // Kick the waiting event + s_update_main_frame_event.Set(); } JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_IsBooting(JNIEnv*, jclass) @@ -533,7 +526,8 @@ static void Run(JNIEnv* env, const std::vector& paths, s_surf = nullptr; } - s_emulation_end_event.Set(); + env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), + IDCache::GetFinishEmulationActivity()); } JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run___3Ljava_lang_String_2(