From 68b8af1e1c6e3ed9b3f35ebe4664960a5d77a84c Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Mon, 21 Apr 2025 07:47:44 +0200 Subject: [PATCH] Activity: fix crash when finish() is called from onResume() --- src/api-impl-jni/app/android_app_Activity.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/api-impl-jni/app/android_app_Activity.c b/src/api-impl-jni/app/android_app_Activity.c index 31daf379..768e7e3f 100644 --- a/src/api-impl-jni/app/android_app_Activity.c +++ b/src/api-impl-jni/app/android_app_Activity.c @@ -44,19 +44,27 @@ static void activity_unfocus(JNIEnv *env, jobject activity) (*env)->ExceptionDescribe(env); } +static jobject removed_activity = NULL; + static void activity_focus(JNIEnv *env, jobject activity) { (*env)->CallVoidMethod(env, activity, handle_cache.activity.onStart); if((*env)->ExceptionCheck(env)) (*env)->ExceptionDescribe(env); + if (activity == removed_activity) + return; (*env)->CallVoidMethod(env, activity, handle_cache.activity.onResume); if((*env)->ExceptionCheck(env)) (*env)->ExceptionDescribe(env); + if (activity == removed_activity) + return; (*env)->CallVoidMethod(env, activity, handle_cache.activity.onPostResume); if((*env)->ExceptionCheck(env)) (*env)->ExceptionDescribe(env); + if (activity == removed_activity) + return; (*env)->CallVoidMethod(env, activity, handle_cache.activity.onWindowFocusChanged, true); if((*env)->ExceptionCheck(env)) @@ -73,6 +81,8 @@ static void activity_update_current(JNIEnv *env) if (activity_new) activity_focus(env, activity_new); + if (activity_new == removed_activity) + return; activity_current = activity_new; } @@ -164,7 +174,7 @@ void activity_start(JNIEnv *env, jobject activity_object) JNIEXPORT void JNICALL Java_android_app_Activity_nativeFinish(JNIEnv *env, jobject this, jlong window) { GList *l; - jobject removed_activity = NULL; + removed_activity = NULL; for (l = activity_backlog; l != NULL; l = l->next) { if ((*env)->IsSameObject(env, this, l->data)) { removed_activity = l->data;