diff options
Diffstat (limited to 'java/jni/com_zerotierone_sdk_Node.cpp')
-rw-r--r-- | java/jni/com_zerotierone_sdk_Node.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index 5fd22dab..72e9fe10 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -255,15 +255,36 @@ namespace { } } - int WirePacketSendFunction(ZT1_Node *node,void *userData,const struct sockaddr_storage *,unsigned int,const void *,unsigned int) + int WirePacketSendFunction(ZT1_Node *node,void *userData,\ + const struct sockaddr_storage *address, + unsigned int linkDesparation, + const void *buffer, + unsigned int bufferSize) { JniRef *ref = (JniRef*)userData; assert(ref->node == node); JNIEnv *env = ref->env; + jclass packetSenderClass = NULL; + jmethodID callbackMethod = NULL; - return 0; + packetSenderClass = env->GetObjectClass(ref->packetSender); + if(packetSenderClass == NULL) + { + return -1; + } + + callbackMethod = env->GetMethodID(packetSenderClass, + "onSendPacketRequested", "(Ljava/lang/String;I[B)I"); + if(callbackMethod == NULL) + { + return -2; + } + jobject addressObj = newInetAddress(env, *address); + jbyteArray bufferObj = env->NewByteArray(bufferSize); + env->SetByteArrayRegion(bufferObj, 0, bufferSize, (jbyte*)buffer); + return env->CallIntMethod(packetSenderClass, callbackMethod, addressObj, linkDesparation, bufferObj); } typedef std::map<uint64_t, JniRef*> NodeMap; |