diff --git a/src/org_pEp_jniadapter_AbstractEngine.cc b/src/org_pEp_jniadapter_AbstractEngine.cc index cf7b9f7..8dd4a38 100644 --- a/src/org_pEp_jniadapter_AbstractEngine.cc +++ b/src/org_pEp_jniadapter_AbstractEngine.cc @@ -198,29 +198,22 @@ extern "C" { ///////////////////////////////////////////////////////////////////////// static jobject sync_obj = NULL; - static JavaVM* sync_jvm = NULL; + static JNIEnv* sync_env = NULL; + static jmethodID showHandShakeMethodID = NULL; + static jmethodID messageToSendMethodID = NULL; + static jclass messageClass = NULL; + static jmethodID messageConstructorMethodID = NULL; // Called by sync thread only PEP_STATUS show_handshake(void *obj, pEp_identity *me, pEp_identity *partner) { - JNIEnv* env; jobject me_ = NULL; jobject partner_ = NULL; - sync_jvm->AttachCurrentThread(&env, NULL); + me_ = from_identity(sync_env, me); + partner_ = from_identity(sync_env, partner); - jclass clazz = env->GetObjectClass(sync_obj); - jmethodID methodID = env->GetMethodID( - clazz, - "showHandshakeCallFromC", - "(Lorg/pEp/jniadapter/_Identity;Lorg/pEp/jniadapter/_Identity;)I"); - - env->DeleteLocalRef(clazz); - - me_ = from_identity(env, me); - partner_ = from_identity(env, partner); - - jint result = env->CallIntMethod(sync_obj, methodID, me_, partner_); + jint result = sync_env->CallIntMethod(sync_obj, showHandShakeMethodID, me_, partner_); return (PEP_STATUS) result; } @@ -228,26 +221,11 @@ extern "C" { // Called by sync thread only PEP_STATUS message_to_send(void *obj, message *msg) { - JNIEnv* env; jobject msg_ = NULL; - sync_jvm->AttachCurrentThread(&env, NULL); - - jclass clazz = env->GetObjectClass(sync_obj); - jmethodID methodID = env->GetMethodID( - clazz, - "messageToSendCallFromC", - "(Lorg/pEp/jniadapter/Message;)I"); + msg_ = sync_env->NewObject(messageClass, messageConstructorMethodID, (jlong) msg); - env->DeleteLocalRef(clazz); - - jclass clazz_msg_ = findClass(env, "org/pEp/jniadapter/Message"); - assert(clazz_msg_); - jmethodID constructor_msg_ = env->GetMethodID(clazz_msg_, "", "(J)V"); - assert(constructor_msg_); - msg_ = env->NewObject(clazz_msg_, constructor_msg_, (jlong) msg); - - jint result = env->CallIntMethod(sync_obj, methodID, msg_); + jint result = sync_env->CallIntMethod(sync_obj, messageToSendMethodID, msg_); return (PEP_STATUS) result; } @@ -277,17 +255,42 @@ extern "C" { return msg; } - typedef struct _sync_thread_arg { + typedef struct _sync_thread_arg_t { PEP_SESSION session; locked_queue< sync_msg_t * > *queue; - } sync_thread_arg; + JavaVM* sync_jvm; + } sync_thread_arg_t; static void *sync_thread_routine(void *arg) { - sync_thread_arg *a = (sync_thread_arg*)arg; + sync_thread_arg_t *a = (sync_thread_arg_t*)arg; PEP_SESSION session = (PEP_SESSION) a->session; + a->sync_jvm->AttachCurrentThread(&sync_env, NULL); + + jclass clazz = sync_env->GetObjectClass(sync_obj); + + showHandShakeMethodID = sync_env->GetMethodID( + clazz, + "showHandshakeCallFromC", + "(Lorg/pEp/jniadapter/_Identity;Lorg/pEp/jniadapter/_Identity;)I"); + assert(showHandShakeMethodID); + + messageToSendMethodID = sync_env->GetMethodID( + clazz, + "messageToSendCallFromC", + "(Lorg/pEp/jniadapter/Message;)I"); + assert(messageToSendMethodID); + + sync_env->DeleteLocalRef(clazz); + + messageClass = findClass(sync_env, "org/pEp/jniadapter/Message"); + assert(messageClass); + + messageConstructorMethodID = sync_env->GetMethodID(messageClass, "", "(J)V"); + assert(messageConstructorMethodID); + PEP_STATUS status = do_sync_protocol(session, a->queue); locked_queue< sync_msg_t * > *queue = (locked_queue< sync_msg_t * > *) arg; @@ -298,6 +301,10 @@ extern "C" { free_sync_msg(msg); } + sync_env->DeleteLocalRef(messageClass); + + a->sync_jvm->DetachCurrentThread(); + delete queue; free(a); @@ -338,8 +345,14 @@ extern "C" { env->SetLongField(obj, queue_handle, (jlong) queue); // for callbacks - env->GetJavaVM(&sync_jvm); sync_obj = env->NewGlobalRef(obj); + sync_thread_arg_t *a = (sync_thread_arg_t*) malloc(sizeof(sync_thread_arg_t)); + assert(a); + a->session = session; + a->queue = queue; + env->GetJavaVM(&a->sync_jvm); + + sync_session = session; register_sync_callbacks(session, (void *) queue, @@ -348,12 +361,6 @@ extern "C" { inject_sync_msg, retrieve_next_sync_msg); - sync_thread_arg *a = (sync_thread_arg*) malloc(sizeof(sync_thread_arg)); - assert(a); - a->session = session; - a->queue = queue; - - sync_session = session; pthread_create(thread, NULL, sync_thread_routine, (void *) a); }