diff --git a/src/android/app/src/main/cpp/CMakeLists.txt b/src/android/app/src/main/cpp/CMakeLists.txt index 65c96e9a..176d5681 100644 --- a/src/android/app/src/main/cpp/CMakeLists.txt +++ b/src/android/app/src/main/cpp/CMakeLists.txt @@ -11,6 +11,7 @@ add_library(CemuAndroid SHARED NativeGraphicPacks.cpp NativeInput.cpp NativeLib.cpp + NativeLogging.cpp NativeSettings.cpp NativeSwkbd.cpp ) diff --git a/src/android/app/src/main/cpp/NativeLogging.cpp b/src/android/app/src/main/cpp/NativeLogging.cpp new file mode 100644 index 00000000..44d06e3e --- /dev/null +++ b/src/android/app/src/main/cpp/NativeLogging.cpp @@ -0,0 +1,17 @@ +#include "Common/ExceptionHandler/ExceptionHandler.h" +#include "JNIUtils.h" + +extern "C" [[maybe_unused]] JNIEXPORT void JNICALL +Java_info_cemu_Cemu_nativeinterface_NativeLogging_log(JNIEnv* env, [[maybe_unused]] jclass clazz, jstring message) +{ + cemuLog_log(LogType::Force, JNIUtils::JStringToString(env, message)); +} + +extern "C" [[maybe_unused]] JNIEXPORT void JNICALL +Java_info_cemu_Cemu_nativeinterface_NativeLogging_crashLog(JNIEnv* env, [[maybe_unused]] jclass clazz, jstring stacktrace) +{ + if (!CrashLog_Create()) + return; // give up if crashlog was already created + CrashLog_WriteLine("Unhandled exception from java code"); + CrashLog_WriteLine(JNIUtils::JStringToString(env, stacktrace)); +} diff --git a/src/android/app/src/main/java/info/cemu/Cemu/CemuApplication.java b/src/android/app/src/main/java/info/cemu/Cemu/CemuApplication.java index 3601e155..e2a1fc92 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/CemuApplication.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/CemuApplication.java @@ -4,9 +4,12 @@ import android.app.Application; import android.util.DisplayMetrics; import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; import info.cemu.Cemu.nativeinterface.NativeEmulation; import info.cemu.Cemu.nativeinterface.NativeGraphicPacks; +import info.cemu.Cemu.nativeinterface.NativeLogging; import info.cemu.Cemu.nativeinterface.NativeSwkbd; public class CemuApplication extends Application { @@ -14,6 +17,7 @@ public class CemuApplication extends Application { System.loadLibrary("CemuAndroid"); } + private static Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler; private static CemuApplication application; public CemuApplication() { @@ -35,6 +39,17 @@ public class CemuApplication extends Application { @Override public void onCreate() { super.onCreate(); + if (defaultUncaughtExceptionHandler == null) { + defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); + } + Thread.setDefaultUncaughtExceptionHandler((thread, exception) -> { + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + exception.printStackTrace(printWriter); + String stacktrace = stringWriter.toString(); + NativeLogging.crashLog(stacktrace); + defaultUncaughtExceptionHandler.uncaughtException(thread, exception); + }); DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); NativeEmulation.setDPI(displayMetrics.density); NativeEmulation.initializeActiveSettings(getInternalFolder().toString(), getInternalFolder().toString()); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/nativeinterface/NativeLogging.java b/src/android/app/src/main/java/info/cemu/Cemu/nativeinterface/NativeLogging.java new file mode 100644 index 00000000..6047c193 --- /dev/null +++ b/src/android/app/src/main/java/info/cemu/Cemu/nativeinterface/NativeLogging.java @@ -0,0 +1,7 @@ +package info.cemu.Cemu.nativeinterface; + +public class NativeLogging { + public static native void log(String message); + + public static native void crashLog(String stacktrace); +}