Commit 097ad55000218cd19ec337d04d50b63307d9c98a

Philipp Wiesemann 2014-11-23T20:38:18

Fixed local reference leaks in messagebox implementation for Android.

diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c
index 24442fd..b62ab1a 100644
--- a/src/core/android/SDL_android.c
+++ b/src/core/android/SDL_android.c
@@ -1353,6 +1353,7 @@ void Android_JNI_HideTextInput()
 int Android_JNI_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
 {
     JNIEnv *env;
+    jclass clazz;
     jmethodID mid;
     jobject context;
     jstring title;
@@ -1361,6 +1362,7 @@ int Android_JNI_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *bu
     jintArray button_ids;
     jobjectArray button_texts;
     jintArray colors;
+    jobject text;
     jint temp;
     int i;
 
@@ -1368,19 +1370,23 @@ int Android_JNI_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *bu
 
     /* convert parameters */
 
+    clazz = (*env)->FindClass(env, "java/lang/String");
+
     title = (*env)->NewStringUTF(env, messageboxdata->title);
     message = (*env)->NewStringUTF(env, messageboxdata->message);
 
     button_flags = (*env)->NewIntArray(env, messageboxdata->numbuttons);
     button_ids = (*env)->NewIntArray(env, messageboxdata->numbuttons);
     button_texts = (*env)->NewObjectArray(env, messageboxdata->numbuttons,
-        (*env)->FindClass(env, "java/lang/String"), NULL);
+        clazz, NULL);
     for (i = 0; i < messageboxdata->numbuttons; ++i) {
         temp = messageboxdata->buttons[i].flags;
         (*env)->SetIntArrayRegion(env, button_flags, i, 1, &temp);
         temp = messageboxdata->buttons[i].buttonid;
         (*env)->SetIntArrayRegion(env, button_ids, i, 1, &temp);
-        (*env)->SetObjectArrayElement(env, button_texts, i, (*env)->NewStringUTF(env, messageboxdata->buttons[i].text));
+        text = (*env)->NewStringUTF(env, messageboxdata->buttons[i].text);
+        (*env)->SetObjectArrayElement(env, button_texts, i, text);
+        (*env)->DeleteLocalRef(env, text);
     }
 
     if (messageboxdata->colorScheme) {
@@ -1396,13 +1402,17 @@ int Android_JNI_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *bu
         colors = NULL;
     }
 
+    (*env)->DeleteLocalRef(env, clazz);
+
     /* call function */
 
     mid = (*env)->GetStaticMethodID(env, mActivityClass, "getContext","()Landroid/content/Context;");
 
     context = (*env)->CallStaticObjectMethod(env, mActivityClass, mid);
 
-    mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context),
+    clazz = (*env)->GetObjectClass(env, context);
+
+    mid = (*env)->GetMethodID(env, clazz,
         "messageboxShowMessageBox", "(ILjava/lang/String;Ljava/lang/String;[I[I[Ljava/lang/String;[I)I");
     *buttonid = (*env)->CallIntMethod(env, context, mid,
         messageboxdata->flags,
@@ -1413,16 +1423,15 @@ int Android_JNI_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *bu
         button_texts,
         colors);
 
+    (*env)->DeleteLocalRef(env, context);
+    (*env)->DeleteLocalRef(env, clazz);
+
     /* delete parameters */
 
     (*env)->DeleteLocalRef(env, title);
     (*env)->DeleteLocalRef(env, message);
     (*env)->DeleteLocalRef(env, button_flags);
     (*env)->DeleteLocalRef(env, button_ids);
-    for (i = 0; i < messageboxdata->numbuttons; ++i) {
-        (*env)->DeleteLocalRef(env, (*env)->GetObjectArrayElement(env, button_texts, i));
-        (*env)->SetObjectArrayElement(env, button_texts, i, NULL);
-    }
     (*env)->DeleteLocalRef(env, button_texts);
     (*env)->DeleteLocalRef(env, colors);