mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-01-23 14:18:07 +00:00
Improved LocalRef (see issue 1925) on Android JNI layer
This commit is contained in:
parent
340d927c3c
commit
11b9ed01d9
1 changed files with 44 additions and 16 deletions
|
|
@ -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,"<init>", "(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,"<init>", "(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,"<init>", "(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,"<init>", "(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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue