diff --git a/src/org/pEp/jniadapter/AbstractEngine.java b/src/org/pEp/jniadapter/AbstractEngine.java index 3c8b35b..ceda89d 100644 --- a/src/org/pEp/jniadapter/AbstractEngine.java +++ b/src/org/pEp/jniadapter/AbstractEngine.java @@ -14,13 +14,18 @@ abstract class AbstractEngine implements AutoCloseable { private Sync.notifyHandshakeCallback notifyHandshakeCallback; private Sync.NeedsFastPollCallback needsFastPollCallback; + private native void init(); + private native void release(); + public AbstractEngine() throws pEpException { synchronized (AbstractEngine.class) { + init(); } } final public void close() { synchronized (AbstractEngine.class){ + release(); } } diff --git a/src/org_pEp_jniadapter_AbstractEngine.cc b/src/org_pEp_jniadapter_AbstractEngine.cc index 4faf05c..8640629 100644 --- a/src/org_pEp_jniadapter_AbstractEngine.cc +++ b/src/org_pEp_jniadapter_AbstractEngine.cc @@ -1,5 +1,12 @@ #include "org_pEp_jniadapter_AbstractEngine.h" +#ifndef ANDROID +#ifndef NDEBUG +#include +std::ofstream debug_log("debug.log"); +#endif +#endif + #include #include #include @@ -18,7 +25,8 @@ namespace pEp { using namespace utility; JavaVM *jvm= nullptr; - thread_local JNIEnv* thread_env = nullptr; + thread_local JNIEnv *thread_env = nullptr; + JNIEnv *first_env = nullptr; jobject obj = nullptr; jclass _clazz = nullptr; @@ -36,14 +44,23 @@ namespace pEp { public: JNIEnv * env() { - if (!thread_env) { - #ifdef ANDROID - jvm->AttachCurrentThread(&thread_env, nullptr); - #else - jvm->AttachCurrentThread((void **) &thread_env, nullptr); - #endif + JNIEnv *_env; + + if (on_sync_thread()) { + _env = first_env; + } + else { + if (!thread_env) { + #ifdef ANDROID + jvm->AttachCurrentThread(&thread_env, nullptr); + #else + jvm->AttachCurrentThread((void **) &thread_env, nullptr); + #endif + } + _env = thread_env; } - return thread_env; + + return _env; } void startup_sync() @@ -128,6 +145,9 @@ extern "C" { jobject me ) { + if (!first_env) + first_env = env; + env->GetJavaVM(&jvm); thread_env = env; obj = me;