Browse Source

less complexity

JNI-88
Volker Birk 7 years ago
parent
commit
7344dc466b
  1. 64
      src/org_pEp_jniadapter_AbstractEngine.cc

64
src/org_pEp_jniadapter_AbstractEngine.cc

@ -17,8 +17,9 @@ namespace pEp {
using namespace pEp::Adapter; using namespace pEp::Adapter;
using namespace utility; using namespace utility;
JNIEnv* thread_env = nullptr; thread_local JNIEnv* thread_env = nullptr;
jobject thread_obj = nullptr; jobject obj = nullptr;
jclass _clazz = nullptr;
jclass messageClass = nullptr; jclass messageClass = nullptr;
jclass identityClass = nullptr; jclass identityClass = nullptr;
@ -31,46 +32,37 @@ namespace pEp {
jmethodID needsFastPollMethodID = nullptr; jmethodID needsFastPollMethodID = nullptr;
class JNISync { class JNISync {
jobject _obj;
JNIEnv * _env;
JavaVM * _jvm; JavaVM * _jvm;
JNIEnv * _sync_env;
jclass _clazz;
public: public:
JNISync(JNIEnv * env, jobject obj) JNISync()
: _env(env), _obj(obj), _jvm(nullptr), _sync_env(nullptr), _clazz(nullptr) { } : _jvm(nullptr) { }
~JNISync() ~JNISync() { }
{
env()->DeleteLocalRef(clazz());
}
jobject obj() { return _obj; }
JavaVM * jvm() JavaVM * jvm()
{ {
if (!_jvm) if (!_jvm)
_env->GetJavaVM(&_jvm); env()->GetJavaVM(&_jvm);
return _jvm; return _jvm;
} }
JNIEnv * env() JNIEnv * env()
{ {
if (!_sync_env) { if (!thread_env) {
#ifdef ANDROID #ifdef ANDROID
jvm()->AttachCurrentThread(&_sync_env, nullptr); jvm()->AttachCurrentThread(&thread_env, nullptr);
#else #else
jvm()->AttachCurrentThread((void **) &_sync_env, nullptr); jvm()->AttachCurrentThread((void **) &thread_env, nullptr);
#endif #endif
} }
return _sync_env; return thread_env;
} }
jclass clazz() jclass clazz()
{ {
if (!_clazz) if (!_clazz)
_clazz = env()->GetObjectClass(obj()); _clazz = env()->GetObjectClass(obj);
return _clazz; return _clazz;
} }
@ -103,14 +95,8 @@ namespace pEp {
jobject msg_ = nullptr; jobject msg_ = nullptr;
jint result = 0; jint result = 0;
if (on_sync_thread()) {
msg_ = o->env()->NewObject(messageClass, messageConstructorMethodID, (jlong) msg); msg_ = o->env()->NewObject(messageClass, messageConstructorMethodID, (jlong) msg);
result = o->env()->CallIntMethod(thread_obj, messageToSendMethodID, msg_); result = o->env()->CallIntMethod(obj, messageToSendMethodID, msg_);
}
else {
msg_ = thread_env->NewObject(messageClass, messageConstructorMethodID, (jlong) msg);
result = thread_env->CallIntMethod(thread_obj, messageToSendMethodID, msg_);
}
return (PEP_STATUS) result; return (PEP_STATUS) result;
} }
@ -119,30 +105,28 @@ namespace pEp {
{ {
jobject me_ = nullptr; jobject me_ = nullptr;
jobject partner_ = 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(env, me, identityClass); me_ = from_identity(o->env(), me, identityClass);
partner_ = from_identity(env, partner, identityClass); partner_ = from_identity(o->env(), partner, identityClass);
jobject signal_ = nullptr; jobject signal_ = nullptr;
{ {
assert(signalClass); assert(signalClass);
jmethodID method_values = env->GetStaticMethodID(signalClass, "values", jmethodID method_values = o->env()->GetStaticMethodID(signalClass, "values",
"()[Lorg/pEp/jniadapter/SyncHandshakeSignal;"); "()[Lorg/pEp/jniadapter/SyncHandshakeSignal;");
assert(method_values); assert(method_values);
jfieldID field_value = env->GetFieldID(signalClass, "value", "I"); jfieldID field_value = o->env()->GetFieldID(signalClass, "value", "I");
assert(field_value); assert(field_value);
jobjectArray values = (jobjectArray) env->CallStaticObjectMethod(signalClass, jobjectArray values = (jobjectArray) o->env()->CallStaticObjectMethod(signalClass,
method_values); method_values);
assert(values); assert(values);
jsize values_size = env->GetArrayLength(values); jsize values_size = o->env()->GetArrayLength(values);
for (jsize i = 0; i < values_size; i++) { for (jsize i = 0; i < values_size; i++) {
jobject element = env->GetObjectArrayElement(values, i); jobject element = o->env()->GetObjectArrayElement(values, i);
assert(element); assert(element);
jint value = env->GetIntField(element, field_value); jint value = o->env()->GetIntField(element, field_value);
if (value == (jint) signal) { if (value == (jint) signal) {
signal_ = element; signal_ = element;
break; break;
@ -150,7 +134,7 @@ namespace pEp {
} }
} }
jint result = env->CallIntMethod(obj, notifyHandShakeMethodID, me_, partner_, signal_); jint result = o->env()->CallIntMethod(obj, notifyHandShakeMethodID, me_, partner_, signal_);
return (PEP_STATUS) result; return (PEP_STATUS) result;
} }
@ -165,10 +149,10 @@ extern "C" {
) )
{ {
thread_env = env; thread_env = env;
thread_obj = me; obj = me;
assert(o == nullptr); assert(o == nullptr);
o = new JNISync(env, me); o = new JNISync();
if (!messageClass) if (!messageClass)
messageClass = reinterpret_cast<jclass>(env->NewGlobalRef(findClass(env, "org/pEp/jniadapter/Message"))); messageClass = reinterpret_cast<jclass>(env->NewGlobalRef(findClass(env, "org/pEp/jniadapter/Message")));

Loading…
Cancel
Save