Skip to content
Snippets Groups Projects
Commit 948a8de7 authored by Thomas Guillem's avatar Thomas Guillem
Browse files

libvlcjni: fix LocalRef leaks

parent 238047ac
No related branches found
No related tags found
No related merge requests found
......@@ -49,10 +49,14 @@ display_error_cb(void *p_data, const char *psz_title, const char *psz_text)
if (!(env = jni_get_env(THREAD_NAME)))
return;
jstring title = (*env)->NewStringUTF(env, psz_title);
jstring text = (*env)->NewStringUTF(env, psz_text);
(*env)->CallStaticVoidMethod(env, fields.Dialog.clazz,
fields.Dialog.displayErrorFromNativeID,
(*env)->NewStringUTF(env, psz_title),
(*env)->NewStringUTF(env, psz_text));
fields.Dialog.displayErrorFromNativeID, title, text);
(*env)->DeleteLocalRef(env, title);
(*env)->DeleteLocalRef(env, text);
}
static void
......@@ -65,13 +69,18 @@ display_login_cb(void *p_data, libvlc_dialog_id *p_id, const char *psz_title,
if (!(env = jni_get_env(THREAD_NAME)))
return;
jstring title = (*env)->NewStringUTF(env, psz_title);
jstring text = (*env)->NewStringUTF(env, psz_text);
jstring default_username = (*env)->NewStringUTF(env, psz_default_username);
jdialog = (*env)->CallStaticObjectMethod(env, fields.Dialog.clazz,
fields.Dialog.displayLoginFromNativeID,
(jlong)(intptr_t) p_id,
(*env)->NewStringUTF(env, psz_title),
(*env)->NewStringUTF(env, psz_text),
(*env)->NewStringUTF(env, psz_default_username), b_ask_store);
(jlong)(intptr_t) p_id, title, text, default_username, b_ask_store);
dialog_set_context(env, p_id, jdialog);
(*env)->DeleteLocalRef(env, title);
(*env)->DeleteLocalRef(env, text);
(*env)->DeleteLocalRef(env, default_username);
}
static void
......@@ -85,15 +94,24 @@ display_question_cb(void *p_data, libvlc_dialog_id *p_id, const char *psz_title,
if (!(env = jni_get_env(THREAD_NAME)))
return;
jstring title = (*env)->NewStringUTF(env, psz_title);
jstring text = (*env)->NewStringUTF(env, psz_text);
jstring cancel = (*env)->NewStringUTF(env, psz_cancel);
jstring action1 = psz_action1 ? (*env)->NewStringUTF(env, psz_action1) : NULL;
jstring action2 = psz_action2 ? (*env)->NewStringUTF(env, psz_action2) : NULL;
jdialog = (*env)->CallStaticObjectMethod(env, fields.Dialog.clazz,
fields.Dialog.displayQuestionFromNativeID,
(jlong)(intptr_t) p_id,
(*env)->NewStringUTF(env, psz_title),
(*env)->NewStringUTF(env, psz_text), i_type,
(*env)->NewStringUTF(env, psz_cancel),
psz_action1 ? (*env)->NewStringUTF(env, psz_action1) : NULL,
psz_action2 ? (*env)->NewStringUTF(env, psz_action2) : NULL);
(jlong)(intptr_t) p_id, title, text, i_type, cancel, action1, action2);
dialog_set_context(env, p_id, jdialog);
(*env)->DeleteLocalRef(env, title);
(*env)->DeleteLocalRef(env, text);
(*env)->DeleteLocalRef(env, cancel);
if (action1)
(*env)->DeleteLocalRef(env, action1);
if (action2)
(*env)->DeleteLocalRef(env, action2);
}
static void
......@@ -106,13 +124,18 @@ display_progress_cb(void *p_data, libvlc_dialog_id *p_id, const char *psz_title,
if (!(env = jni_get_env(THREAD_NAME)))
return;
jstring title = (*env)->NewStringUTF(env, psz_title);
jstring text = (*env)->NewStringUTF(env, psz_text);
jstring cancel = (*env)->NewStringUTF(env, psz_cancel);
jdialog = (*env)->CallStaticObjectMethod(env, fields.Dialog.clazz,
fields.Dialog.displayProgressFromNativeID,
(jlong)(intptr_t) p_id,
(*env)->NewStringUTF(env, psz_title),
(*env)->NewStringUTF(env, psz_text),
b_indeterminate, f_position, (*env)->NewStringUTF(env, psz_cancel));
(jlong)(intptr_t) p_id, title, text, b_indeterminate, f_position, cancel);
dialog_set_context(env, p_id, jdialog);
(*env)->DeleteLocalRef(env, title);
(*env)->DeleteLocalRef(env, text);
(*env)->DeleteLocalRef(env, cancel);
}
static void
......@@ -142,9 +165,12 @@ update_progress_cb(void *p_data, libvlc_dialog_id *p_id, float f_position,
if (!(env = jni_get_env(THREAD_NAME)))
return;
jstring text = (*env)->NewStringUTF(env, psz_text);
(*env)->CallStaticVoidMethod(env, fields.Dialog.clazz,
fields.Dialog.updateProgressFromNativeID, jdialog, f_position,
(*env)->NewStringUTF(env, psz_text));
fields.Dialog.updateProgressFromNativeID, jdialog, f_position, text);
(*env)->DeleteLocalRef(env, text);
}
static const libvlc_dialog_cbs dialog_cbs = {
......
......@@ -297,10 +297,11 @@ media_track_to_object(JNIEnv *env, libvlc_media_track_t *p_tracks)
if (p_tracks->psz_description)
jdescription = (*env)->NewStringUTF(env, p_tracks->psz_description);
jobject jobj;
switch (p_tracks->i_type)
{
case libvlc_track_audio:
return (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
jobj = (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
fields.Media.createAudioTrackFromNativeID,
jcodec,
joriginalCodec,
......@@ -312,8 +313,9 @@ media_track_to_object(JNIEnv *env, libvlc_media_track_t *p_tracks)
jdescription,
(jint)p_tracks->audio->i_channels,
(jint)p_tracks->audio->i_rate);
break;
case libvlc_track_video:
return (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
jobj = (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
fields.Media.createVideoTrackFromNativeID,
jcodec,
joriginalCodec,
......@@ -331,13 +333,14 @@ media_track_to_object(JNIEnv *env, libvlc_media_track_t *p_tracks)
(jint)p_tracks->video->i_frame_rate_den,
(jint)p_tracks->video->i_orientation,
(jint)p_tracks->video->i_projection);
break;
case libvlc_track_text: {
jstring jencoding = NULL;
if (p_tracks->subtitle->psz_encoding)
jencoding = (*env)->NewStringUTF(env, p_tracks->subtitle->psz_encoding);
return (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
jobj = (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
fields.Media.createSubtitleTrackFromNativeID,
jcodec,
joriginalCodec,
......@@ -348,9 +351,12 @@ media_track_to_object(JNIEnv *env, libvlc_media_track_t *p_tracks)
jlanguage,
jdescription,
jencoding);
if (jencoding)
(*env)->DeleteLocalRef(env, jencoding);
break;
}
case libvlc_track_unknown:
return (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
jobj = (*env)->CallStaticObjectMethod(env, fields.Media.clazz,
fields.Media.createUnknownTrackFromNativeID,
jcodec,
joriginalCodec,
......@@ -360,7 +366,18 @@ media_track_to_object(JNIEnv *env, libvlc_media_track_t *p_tracks)
(jint)p_tracks->i_bitrate,
jlanguage,
jdescription);
break;
}
if (jcodec)
(*env)->DeleteLocalRef(env, jcodec);
if (joriginalCodec)
(*env)->DeleteLocalRef(env, joriginalCodec);
if (jlanguage)
(*env)->DeleteLocalRef(env, jlanguage);
if (jdescription)
(*env)->DeleteLocalRef(env, jdescription);
return jobj;
}
jobject
......@@ -547,6 +564,7 @@ Java_org_videolan_libvlc_Media_nativeGetSlaves(JNIEnv *env, jobject thiz)
p_slave->i_type, p_slave->i_priority,
juri);
(*env)->SetObjectArrayElement(env, array, i, jslave);
(*env)->DeleteLocalRef(env, juri);
}
error:
......
......@@ -99,9 +99,13 @@ service_to_object(JNIEnv *env, libvlc_media_discoverer_description_t *p_service)
jname = (*env)->NewStringUTF(env, p_service->psz_name);
jlongName = (*env)->NewStringUTF(env, p_service->psz_longname);
return (*env)->CallStaticObjectMethod(env, fields.MediaDiscoverer.clazz,
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.MediaDiscoverer.clazz,
fields.MediaDiscoverer.createDescriptionFromNativeID,
jname, jlongName, p_service->i_cat);
(*env)->DeleteLocalRef(env, jname);
(*env)->DeleteLocalRef(env, jlongName);
return jobj;
}
jobject
......
......@@ -530,11 +530,15 @@ mediaplayer_title_to_object(JNIEnv *env, libvlc_title_description_t *p_title)
if (p_title->psz_name)
jname = (*env)->NewStringUTF(env, p_title->psz_name);
return (*env)->CallStaticObjectMethod(env, fields.MediaPlayer.clazz,
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.MediaPlayer.clazz,
fields.MediaPlayer.createTitleFromNativeID,
p_title->i_duration,
jname,
p_title->i_flags);
if (jname)
(*env)->DeleteLocalRef(env, jname);
return jobj;
}
jobject
......@@ -584,11 +588,15 @@ mediaplayer_chapter_to_object(JNIEnv *env,
if (p_chapter->psz_name)
jname = (*env)->NewStringUTF(env, p_chapter->psz_name);
return (*env)->CallStaticObjectMethod(env, fields.MediaPlayer.clazz,
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.MediaPlayer.clazz,
fields.MediaPlayer.createChapterFromNativeID,
p_chapter->i_time_offset,
p_chapter->i_duration,
jname);
if (jname)
(*env)->DeleteLocalRef(env, jname);
return jobj;
}
jobject
......@@ -640,10 +648,14 @@ mediaplayer_track_to_object(JNIEnv *env, libvlc_track_description_t *p_track)
if (p_track->psz_name)
jname = (*env)->NewStringUTF(env, p_track->psz_name);
return (*env)->CallStaticObjectMethod(env, fields.MediaPlayer.clazz,
jobject jobj = (*env)->CallStaticObjectMethod(env, fields.MediaPlayer.clazz,
fields.MediaPlayer.createTrackDescriptionFromNativeID,
p_track->i_id,
jname);
if (jname)
(*env)->DeleteLocalRef(env, jname);
return jobj;
}
static jobject
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment