diff --git a/android/app/src/cpp/android_host_interface.cpp b/android/app/src/cpp/android_host_interface.cpp index 22e0868aa..32424f3d3 100644 --- a/android/app/src/cpp/android_host_interface.cpp +++ b/android/app/src/cpp/android_host_interface.cpp @@ -34,10 +34,11 @@ static jclass s_String_class; static jclass s_AndroidHostInterface_class; static jmethodID s_AndroidHostInterface_constructor; static jfieldID s_AndroidHostInterface_field_mNativePointer; +static jmethodID s_AndroidHostInterface_method_reportError; +static jmethodID s_AndroidHostInterface_method_reportMessage; static jmethodID s_AndroidHostInterface_method_openAssetStream; static jclass s_EmulationActivity_class; static jmethodID s_EmulationActivity_method_reportError; -static jmethodID s_EmulationActivity_method_reportMessage; static jmethodID s_EmulationActivity_method_onEmulationStarted; static jmethodID s_EmulationActivity_method_onEmulationStopped; static jmethodID s_EmulationActivity_method_onGameTitleChanged; @@ -161,25 +162,29 @@ void AndroidHostInterface::ReportError(const char* message) { CommonHostInterface::ReportError(message); + JNIEnv* env = AndroidHelpers::GetJNIEnv(); + jstring message_jstr = env->NewStringUTF(message); if (m_emulation_activity_object) - { - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - jstring message_jstr = env->NewStringUTF(message); env->CallVoidMethod(m_emulation_activity_object, s_EmulationActivity_method_reportError, message_jstr); - env->DeleteLocalRef(message_jstr); - } + else + env->CallVoidMethod(m_java_object, s_AndroidHostInterface_method_reportError, message_jstr); + env->DeleteLocalRef(message_jstr); } void AndroidHostInterface::ReportMessage(const char* message) { CommonHostInterface::ReportMessage(message); - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - if (m_emulation_activity_object) + if (IsOnEmulationThread()) { - jstring message_jstr = env->NewStringUTF(message); - env->CallVoidMethod(m_emulation_activity_object, s_EmulationActivity_method_reportMessage, message_jstr); - env->DeleteLocalRef(message_jstr); + // The toasts are not visible when the emulation activity is running anyway. + AddOSDMessage(message, 5.0f); + } + else + { + JNIEnv* env = AndroidHelpers::GetJNIEnv(); + LocalRefHolder message_jstr(env, env->NewStringUTF(message)); + env->CallVoidMethod(m_java_object, s_AndroidHostInterface_method_reportMessage, message_jstr.Get()); } } @@ -309,6 +314,11 @@ void AndroidHostInterface::StopEmulationThreadLoop() m_sleep_cv.notify_one(); } +bool AndroidHostInterface::IsOnEmulationThread() const +{ + return std::this_thread::get_id() == m_emulation_thread_id; +} + void AndroidHostInterface::RunOnEmulationThread(std::function function, bool blocking) { if (!IsEmulationThreadRunning()) @@ -350,6 +360,7 @@ void AndroidHostInterface::EmulationThreadEntryPoint(JNIEnv* env, jobject emulat CreateImGuiContext(); m_emulation_activity_object = emulation_activity; + m_emulation_thread_id = std::this_thread::get_id(); ApplySettings(true); // Boot system. @@ -887,14 +898,16 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) env->GetMethodID(s_AndroidHostInterface_class, "", "(Landroid/content/Context;)V")) == nullptr || (s_AndroidHostInterface_field_mNativePointer = env->GetFieldID(s_AndroidHostInterface_class, "mNativePointer", "J")) == nullptr || + (s_AndroidHostInterface_method_reportError = + env->GetMethodID(s_AndroidHostInterface_class, "reportError", "(Ljava/lang/String;)V")) == nullptr || + (s_AndroidHostInterface_method_reportMessage = + env->GetMethodID(s_AndroidHostInterface_class, "reportMessage", "(Ljava/lang/String;)V")) == nullptr || (s_AndroidHostInterface_method_openAssetStream = env->GetMethodID( s_AndroidHostInterface_class, "openAssetStream", "(Ljava/lang/String;)Ljava/io/InputStream;")) == nullptr || (emulation_activity_class = env->FindClass("com/github/stenzek/duckstation/EmulationActivity")) == nullptr || (s_EmulationActivity_class = static_cast(env->NewGlobalRef(emulation_activity_class))) == nullptr || (s_EmulationActivity_method_reportError = env->GetMethodID(s_EmulationActivity_class, "reportError", "(Ljava/lang/String;)V")) == nullptr || - (s_EmulationActivity_method_reportMessage = - env->GetMethodID(s_EmulationActivity_class, "reportMessage", "(Ljava/lang/String;)V")) == nullptr || (s_EmulationActivity_method_onEmulationStarted = env->GetMethodID(s_EmulationActivity_class, "onEmulationStarted", "()V")) == nullptr || (s_EmulationActivity_method_onEmulationStopped = diff --git a/android/app/src/cpp/android_host_interface.h b/android/app/src/cpp/android_host_interface.h index 045b999b0..038959b81 100644 --- a/android/app/src/cpp/android_host_interface.h +++ b/android/app/src/cpp/android_host_interface.h @@ -44,6 +44,7 @@ public: bool IsEmulationThreadRunning() const { return m_emulation_thread_running.load(); } bool IsEmulationThreadPaused() const; + bool IsOnEmulationThread() const; void RunOnEmulationThread(std::function function, bool blocking = false); void PauseEmulationThread(bool paused); void StopEmulationThreadLoop(); @@ -109,6 +110,7 @@ private: std::atomic_bool m_emulation_thread_stop_request{false}; std::atomic_bool m_emulation_thread_running{false}; + std::thread::id m_emulation_thread_id{}; HostDisplay::Alignment m_display_alignment = HostDisplay::Alignment::Center; diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java b/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java index 303029d4b..cac1b4d00 100644 --- a/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java +++ b/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java @@ -25,6 +25,14 @@ public class AndroidHostInterface { this.mContext = context; } + public void reportError(String message) { + Toast.makeText(mContext, message, Toast.LENGTH_LONG).show(); + } + + public void reportMessage(String message) { + Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); + } + public InputStream openAssetStream(String path) { try { return mContext.getAssets().open(path, AssetManager.ACCESS_STREAMING); diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java index a8d6a3850..ba7cd0786 100644 --- a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java +++ b/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java @@ -104,13 +104,6 @@ public class EmulationActivity extends AppCompatActivity implements SurfaceHolde } } - public void reportMessage(String message) { - Log.i("EmulationActivity", message); - runOnUiThread(() -> { - Toast.makeText(this, message, Toast.LENGTH_SHORT); - }); - } - private EmulationThread mEmulationThread; private void stopEmulationThread() {