From 849defc87a3deeddd27572e2b668ab258dfa6fec Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Thu, 25 Oct 2018 13:45:18 +0200 Subject: [PATCH] use extra environment for sync thread --- src/org_pEp_jniadapter_AbstractEngine.cc | 31 +++++++++++++++--------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/org_pEp_jniadapter_AbstractEngine.cc b/src/org_pEp_jniadapter_AbstractEngine.cc index cca7fbd..3b92f9e 100644 --- a/src/org_pEp_jniadapter_AbstractEngine.cc +++ b/src/org_pEp_jniadapter_AbstractEngine.cc @@ -101,9 +101,16 @@ namespace pEp { PEP_STATUS messageToSend(message *msg) { jobject msg_ = nullptr; + jint result = 0; - msg_ = thread_env->NewObject(messageClass, messageConstructorMethodID, (jlong) msg); - jint result = thread_env->CallIntMethod(thread_obj, messageToSendMethodID, msg_); + if (on_sync_thread()) { + msg_ = o->env()->NewObject(messageClass, messageConstructorMethodID, (jlong) msg); + result = o->env()->CallIntMethod(thread_obj, messageToSendMethodID, msg_); + } + else { + msg_ = thread_env->NewObject(messageClass, messageConstructorMethodID, (jlong) msg); + result = thread_env->CallIntMethod(thread_obj, messageToSendMethodID, msg_); + } return (PEP_STATUS) result; } @@ -112,28 +119,30 @@ namespace pEp { { jobject me_ = nullptr; jobject partner_ = nullptr; + JNIEnv *env = on_sync_thread() ? o->env() : thread_env; + jobject obj = on_sync_thread() ? o->obj() : thread_obj; - me_ = from_identity(thread_env, me, identityClass); - partner_ = from_identity(thread_env, partner, identityClass); + me_ = from_identity(env, me, identityClass); + partner_ = from_identity(env, partner, identityClass); jobject signal_ = nullptr; { assert(signalClass); - jmethodID method_values = o->env()->GetStaticMethodID(signalClass, "values", + jmethodID method_values = env->GetStaticMethodID(signalClass, "values", "()[Lorg/pEp/jniadapter/SyncHandshakeSignal;"); assert(method_values); - jfieldID field_value = o->env()->GetFieldID(signalClass, "value", "I"); + jfieldID field_value = env->GetFieldID(signalClass, "value", "I"); assert(field_value); - jobjectArray values = (jobjectArray) o->env()->CallStaticObjectMethod(signalClass, + jobjectArray values = (jobjectArray) env->CallStaticObjectMethod(signalClass, method_values); assert(values); - jsize values_size = o->env()->GetArrayLength(values); + jsize values_size = env->GetArrayLength(values); for (jsize i = 0; i < values_size; i++) { - jobject element = o->env()->GetObjectArrayElement(values, i); + jobject element = env->GetObjectArrayElement(values, i); assert(element); - jint value = o->env()->GetIntField(element, field_value); + jint value = env->GetIntField(element, field_value); if (value == (jint) signal) { signal_ = element; break; @@ -141,7 +150,7 @@ namespace pEp { } } - jint result = o->env()->CallIntMethod(o->obj(), notifyHandShakeMethodID, me_, partner_, signal_); + jint result = env->CallIntMethod(obj, notifyHandShakeMethodID, me_, partner_, signal_); return (PEP_STATUS) result; }