From 4749ce1637a9ad8d525b95ad19fcbdb6c400c9ea Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Sat, 2 Aug 2025 09:49:25 +0200 Subject: [PATCH] Harden jni_find_class() and its setup/cleanup --- platform/android/jni_utils.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/platform/android/jni_utils.cpp b/platform/android/jni_utils.cpp index b6aca557806..260fe060697 100644 --- a/platform/android/jni_utils.cpp +++ b/platform/android/jni_utils.cpp @@ -518,6 +518,10 @@ void setup_android_class_loader() { // This ClassLoader will be used by jni_find_class() to locate classes at runtime // in a thread-safe manner, avoiding issues with FindClass in non-main threads. + if (android_class_loader) { + cleanup_android_class_loader(); + } + JNIEnv *env = get_jni_env(); ERR_FAIL_NULL(env); @@ -553,12 +557,23 @@ void cleanup_android_class_loader() { JNIEnv *env = get_jni_env(); if (env) { env->DeleteGlobalRef(android_class_loader); - android_class_loader = nullptr; + } else { + ERR_PRINT("Failed to release Android ClassLoader - JNIEnv is not available."); } + android_class_loader = nullptr; + load_class_method = nullptr; } } jclass jni_find_class(JNIEnv *p_env, const char *p_class_name) { + ERR_FAIL_NULL_V(p_env, nullptr); + ERR_FAIL_NULL_V(p_class_name, nullptr); + + if (!android_class_loader || !load_class_method) { + ERR_PRINT("Android ClassLoader is not initialized. Falling back to FindClass."); + return p_env->FindClass(p_class_name); + } + jstring java_class_name = p_env->NewStringUTF(p_class_name); jobject class_object = p_env->CallObjectMethod( android_class_loader,