Browse Source

use extra environment for sync thread

JNI-88
Volker Birk 7 years ago
parent
commit
849defc87a
  1. 31
      src/org_pEp_jniadapter_AbstractEngine.cc

31
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;
}

Loading…
Cancel
Save