diff --git a/src/org/pEp/jniadapter/AbstractEngine.java b/src/org/pEp/jniadapter/AbstractEngine.java index ef49c6d..326e60e 100644 --- a/src/org/pEp/jniadapter/AbstractEngine.java +++ b/src/org/pEp/jniadapter/AbstractEngine.java @@ -2,6 +2,9 @@ package org.pEp.jniadapter; import java.util.ArrayList; import java.util.Vector; + +import org.pEp.jniadapter.Sync.DefaultCallback; + import java.io.UnsupportedEncodingException; import java.text.Normalizer; @@ -11,9 +14,10 @@ abstract class AbstractEngine implements AutoCloseable { } private Sync.MessageToSendCallback messageToSendCallback; - private Sync.notifyHandshakeCallback notifyHandshakeCallback; + private Sync.NotifyHandshakeCallback notifyHandshakeCallback; private Sync.NeedsFastPollCallback needsFastPollCallback; + private final static DefaultCallback defaultCallback = new DefaultCallback(); private native void init(); private native void release(); @@ -144,7 +148,7 @@ abstract class AbstractEngine implements AutoCloseable { this.messageToSendCallback = messageToSendCallback; } - public void setnotifyHandshakeCallback(Sync.notifyHandshakeCallback notifyHandshakeCallback) { + public void setNotifyHandshakeCallback(Sync.NotifyHandshakeCallback notifyHandshakeCallback) { this.notifyHandshakeCallback = notifyHandshakeCallback; } @@ -156,7 +160,7 @@ abstract class AbstractEngine implements AutoCloseable { if (needsFastPollCallback != null) { needsFastPollCallback.needsFastPollCallFromC(fast_poll_needed); } else { - return -1; + defaultCallback.needsFastPollCallFromC(fast_poll_needed); } return 0; } @@ -168,7 +172,7 @@ abstract class AbstractEngine implements AutoCloseable { if (notifyHandshakeCallback != null) { notifyHandshakeCallback.notifyHandshake(myself, partner, _signal); } else { - return -1; + defaultCallback.notifyHandshake(myself, partner, _signal); } return 0; } @@ -177,7 +181,7 @@ abstract class AbstractEngine implements AutoCloseable { if (messageToSendCallback != null) { messageToSendCallback.messageToSend(message); } else { - return -1; + defaultCallback.messageToSend(message); } return 0; } diff --git a/src/org/pEp/jniadapter/Sync.java b/src/org/pEp/jniadapter/Sync.java index 5d32705..472e420 100644 --- a/src/org/pEp/jniadapter/Sync.java +++ b/src/org/pEp/jniadapter/Sync.java @@ -4,10 +4,6 @@ import org.pEp.jniadapter.Identity; import org.pEp.jniadapter.Message; import org.pEp.jniadapter.pEpException; -/** - * Created by huss on 02/09/16. - */ - public interface Sync { @@ -19,8 +15,32 @@ public interface Sync { void messageToSend(Message message); } - interface notifyHandshakeCallback { + interface NotifyHandshakeCallback { void notifyHandshake(Identity myself, Identity partner, SyncHandshakeSignal signal); } + + public class DefaultCallback + implements Sync.MessageToSendCallback, Sync.NotifyHandshakeCallback, Sync.NeedsFastPollCallback { + //FIXME: Find where this Exceptions ara catched as they are called but on + //Testing.java there is no crash not crashing + @Override + public void needsFastPollCallFromC(Boolean fast_poll_needed) { + System.out.println("Throwing illegal"); + throw new RuntimeException("Fast poll Callback not set"); + } + + @Override + public void messageToSend(Message message) { + System.out.println("Throwing illegal"); + throw new RuntimeException("Message to send not set"); + } + + @Override + public void notifyHandshake(Identity myself, Identity partner, SyncHandshakeSignal signal) { + System.out.println("Throwing illegal"); + throw new RuntimeException("Notify Handshake not set"); + } + } + } diff --git a/src/org_pEp_jniadapter_AbstractEngine.cc b/src/org_pEp_jniadapter_AbstractEngine.cc index 47c2026..f51d251 100644 --- a/src/org_pEp_jniadapter_AbstractEngine.cc +++ b/src/org_pEp_jniadapter_AbstractEngine.cc @@ -19,6 +19,13 @@ std::ofstream debug_log("debug.log"); #include "throw_pEp_exception.hh" #include "jniutils.hh" +#ifdef ANDROID +#define ATTACH_CURRENT_THREAD(env, args) jvm->AttachCurrentThread(&env, args); +#else +#define ATTACH_CURRENT_THREAD(env, args) jvm->AttachCurrentThread((void **) &env, args); +#endif + + namespace pEp { using namespace pEp::JNIAdapter; using namespace pEp::Adapter; @@ -47,15 +54,15 @@ namespace pEp { JNIEnv *_env; if (on_sync_thread()) { - _env = first_env; + // FIXME: REview if this is the way to go or not + int getEnvStat = jvm->GetEnv((void **) &_env, JNI_VERSION_1_6); + if (getEnvStat == JNI_EDETACHED) { + ATTACH_CURRENT_THREAD(_env, nullptr); + } } else { if (!thread_env) { - #ifdef ANDROID - jvm->AttachCurrentThread(&thread_env, nullptr); - #else - jvm->AttachCurrentThread((void **) &thread_env, nullptr); - #endif + ATTACH_CURRENT_THREAD(thread_env, nullptr); } _env = thread_env; } @@ -65,17 +72,7 @@ namespace pEp { void startup_sync() { - needsFastPollMethodID = env()->GetMethodID( - engineClass, - "needsFastPollCallFromC", - "(Z)I"); - assert(needsFastPollMethodID); - notifyHandShakeMethodID = env()->GetMethodID( - engineClass, - "notifyHandshakeCallFromC", - "(Lorg/pEp/jniadapter/_Identity;Lorg/pEp/jniadapter/_Identity;Lorg/pEp/jniadapter/SyncHandshakeSignal;)I"); - assert(notifyHandShakeMethodID); } void shutdown_sync() @@ -94,7 +91,6 @@ namespace pEp { if (!o) o = new JNISync(); - msg_ = o->env()->NewObject(messageClass, messageConstructorMethodID, (jlong) msg); result = o->env()->CallIntMethod(obj, messageToSendMethodID, msg_); @@ -173,7 +169,7 @@ extern "C" { if (!messageConstructorMethodID) messageConstructorMethodID = env->GetMethodID(messageClass, "", "(J)V"); - + if (!messageToSendMethodID) { messageToSendMethodID = env->GetMethodID( engineClass, @@ -182,6 +178,22 @@ extern "C" { assert(messageToSendMethodID); } + if (!needsFastPollMethodID) { + needsFastPollMethodID = env->GetMethodID( + engineClass, + "needsFastPollCallFromC", + "(Z)I"); + assert(needsFastPollMethodID); + } + + if (!notifyHandShakeMethodID) { + notifyHandShakeMethodID = env->GetMethodID( + engineClass, + "notifyHandshakeCallFromC", + "(Lorg/pEp/jniadapter/_Identity;Lorg/pEp/jniadapter/_Identity;Lorg/pEp/jniadapter/SyncHandshakeSignal;)I"); + assert(notifyHandShakeMethodID); + } + startup(messageToSend, notifyHandshake, o, &JNISync::startup_sync, &JNISync::shutdown_sync); }