From b87dd9f1a0e92bfe71380ab9c9949e537f2be08e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Feb 2018 13:39:13 +0100 Subject: [PATCH] Fixed another leak in Java wrapper caused by listeners --- wrappers/java/jni.mustache | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/wrappers/java/jni.mustache b/wrappers/java/jni.mustache index 26c8a55cc..851aa0236 100644 --- a/wrappers/java/jni.mustache +++ b/wrappers/java/jni.mustache @@ -357,28 +357,36 @@ static {{return}} {{callbackName}}({{params}}) { {{#interfaces}} {{#isSingleListener}} void Java_{{jniPackage}}{{className}}Impl_setListener(JNIEnv* env, jobject thiz, jlong ptr, jobject jlistener) { + {{classCName}} *cptr = ({{classCName}}*)ptr; + {{classCName}}Cbs *cbs = {{cPrefix}}_get_callbacks(cptr); + if (jlistener == NULL) { + jobject listener = (jobject) {{cPrefix}}_cbs_get_user_data(cbs); + {{cPrefix}}_cbs_set_user_data(cbs, NULL); + if (listener != NULL) { + env->DeleteGlobalRef(listener); + } + } else { + jobject listener = env->NewGlobalRef(jlistener); + {{cPrefix}}_cbs_set_user_data(cbs, listener); + {{#callbacksList}} + {{cPrefix}}_cbs_set_{{callback}}(cbs, {{callbackName}}); + {{/callbacksList}} + } +} {{/isSingleListener}} + {{#isMultiListener}} void Java_{{jniPackage}}{{className}}Impl_addListener(JNIEnv* env, jobject thiz, jlong ptr, jobject jlistener) { -{{/isMultiListener}} {{classCName}} *cptr = ({{classCName}}*)ptr; jobject listener = env->NewGlobalRef(jlistener); - {{#isSingleListener}} - {{classCName}}Cbs *cbs = {{cPrefix}}_get_callbacks(cptr); - {{/isSingleListener}} - {{#isMultiListener}} {{classCName}}Cbs *cbs = linphone_factory_create_{{factoryName}}_cbs(NULL); - {{/isMultiListener}} {{cPrefix}}_cbs_set_user_data(cbs, listener); {{#callbacksList}} {{cPrefix}}_cbs_set_{{callback}}(cbs, {{callbackName}}); {{/callbacksList}} - {{#isMultiListener}} {{cPrefix}}_add_callbacks(cptr, cbs); {{cPrefix}}_cbs_unref(cbs); - {{/isMultiListener}} } -{{#isMultiListener}} void Java_{{jniPackage}}{{className}}Impl_removeListener(JNIEnv* env, jobject thiz, jlong ptr, jobject jlistener) { {{classCName}} *cptr = ({{classCName}}*)ptr; @@ -396,7 +404,6 @@ void Java_{{jniPackage}}{{className}}Impl_removeListener(JNIEnv* env, jobject th } } {{/isMultiListener}} - {{/interfaces}} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////