From 3038368128696e3aa924da7f6ff08c0f7cb5323f Mon Sep 17 00:00:00 2001 From: sigmabeta Date: Sun, 7 Jun 2015 20:13:52 -0400 Subject: Android: Display Panic Alerts on-screen as an Android Toast message. --- Source/Core/DolphinWX/MainAndroid.cpp | 45 ++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) (limited to 'Source/Core/DolphinWX/MainAndroid.cpp') diff --git a/Source/Core/DolphinWX/MainAndroid.cpp b/Source/Core/DolphinWX/MainAndroid.cpp index 07532be838..11e8d01df1 100644 --- a/Source/Core/DolphinWX/MainAndroid.cpp +++ b/Source/Core/DolphinWX/MainAndroid.cpp @@ -37,6 +37,10 @@ ANativeWindow* surf; std::string g_filename; std::string g_set_userpath = ""; +JavaVM* g_java_vm; +jclass g_jni_class; +jmethodID g_jni_method_alert; + // PanicAlert static bool g_alert_available = false; static std::string g_alert_message = ""; @@ -44,6 +48,16 @@ static Common::Event g_alert_event; #define DOLPHIN_TAG "DolphinEmuNative" +/* + * Cache the JavaVM so that we can call into it later. + */ +jint JNI_OnLoad(JavaVM* vm, void* reserved) +{ + g_java_vm = vm; + + return JNI_VERSION_1_6; +} + void Host_NotifyMapLoaded() {} void Host_RefreshDSPDebuggerWindow() {} @@ -99,6 +113,18 @@ void Host_ShowVideoConfig(void*, const std::string&, const std::string&) {} static bool MsgAlert(const char* caption, const char* text, bool yes_no, int /*Style*/) { + __android_log_print(ANDROID_LOG_ERROR, DOLPHIN_TAG, "%s:%s", caption, text); + + // Associate the current Thread with the Java VM. + JNIEnv* env; + g_java_vm->AttachCurrentThread(&env, NULL); + + // Execute the Java method. + env->CallStaticVoidMethod(g_jni_class, g_jni_method_alert, env->NewStringUTF(text)); + + // Must be called before the current thread exits; might as well do it here. + g_java_vm->DetachCurrentThread(); + g_alert_message = std::string(text); g_alert_available = true; // XXX: Uncomment next line when the Android UI actually handles messages @@ -365,10 +391,11 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfiling JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_WriteProfileResults(JNIEnv *env, jobject obj); JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *env, jobject obj, jobject _surf); -// MsgAlert +// Msg JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_HasAlertMsg(JNIEnv *env, jobject obj); JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetAlertMsg(JNIEnv *env, jobject obj); JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ClearAlertMsg(JNIEnv *env, jobject obj); +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_CacheClassesAndMethods(JNIEnv *env, jobject obj); JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_UnPauseEmulation(JNIEnv *env, jobject obj) { @@ -579,6 +606,22 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ClearAlertMs g_alert_event.Set(); // Kick the alert } +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_CacheClassesAndMethods(JNIEnv *env, jobject obj) +{ + // This class reference is only valid for the lifetime of this method. + jclass localClass = env->FindClass("org/dolphinemu/dolphinemu/NativeLibrary"); + + // This reference, however, is valid until we delete it. + g_jni_class = reinterpret_cast(env->NewGlobalRef(localClass)); + + // TODO Find a place for this. + // So we don't leak a reference to NativeLibrary.class. + // env->DeleteGlobalRef(g_jni_class); + + // Method signature taken from javap -s Source/Android/app/build/intermediates/classes/arm/debug/org/dolphinemu/dolphinemu/NativeLibrary.class + g_jni_method_alert = env->GetStaticMethodID(g_jni_class, "displayAlertMsg", "(Ljava/lang/String;)V"); +} + JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *env, jobject obj, jobject _surf) { surf = ANativeWindow_fromSurface(env, _surf); -- cgit v1.2.3 From d752ee73c0f1957a36db6171130377754a30915e Mon Sep 17 00:00:00 2001 From: sigmabeta Date: Sun, 7 Jun 2015 20:16:55 -0400 Subject: Android: Remove old panic alert messsaging flags. --- Source/Core/DolphinWX/MainAndroid.cpp | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) (limited to 'Source/Core/DolphinWX/MainAndroid.cpp') diff --git a/Source/Core/DolphinWX/MainAndroid.cpp b/Source/Core/DolphinWX/MainAndroid.cpp index 11e8d01df1..f1a789b7f3 100644 --- a/Source/Core/DolphinWX/MainAndroid.cpp +++ b/Source/Core/DolphinWX/MainAndroid.cpp @@ -41,11 +41,6 @@ JavaVM* g_java_vm; jclass g_jni_class; jmethodID g_jni_method_alert; -// PanicAlert -static bool g_alert_available = false; -static std::string g_alert_message = ""; -static Common::Event g_alert_event; - #define DOLPHIN_TAG "DolphinEmuNative" /* @@ -125,11 +120,6 @@ static bool MsgAlert(const char* caption, const char* text, bool yes_no, int /*S // Must be called before the current thread exits; might as well do it here. g_java_vm->DetachCurrentThread(); - g_alert_message = std::string(text); - g_alert_available = true; - // XXX: Uncomment next line when the Android UI actually handles messages - // g_alert_event.Wait() - g_alert_available = false; return false; } @@ -389,13 +379,9 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetUserDirec JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetUserDirectory(JNIEnv *env, jobject obj); JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfiling(JNIEnv *env, jobject obj, jboolean enable); JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_WriteProfileResults(JNIEnv *env, jobject obj); +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_CacheClassesAndMethods(JNIEnv *env, jobject obj); JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *env, jobject obj, jobject _surf); -// Msg -JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_HasAlertMsg(JNIEnv *env, jobject obj); -JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetAlertMsg(JNIEnv *env, jobject obj); -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ClearAlertMsg(JNIEnv *env, jobject obj); -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_CacheClassesAndMethods(JNIEnv *env, jobject obj); JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_UnPauseEmulation(JNIEnv *env, jobject obj) { @@ -591,21 +577,6 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_WriteProfile JitInterface::WriteProfileResults(filename); } -JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_HasAlertMsg(JNIEnv *env, jobject obj) -{ - return g_alert_available; -} - -JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetAlertMsg(JNIEnv *env, jobject obj) -{ - return env->NewStringUTF(g_alert_message.c_str()); -} - -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ClearAlertMsg(JNIEnv *env, jobject obj) -{ - g_alert_event.Set(); // Kick the alert -} - JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_CacheClassesAndMethods(JNIEnv *env, jobject obj) { // This class reference is only valid for the lifetime of this method. -- cgit v1.2.3