浏览代码

Android: Fix java reference leaks

Lou Yihua 7 年之前
父节点
当前提交
cbb3157e1e
共有 1 个文件被更改,包括 13 次插入4 次删除
  1. 13 4
      android/app/src/main/cpp/android_jni.cpp

+ 13 - 4
android/app/src/main/cpp/android_jni.cpp

@@ -211,10 +211,13 @@ void* JNI_mediaplayer_load(const char *filename)
     JNIEnv* env = getJNIEnv();
     jclass clazz = env->FindClass("com/sdlpal/sdlpal/PalActivity");
     jmethodID mid = env->GetStaticMethodID(clazz, "JNI_mediaplayer_load", "(Ljava/lang/String;)Landroid/media/MediaPlayer;");
-    // str & player are local references so that they will be released automatically by JVM on return
     jstring str = env->NewStringUTF(filename);
-    jobject player = env->CallStaticObjectMethod(clazz, mid, str);
-    return env->NewGlobalRef(player);
+    jobject player_local = env->CallStaticObjectMethod(clazz, mid, str);
+    jobject player = env->NewGlobalRef(player_local);
+    env->DeleteLocalRef(str);
+    env->DeleteLocalRef(player_local);
+    env->DeleteLocalRef(clazz);
+    return player;
 }
 
 EXTERN_C_LINKAGE
@@ -224,6 +227,7 @@ void JNI_mediaplayer_free(void *player)
     jclass clazz = env->FindClass("android/media/MediaPlayer");
     // The MediaPlayer object should be placed to the 'End' state before freed
     env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "release", "()V"));
+    env->DeleteLocalRef(clazz);
     env->DeleteGlobalRef((jobject)player);
 }
 
@@ -234,6 +238,7 @@ void JNI_mediaplayer_play(void *player, int looping)
     jclass clazz = env->FindClass("android/media/MediaPlayer");
     env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "setLooping", "(Z)V"), looping ? JNI_TRUE : JNI_FALSE);
     env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "start", "()V"));
+    env->DeleteLocalRef(clazz);
 }
 
 EXTERN_C_LINKAGE
@@ -242,6 +247,7 @@ void JNI_mediaplayer_stop(void *player)
     JNIEnv* env = getJNIEnv();
     jclass clazz = env->FindClass("android/media/MediaPlayer");
     env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "stop", "()V"));
+    env->DeleteLocalRef(clazz);
 }
 
 EXTERN_C_LINKAGE
@@ -249,7 +255,9 @@ int JNI_mediaplayer_isplaying(void *player)
 {
     JNIEnv* env = getJNIEnv();
     jclass clazz = env->FindClass("android/media/MediaPlayer");
-    return env->CallBooleanMethod((jobject)player, env->GetMethodID(clazz, "isPlaying", "()Z"));
+    int playing = env->CallBooleanMethod((jobject)player, env->GetMethodID(clazz, "isPlaying", "()Z"));
+    env->DeleteLocalRef(clazz);
+    return playing;
 }
 
 EXTERN_C_LINKAGE
@@ -259,6 +267,7 @@ void JNI_mediaplayer_setvolume(void *player, int volume)
     JNIEnv* env = getJNIEnv();
     jclass clazz = env->FindClass("android/media/MediaPlayer");
     env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "setVolume", "(FF)V"), vol, vol);
+    env->DeleteLocalRef(clazz);
 }
 
 EXTERN_C_LINKAGE