From 8096f7269b0b0692bdb08cf0f41e411ae9203619 Mon Sep 17 00:00:00 2001
From: Sylvain <[EMAIL REDACTED]>
Date: Fri, 9 Jun 2023 09:41:54 +0200
Subject: [PATCH] Android: add robustness. check that the native code is run
for the first time.
---
.../main/java/org/libsdl/app/SDLActivity.java | 19 +++++++++++++++++++
src/core/android/SDL_android.c | 14 +++++++++++++-
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
index 8578d41f7cb6..24f10fb6b64b 100644
--- a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
+++ b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
@@ -398,6 +398,24 @@ public void onClick(DialogInterface dialog,int id) {
return;
}
+
+ /* Control activity re-creation */
+ /* Robustness: check that the native code is run for the first time.
+ * (Maybe Activity was reset, but not the native code.) */
+ {
+ int run_count = SDLActivity.nativeCheckSDLThreadCounter(); /* get and increment a native counter */
+ if (run_count != 0) {
+ boolean allow_recreate = SDLActivity.nativeAllowRecreateActivity();
+ if (allow_recreate) {
+ Log.v(TAG, "activity re-created // run_count: " + run_count);
+ } else {
+ Log.v(TAG, "activity finished // run_count: " + run_count);
+ System.exit(0);
+ return;
+ }
+ }
+ }
+
// Set up JNI
SDL.setupJNI();
@@ -971,6 +989,7 @@ public static native void onNativeTouch(int touchDevId, int pointerFingerId,
public static native void onNativeLocaleChanged();
public static native void onNativeDarkModeChanged(boolean enabled);
public static native boolean nativeAllowRecreateActivity();
+ public static native int nativeCheckSDLThreadCounter();
/**
* This method is called by SDL using JNI.
diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c
index 6a6cc83058fe..0188257bddda 100644
--- a/src/core/android/SDL_android.c
+++ b/src/core/android/SDL_android.c
@@ -170,6 +170,9 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativePermissionResult)(
JNIEXPORT jboolean JNICALL SDL_JAVA_INTERFACE(nativeAllowRecreateActivity)(
JNIEnv *env, jclass jcls);
+JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeCheckSDLThreadCounter)(
+ JNIEnv *env, jclass jcls);
+
static JNINativeMethod SDLActivity_tab[] = {
{ "nativeGetVersion", "()Ljava/lang/String;", SDL_JAVA_INTERFACE(nativeGetVersion) },
{ "nativeSetupJNI", "()I", SDL_JAVA_INTERFACE(nativeSetupJNI) },
@@ -203,6 +206,7 @@ static JNINativeMethod SDLActivity_tab[] = {
{ "nativeAddTouch", "(ILjava/lang/String;)V", SDL_JAVA_INTERFACE(nativeAddTouch) },
{ "nativePermissionResult", "(IZ)V", SDL_JAVA_INTERFACE(nativePermissionResult) },
{ "nativeAllowRecreateActivity", "()Z", SDL_JAVA_INTERFACE(nativeAllowRecreateActivity) },
+ { "nativeCheckSDLThreadCounter", "()I", SDL_JAVA_INTERFACE(nativeCheckSDLThreadCounter) }
};
/* Java class SDLInputConnection */
@@ -738,7 +742,15 @@ JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeSetupJNI)(JNIEnv *env
/* SDL main function prototype */
typedef int (*SDL_main_func)(int argc, char *argv[]);
-static int run_count = 1;
+static int run_count = 0;
+
+JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeCheckSDLThreadCounter)(
+ JNIEnv *env, jclass jcls)
+{
+ int tmp = run_count;
+ run_count += 1;
+ return tmp;
+}
static void SDLCALL SDL_AllowRecreateActivityChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
{