diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index a56e1d14b..76cbbad5c 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -170,7 +170,7 @@ jobject getProxy(JNIEnv *env, LinphoneProxyConfig *proxy, jobject core){ jobject jobj=0; if (proxy!=NULL){ - jclass proxyClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneProxyConfigImpl")); + jclass proxyClass = (jclass)env->FindClass("org/linphone/core/LinphoneProxyConfigImpl"); jmethodID proxyCtrId = env->GetMethodID(proxyClass,"", "(Lorg/linphone/core/LinphoneCoreImpl;J)V"); void *up=linphone_proxy_config_get_user_data(proxy); @@ -188,7 +188,7 @@ jobject getProxy(JNIEnv *env, LinphoneProxyConfig *proxy, jobject core){ linphone_proxy_config_set_user_data(proxy,(void*)env->NewWeakGlobalRef(jobj)); } } - env->DeleteGlobalRef(proxyClass); + env->DeleteLocalRef(proxyClass); } return jobj; } @@ -197,7 +197,7 @@ jobject getCall(JNIEnv *env, LinphoneCall *call){ jobject jobj=0; if (call!=NULL){ - jclass callClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneCallImpl")); + jclass callClass = (jclass)env->FindClass("org/linphone/core/LinphoneCallImpl"); jmethodID callCtrId = env->GetMethodID(callClass,"", "(J)V"); void *up=linphone_call_get_user_pointer(call); @@ -210,7 +210,7 @@ jobject getCall(JNIEnv *env, LinphoneCall *call){ }else{ jobj=(jobject)up; } - env->DeleteGlobalRef(callClass); + env->DeleteLocalRef(callClass); } return jobj; } @@ -219,7 +219,7 @@ jobject getChatMessage(JNIEnv *env, LinphoneChatMessage *msg){ jobject jobj = 0; if (msg != NULL){ - jclass chatMessageClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneChatMessageImpl")); + jclass chatMessageClass = (jclass)env->FindClass("org/linphone/core/LinphoneChatMessageImpl"); jmethodID chatMessageCtrId = env->GetMethodID(chatMessageClass,"", "(J)V"); void *up = linphone_chat_message_get_user_data(msg); @@ -231,7 +231,7 @@ jobject getChatMessage(JNIEnv *env, LinphoneChatMessage *msg){ } else { jobj = (jobject)up; } - env->DeleteGlobalRef(chatMessageClass); + env->DeleteLocalRef(chatMessageClass); } return jobj; } @@ -240,14 +240,14 @@ jobject getEvent(JNIEnv *env, LinphoneEvent *lev){ if (lev==NULL) return NULL; jobject jev=(jobject)linphone_event_get_user_data(lev); if (jev==NULL){ - jclass linphoneEventClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneEventImpl")); + jclass linphoneEventClass = (jclass)env->FindClass("org/linphone/core/LinphoneEventImpl"); jmethodID linphoneEventCtrId = env->GetMethodID(linphoneEventClass,"", "(J)V"); jev=env->NewObject(linphoneEventClass,linphoneEventCtrId,(jlong)linphone_event_ref(lev)); jev=env->NewGlobalRef(jev); linphone_event_set_user_data(lev,jev); - env->DeleteGlobalRef(linphoneEventClass); + env->DeleteLocalRef(linphoneEventClass); } return jev; } @@ -577,7 +577,11 @@ public: } LinphoneCoreVTable *table = linphone_core_get_current_vtable(lc); LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_v_table_get_user_data(table); - env->CallVoidMethod(lcData->listener,lcData->displayStatusId,lcData->core,message ? env->NewStringUTF(message) : NULL); + jstring msg = message ? env->NewStringUTF(message) : NULL; + env->CallVoidMethod(lcData->listener,lcData->displayStatusId,lcData->core,msg); + if (msg) { + env->DeleteLocalRef(msg); + } } static void authInfoRequested(LinphoneCore *lc, const char *realm, const char *username, const char *domain) { JNIEnv *env = 0; @@ -588,12 +592,24 @@ public: } LinphoneCoreVTable *table = linphone_core_get_current_vtable(lc); LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_v_table_get_user_data(table); + jstring r = realm ? env->NewStringUTF(realm) : NULL; + jstring u = username ? env->NewStringUTF(username) : NULL; + jstring d = domain ? env->NewStringUTF(domain) : NULL; env->CallVoidMethod(lcData->listener, lcData->authInfoRequestedId, lcData->core, - realm ? env->NewStringUTF(realm):NULL, - username ? env->NewStringUTF(username) : NULL, - domain ? env->NewStringUTF(domain) : NULL); + r, + u, + d); + if (r) { + env->DeleteLocalRef(r); + } + if (u) { + env->DeleteLocalRef(u); + } + if (d) { + env->DeleteLocalRef(d); + } } static void globalStateChange(LinphoneCore *lc, LinphoneGlobalState gstate,const char* message) { JNIEnv *env = 0; @@ -604,11 +620,15 @@ public: } LinphoneCoreVTable *table = linphone_core_get_current_vtable(lc); LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_v_table_get_user_data(table); + jstring msg = message ? env->NewStringUTF(message) : NULL; env->CallVoidMethod(lcData->listener ,lcData->globalStateId ,lcData->core ,env->CallStaticObjectMethod(lcData->globalStateClass,lcData->globalStateFromIntId,(jint)gstate), - message ? env->NewStringUTF(message) : NULL); + msg); + if (msg) { + env->DeleteLocalRef(msg); + } } static void registrationStateChange(LinphoneCore *lc, LinphoneProxyConfig* proxy,LinphoneRegistrationState state,const char* message) { JNIEnv *env = 0; @@ -620,12 +640,16 @@ public: } LinphoneCoreVTable *table = linphone_core_get_current_vtable(lc); LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_v_table_get_user_data(table); + jstring msg = message ? env->NewStringUTF(message) : NULL; env->CallVoidMethod(lcData->listener ,lcData->registrationStateId ,lcData->core ,(jproxy=getProxy(env,proxy,lcData->core)) ,env->CallStaticObjectMethod(lcData->registrationStateClass,lcData->registrationStateFromIntId,(jint)state), - message ? env->NewStringUTF(message) : NULL); + msg); + if (msg) { + env->DeleteLocalRef(msg); + } } static void callStateChange(LinphoneCore *lc, LinphoneCall* call,LinphoneCallState state,const char* message) { @@ -638,16 +662,20 @@ public: } LinphoneCoreVTable *table = linphone_core_get_current_vtable(lc); LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_v_table_get_user_data(table); + jstring msg = message ? env->NewStringUTF(message) : NULL; env->CallVoidMethod(lcData->listener ,lcData->callStateId ,lcData->core ,(jcall=getCall(env,call)) ,env->CallStaticObjectMethod(lcData->callStateClass,lcData->callStateFromIntId,(jint)state), - message ? env->NewStringUTF(message) : NULL); - if (state==LinphoneCallReleased){ + msg); + if (state==LinphoneCallReleased) { linphone_call_set_user_pointer(call,NULL); env->DeleteGlobalRef(jcall); } + if (msg) { + env->DeleteLocalRef(msg); + } } static void callEncryptionChange(LinphoneCore *lc, LinphoneCall* call, bool_t encrypted,const char* authentication_token) { JNIEnv *env = 0;