Browse Source

Add default Sync callback and fix env retrieval

JNI-88
Hussein Kasem 7 years ago
parent
commit
0e478fd6df
  1. 14
      src/org/pEp/jniadapter/AbstractEngine.java
  2. 30
      src/org/pEp/jniadapter/Sync.java
  3. 46
      src/org_pEp_jniadapter_AbstractEngine.cc

14
src/org/pEp/jniadapter/AbstractEngine.java

@ -2,6 +2,9 @@ package org.pEp.jniadapter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Vector; import java.util.Vector;
import org.pEp.jniadapter.Sync.DefaultCallback;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.text.Normalizer; import java.text.Normalizer;
@ -11,9 +14,10 @@ abstract class AbstractEngine implements AutoCloseable {
} }
private Sync.MessageToSendCallback messageToSendCallback; private Sync.MessageToSendCallback messageToSendCallback;
private Sync.notifyHandshakeCallback notifyHandshakeCallback; private Sync.NotifyHandshakeCallback notifyHandshakeCallback;
private Sync.NeedsFastPollCallback needsFastPollCallback; private Sync.NeedsFastPollCallback needsFastPollCallback;
private final static DefaultCallback defaultCallback = new DefaultCallback();
private native void init(); private native void init();
private native void release(); private native void release();
@ -144,7 +148,7 @@ abstract class AbstractEngine implements AutoCloseable {
this.messageToSendCallback = messageToSendCallback; this.messageToSendCallback = messageToSendCallback;
} }
public void setnotifyHandshakeCallback(Sync.notifyHandshakeCallback notifyHandshakeCallback) { public void setNotifyHandshakeCallback(Sync.NotifyHandshakeCallback notifyHandshakeCallback) {
this.notifyHandshakeCallback = notifyHandshakeCallback; this.notifyHandshakeCallback = notifyHandshakeCallback;
} }
@ -156,7 +160,7 @@ abstract class AbstractEngine implements AutoCloseable {
if (needsFastPollCallback != null) { if (needsFastPollCallback != null) {
needsFastPollCallback.needsFastPollCallFromC(fast_poll_needed); needsFastPollCallback.needsFastPollCallFromC(fast_poll_needed);
} else { } else {
return -1; defaultCallback.needsFastPollCallFromC(fast_poll_needed);
} }
return 0; return 0;
} }
@ -168,7 +172,7 @@ abstract class AbstractEngine implements AutoCloseable {
if (notifyHandshakeCallback != null) { if (notifyHandshakeCallback != null) {
notifyHandshakeCallback.notifyHandshake(myself, partner, _signal); notifyHandshakeCallback.notifyHandshake(myself, partner, _signal);
} else { } else {
return -1; defaultCallback.notifyHandshake(myself, partner, _signal);
} }
return 0; return 0;
} }
@ -177,7 +181,7 @@ abstract class AbstractEngine implements AutoCloseable {
if (messageToSendCallback != null) { if (messageToSendCallback != null) {
messageToSendCallback.messageToSend(message); messageToSendCallback.messageToSend(message);
} else { } else {
return -1; defaultCallback.messageToSend(message);
} }
return 0; return 0;
} }

30
src/org/pEp/jniadapter/Sync.java

@ -4,10 +4,6 @@ import org.pEp.jniadapter.Identity;
import org.pEp.jniadapter.Message; import org.pEp.jniadapter.Message;
import org.pEp.jniadapter.pEpException; import org.pEp.jniadapter.pEpException;
/**
* Created by huss on 02/09/16.
*/
public interface Sync { public interface Sync {
@ -19,8 +15,32 @@ public interface Sync {
void messageToSend(Message message); void messageToSend(Message message);
} }
interface notifyHandshakeCallback { interface NotifyHandshakeCallback {
void notifyHandshake(Identity myself, Identity partner, SyncHandshakeSignal signal); 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");
}
}
} }

46
src/org_pEp_jniadapter_AbstractEngine.cc

@ -19,6 +19,13 @@ std::ofstream debug_log("debug.log");
#include "throw_pEp_exception.hh" #include "throw_pEp_exception.hh"
#include "jniutils.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 { namespace pEp {
using namespace pEp::JNIAdapter; using namespace pEp::JNIAdapter;
using namespace pEp::Adapter; using namespace pEp::Adapter;
@ -47,15 +54,15 @@ namespace pEp {
JNIEnv *_env; JNIEnv *_env;
if (on_sync_thread()) { 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 { else {
if (!thread_env) { if (!thread_env) {
#ifdef ANDROID ATTACH_CURRENT_THREAD(thread_env, nullptr);
jvm->AttachCurrentThread(&thread_env, nullptr);
#else
jvm->AttachCurrentThread((void **) &thread_env, nullptr);
#endif
} }
_env = thread_env; _env = thread_env;
} }
@ -65,17 +72,7 @@ namespace pEp {
void startup_sync() 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() void shutdown_sync()
@ -94,7 +91,6 @@ namespace pEp {
if (!o) if (!o)
o = new JNISync(); o = new JNISync();
msg_ = o->env()->NewObject(messageClass, messageConstructorMethodID, (jlong) msg); msg_ = o->env()->NewObject(messageClass, messageConstructorMethodID, (jlong) msg);
result = o->env()->CallIntMethod(obj, messageToSendMethodID, msg_); result = o->env()->CallIntMethod(obj, messageToSendMethodID, msg_);
@ -182,6 +178,22 @@ extern "C" {
assert(messageToSendMethodID); 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<JNISync>(messageToSend, notifyHandshake, o, &JNISync::startup_sync, &JNISync::shutdown_sync); startup<JNISync>(messageToSend, notifyHandshake, o, &JNISync::startup_sync, &JNISync::shutdown_sync);
} }

Loading…
Cancel
Save