Update JNI code to reflect new ZeroTier API

This commit is contained in:
Grant Limberg 2017-07-12 11:34:53 -07:00
parent 0a11dd2d24
commit d8f1c3dff7
6 changed files with 202 additions and 255 deletions

View File

@ -34,6 +34,7 @@ LOCAL_SRC_FILES := \
$(ZT1)/node/Switch.cpp \ $(ZT1)/node/Switch.cpp \
$(ZT1)/node/Tag.cpp \ $(ZT1)/node/Tag.cpp \
$(ZT1)/node/Topology.cpp \ $(ZT1)/node/Topology.cpp \
$(ZT1)/node/Trace.cpp \
$(ZT1)/node/Utils.cpp $(ZT1)/node/Utils.cpp

View File

@ -210,88 +210,74 @@ namespace {
void *userData, void *userData,
void *threadData, void *threadData,
enum ZT_Event event, enum ZT_Event event,
const void *data) const void *data) {
{
LOGV("EventCallback"); LOGV("EventCallback");
JniRef *ref = (JniRef*)userData; JniRef *ref = (JniRef *) userData;
if(ref->node != node && event != ZT_EVENT_UP) if (ref->node != node && event != ZT_EVENT_UP) {
{
LOGE("Nodes not equal. ref->node %p, node %p. Event: %d", ref->node, node, event); LOGE("Nodes not equal. ref->node %p, node %p. Event: %d", ref->node, node, event);
return; return;
} }
JNIEnv *env = NULL; JNIEnv *env = NULL;
ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); ref->jvm->GetEnv((void **) &env, JNI_VERSION_1_6);
jclass eventListenerClass = env->GetObjectClass(ref->eventListener); jclass eventListenerClass = env->GetObjectClass(ref->eventListener);
if(eventListenerClass == NULL) if (eventListenerClass == NULL) {
{
LOGE("Couldn't class for EventListener instance"); LOGE("Couldn't class for EventListener instance");
return; return;
} }
jmethodID onEventMethod = lookup.findMethod(eventListenerClass, jmethodID onEventMethod = lookup.findMethod(eventListenerClass,
"onEvent", "(Lcom/zerotier/sdk/Event;)V"); "onEvent", "(Lcom/zerotier/sdk/Event;)V");
if(onEventMethod == NULL) if (onEventMethod == NULL) {
{
LOGE("Couldn't find onEvent method"); LOGE("Couldn't find onEvent method");
return; return;
} }
jmethodID onTraceMethod = lookup.findMethod(eventListenerClass, jmethodID onTraceMethod = lookup.findMethod(eventListenerClass,
"onTrace", "(Ljava/lang/String;)V"); "onTrace", "(Ljava/lang/String;)V");
if(onTraceMethod == NULL) if (onTraceMethod == NULL) {
{
LOGE("Couldn't find onTrace method"); LOGE("Couldn't find onTrace method");
return; return;
} }
jobject eventObject = createEvent(env, event); jobject eventObject = createEvent(env, event);
if(eventObject == NULL) if (eventObject == NULL) {
{
return; return;
} }
switch(event) switch (event) {
{ case ZT_EVENT_UP: {
case ZT_EVENT_UP:
{
LOGD("Event Up"); LOGD("Event Up");
env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject);
break; break;
} }
case ZT_EVENT_OFFLINE: case ZT_EVENT_OFFLINE: {
{
LOGD("Event Offline"); LOGD("Event Offline");
env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject);
break; break;
} }
case ZT_EVENT_ONLINE: case ZT_EVENT_ONLINE: {
{
LOGD("Event Online"); LOGD("Event Online");
env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject);
break; break;
} }
case ZT_EVENT_DOWN: case ZT_EVENT_DOWN: {
{
LOGD("Event Down"); LOGD("Event Down");
env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject);
break; break;
} }
case ZT_EVENT_FATAL_ERROR_IDENTITY_COLLISION: case ZT_EVENT_FATAL_ERROR_IDENTITY_COLLISION: {
{
LOGV("Identity Collision"); LOGV("Identity Collision");
// call onEvent() // call onEvent()
env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject);
} }
break; break;
case ZT_EVENT_TRACE: case ZT_EVENT_TRACE: {
{
LOGV("Trace Event"); LOGV("Trace Event");
// call onTrace() // call onTrace()
if(data != NULL) if (data != NULL) {
{ const char *message = (const char *) data;
const char* message = (const char*)data;
jstring messageStr = env->NewStringUTF(message); jstring messageStr = env->NewStringUTF(message);
env->CallVoidMethod(ref->eventListener, onTraceMethod, messageStr); env->CallVoidMethod(ref->eventListener, onTraceMethod, messageStr);
} }
@ -302,15 +288,124 @@ namespace {
} }
} }
long DataStoreGetFunction(ZT_Node *node, void StatePutFunction(
ZT_Node *node,
void *userData, void *userData,
void *threadData, void *threadData,
const char *objectName, enum ZT_StateObjectType type,
void *buffer, const uint64_t id[2],
unsigned long bufferSize, const void *buffer,
unsigned long bufferIndex, int bufferLength) {
unsigned long *out_objectSize) char p[4096] = {0};
bool secure = false;
switch (type) {
case ZT_STATE_OBJECT_IDENTITY_PUBLIC:
snprintf(p, sizeof(p), "identity.public");
break;
case ZT_STATE_OBJECT_IDENTITY_SECRET:
snprintf(p, sizeof(p), "identity.secret");
secure = true;
break;
case ZT_STATE_OBJECT_PLANET:
snprintf(p, sizeof(p), "planet");
break;
case ZT_STATE_OBJECT_MOON:
snprintf(p, sizeof(p), "moons.d/%.16llx", (unsigned long long)id[0]);
break;
case ZT_STATE_OBJECT_NETWORK_CONFIG:
snprintf(p, sizeof(p), "networks.d/%.16llx", (unsigned long long)id[0]);
break;
case ZT_STATE_OBJECT_PEER:
snprintf(p, sizeof(p), "peers.d/%.10llx", (unsigned long long)id[0]);
break;
default:
return;
}
JniRef *ref = (JniRef*)userData;
JNIEnv *env = NULL;
ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6);
jclass dataStorePutClass = env->GetObjectClass(ref->dataStorePutListener);
if (dataStorePutClass == NULL)
{ {
LOGE("Couldn't find class for DataStorePutListener instance");
return;
}
jmethodID dataStorePutCallbackMethod = lookup.findMethod(
dataStorePutClass,
"onDataStorePut",
"(Ljava/lang/String;[BZ)I");
if(dataStorePutCallbackMethod == NULL)
{
LOGE("Couldn't find onDataStorePut method");
return;
}
jmethodID deleteMethod = lookup.findMethod(dataStorePutClass,
"onDelete", "(Ljava/lang/String;)I");
if(deleteMethod == NULL)
{
LOGE("Couldn't find onDelete method");
return;
}
jstring nameStr = env->NewStringUTF(p);
if (bufferLength >= 0) {
LOGD("JNI: Write file: %s", p);
// set operation
jbyteArray bufferObj = env->NewByteArray(bufferLength);
if(env->ExceptionCheck() || bufferObj == NULL)
{
LOGE("Error creating byte array buffer!");
return;
}
env->SetByteArrayRegion(bufferObj, 0, bufferLength, (jbyte*)buffer);
env->CallIntMethod(ref->dataStorePutListener,
dataStorePutCallbackMethod,
nameStr, bufferObj, secure);
} else {
LOGD("JNI: Delete file: %s", p);
env->CallIntMethod(ref->dataStorePutListener, deleteMethod, nameStr);
}
}
int StateGetFunction(
ZT_Node *node,
void *userData,
void *threadData,
ZT_StateObjectType type,
const uint64_t id[2],
void *buffer,
unsigned int bufferLength) {
char p[4096] = {0};
switch (type) {
case ZT_STATE_OBJECT_IDENTITY_PUBLIC:
snprintf(p, sizeof(p), "identity.public");
break;
case ZT_STATE_OBJECT_IDENTITY_SECRET:
snprintf(p, sizeof(p), "identity.secret");
break;
case ZT_STATE_OBJECT_PLANET:
snprintf(p, sizeof(p), "planet");
break;
case ZT_STATE_OBJECT_MOON:
snprintf(p, sizeof(p), "moons.d/%.16llx", (unsigned long long)id[0]);
break;
case ZT_STATE_OBJECT_NETWORK_CONFIG:
snprintf(p, sizeof(p), "networks.d/%.16llx", (unsigned long long)id[0]);
break;
case ZT_STATE_OBJECT_PEER:
snprintf(p, sizeof(p), "peers.d/%.10llx", (unsigned long long)id[0]);
break;
default:
return -1;
}
JniRef *ref = (JniRef*)userData; JniRef *ref = (JniRef*)userData;
JNIEnv *env = NULL; JNIEnv *env = NULL;
ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6);
@ -325,134 +420,46 @@ namespace {
jmethodID dataStoreGetCallbackMethod = lookup.findMethod( jmethodID dataStoreGetCallbackMethod = lookup.findMethod(
dataStoreGetClass, dataStoreGetClass,
"onDataStoreGet", "onDataStoreGet",
"(Ljava/lang/String;[BJ[J)J"); "(Ljava/lang/String;[B)J");
if(dataStoreGetCallbackMethod == NULL) if(dataStoreGetCallbackMethod == NULL)
{ {
LOGE("Couldn't find onDataStoreGet method"); LOGE("Couldn't find onDataStoreGet method");
return -2; return -2;
} }
jstring nameStr = env->NewStringUTF(objectName); jstring nameStr = env->NewStringUTF(p);
if(nameStr == NULL) if(nameStr == NULL)
{ {
LOGE("Error creating name string object"); LOGE("Error creating name string object");
return -2; // out of memory return -2; // out of memory
} }
jbyteArray bufferObj = env->NewByteArray(bufferSize); jbyteArray bufferObj = env->NewByteArray(bufferLength);
if(bufferObj == NULL) if(bufferObj == NULL)
{ {
LOGE("Error creating byte[] buffer of size: %lu", bufferSize); LOGE("Error creating byte[] buffer of size: %u", bufferLength);
return -2; return -2;
} }
jlongArray objectSizeObj = env->NewLongArray(1); LOGV("Calling onDataStoreGet(%s, %p)", p, buffer);
if(objectSizeObj == NULL)
{
LOGE("Error creating long[1] array for actual object size");
return -2; // couldn't create long[1] array
}
LOGV("Calling onDataStoreGet(%s, %p, %lu, %p)", return (int)env->CallLongMethod(
objectName, buffer, bufferIndex, objectSizeObj); ref->dataStoreGetListener,
dataStoreGetCallbackMethod,
long retval = (long)env->CallLongMethod( nameStr,
ref->dataStoreGetListener, dataStoreGetCallbackMethod, bufferObj);
nameStr, bufferObj, (jlong)bufferIndex, objectSizeObj);
if(retval > 0)
{
void *data = env->GetPrimitiveArrayCritical(bufferObj, NULL);
memcpy(buffer, data, retval);
env->ReleasePrimitiveArrayCritical(bufferObj, data, 0);
jlong *objSize = (jlong*)env->GetPrimitiveArrayCritical(objectSizeObj, NULL);
*out_objectSize = (unsigned long)objSize[0];
env->ReleasePrimitiveArrayCritical(objectSizeObj, objSize, 0);
}
LOGV("Out Object Size: %lu", *out_objectSize);
return retval;
}
int DataStorePutFunction(ZT_Node *node,
void *userData,
void *threadData,
const char *objectName,
const void *buffer,
unsigned long bufferSize,
int secure)
{
JniRef *ref = (JniRef*)userData;
JNIEnv *env = NULL;
ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6);
jclass dataStorePutClass = env->GetObjectClass(ref->dataStorePutListener);
if(dataStorePutClass == NULL)
{
LOGE("Couldn't find class for DataStorePutListener instance");
return -1;
}
jmethodID dataStorePutCallbackMethod = lookup.findMethod(
dataStorePutClass,
"onDataStorePut",
"(Ljava/lang/String;[BZ)I");
if(dataStorePutCallbackMethod == NULL)
{
LOGE("Couldn't find onDataStorePut method");
return -2;
}
jmethodID deleteMethod = lookup.findMethod(dataStorePutClass,
"onDelete", "(Ljava/lang/String;)I");
if(deleteMethod == NULL)
{
LOGE("Couldn't find onDelete method");
return -3;
}
jstring nameStr = env->NewStringUTF(objectName);
if(buffer == NULL)
{
LOGD("JNI: Delete file: %s", objectName);
// delete operation
return env->CallIntMethod(
ref->dataStorePutListener, deleteMethod, nameStr);
}
else
{
LOGD("JNI: Write file: %s", objectName);
// set operation
jbyteArray bufferObj = env->NewByteArray(bufferSize);
if(env->ExceptionCheck() || bufferObj == NULL)
{
LOGE("Error creating byte array buffer!");
return -4;
}
env->SetByteArrayRegion(bufferObj, 0, bufferSize, (jbyte*)buffer);
bool bsecure = secure != 0;
return env->CallIntMethod(ref->dataStorePutListener,
dataStorePutCallbackMethod,
nameStr, bufferObj, bsecure);
}
} }
int WirePacketSendFunction(ZT_Node *node, int WirePacketSendFunction(ZT_Node *node,
void *userData, void *userData,
void *threadData, void *threadData,
const struct sockaddr_storage *localAddress, int64_t localSocket,
const struct sockaddr_storage *remoteAddress, const struct sockaddr_storage *remoteAddress,
const void *buffer, const void *buffer,
unsigned int bufferSize, unsigned int bufferSize,
unsigned int ttl) unsigned int ttl)
{ {
LOGV("WirePacketSendFunction(%p, %p, %p, %d)", localAddress, remoteAddress, buffer, bufferSize); LOGV("WirePacketSendFunction(%ld, %p, %p, %d)", localSocket, remoteAddress, buffer, bufferSize);
JniRef *ref = (JniRef*)userData; JniRef *ref = (JniRef*)userData;
assert(ref->node == node); assert(ref->node == node);
@ -468,23 +475,17 @@ namespace {
} }
jmethodID packetSenderCallbackMethod = lookup.findMethod(packetSenderClass, jmethodID packetSenderCallbackMethod = lookup.findMethod(packetSenderClass,
"onSendPacketRequested", "(Ljava/net/InetSocketAddress;Ljava/net/InetSocketAddress;[BI)I"); "onSendPacketRequested", "(JLjava/net/InetSocketAddress;[BI)I");
if(packetSenderCallbackMethod == NULL) if(packetSenderCallbackMethod == NULL)
{ {
LOGE("Couldn't find onSendPacketRequested method"); LOGE("Couldn't find onSendPacketRequested method");
return -2; return -2;
} }
jobject localAddressObj = NULL;
if(memcmp(localAddress, &ZT_SOCKADDR_NULL, sizeof(sockaddr_storage)) != 0)
{
localAddressObj = newInetSocketAddress(env, *localAddress);
}
jobject remoteAddressObj = newInetSocketAddress(env, *remoteAddress); jobject remoteAddressObj = newInetSocketAddress(env, *remoteAddress);
jbyteArray bufferObj = env->NewByteArray(bufferSize); jbyteArray bufferObj = env->NewByteArray(bufferSize);
env->SetByteArrayRegion(bufferObj, 0, bufferSize, (jbyte*)buffer); env->SetByteArrayRegion(bufferObj, 0, bufferSize, (jbyte*)buffer);
int retval = env->CallIntMethod(ref->packetSender, packetSenderCallbackMethod, localAddressObj, remoteAddressObj, bufferObj); int retval = env->CallIntMethod(ref->packetSender, packetSenderCallbackMethod, localSocket, remoteAddressObj, bufferObj);
LOGV("JNI Packet Sender returned: %d", retval); LOGV("JNI Packet Sender returned: %d", retval);
return retval; return retval;
@ -494,7 +495,7 @@ namespace {
void *userPtr, void *userPtr,
void *threadPtr, void *threadPtr,
uint64_t address, uint64_t address,
const struct sockaddr_storage *localAddress, int64_t localSocket,
const struct sockaddr_storage *remoteAddress) const struct sockaddr_storage *remoteAddress)
{ {
JniRef *ref = (JniRef*)userPtr; JniRef *ref = (JniRef*)userPtr;
@ -515,26 +516,22 @@ namespace {
} }
jmethodID pathCheckCallbackMethod = lookup.findMethod(pathCheckerClass, jmethodID pathCheckCallbackMethod = lookup.findMethod(pathCheckerClass,
"onPathCheck", "(JLjava/net/InetSocketAddress;Ljava/net/InetSocketAddress;)Z"); "onPathCheck", "(JJLjava/net/InetSocketAddress;)Z");
if(pathCheckCallbackMethod == NULL) if(pathCheckCallbackMethod == NULL)
{ {
LOGE("Couldn't find onPathCheck method implementation"); LOGE("Couldn't find onPathCheck method implementation");
return true; return true;
} }
jobject localAddressObj = NULL; struct sockaddr_storage nullAddress = {0};
jobject remoteAddressObj = NULL; jobject remoteAddressObj = NULL;
if(memcmp(localAddress, &ZT_SOCKADDR_NULL, sizeof(sockaddr_storage)) != 0) if(memcmp(remoteAddress, &nullAddress, sizeof(sockaddr_storage)) != 0)
{
localAddressObj = newInetSocketAddress(env, *localAddress);
}
if(memcmp(remoteAddress, &ZT_SOCKADDR_NULL, sizeof(sockaddr_storage)) != 0)
{ {
remoteAddressObj = newInetSocketAddress(env, *remoteAddress); remoteAddressObj = newInetSocketAddress(env, *remoteAddress);
} }
return env->CallBooleanMethod(ref->pathChecker, pathCheckCallbackMethod, address, localAddressObj, remoteAddressObj); return env->CallBooleanMethod(ref->pathChecker, pathCheckCallbackMethod, address, localSocket, remoteAddressObj);
} }
int PathLookupFunction(ZT_Node *node, int PathLookupFunction(ZT_Node *node,
@ -795,8 +792,8 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init(
ref->pathChecker = env->NewGlobalRef(tmp); ref->pathChecker = env->NewGlobalRef(tmp);
} }
ref->callbacks->dataStoreGetFunction = &DataStoreGetFunction; ref->callbacks->stateGetFunction = &StateGetFunction;
ref->callbacks->dataStorePutFunction = &DataStorePutFunction; ref->callbacks->statePutFunction = &StatePutFunction;
ref->callbacks->wirePacketSendFunction = &WirePacketSendFunction; ref->callbacks->wirePacketSendFunction = &WirePacketSendFunction;
ref->callbacks->virtualNetworkFrameFunction = &VirtualNetworkFrameFunctionCallback; ref->callbacks->virtualNetworkFrameFunction = &VirtualNetworkFrameFunctionCallback;
ref->callbacks->virtualNetworkConfigFunction = &VirtualNetworkConfigFunctionCallback; ref->callbacks->virtualNetworkConfigFunction = &VirtualNetworkConfigFunctionCallback;
@ -937,13 +934,13 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame(
/* /*
* Class: com_zerotier_sdk_Node * Class: com_zerotier_sdk_Node
* Method: processWirePacket * Method: processWirePacket
* Signature: (JJLjava/net/InetSocketAddress;I[B[J)Lcom/zerotier/sdk/ResultCode; * Signature: (JJJLjava/net/InetSocketAddress;I[B[J)Lcom/zerotier/sdk/ResultCode;
*/ */
JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket(
JNIEnv *env, jobject obj, JNIEnv *env, jobject obj,
jlong id, jlong id,
jlong in_now, jlong in_now,
jobject in_localAddress, jlong in_localSocket,
jobject in_remoteAddress, jobject in_remoteAddress,
jbyteArray in_packetData, jbyteArray in_packetData,
jlongArray out_nextBackgroundTaskDeadline) jlongArray out_nextBackgroundTaskDeadline)
@ -957,7 +954,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket(
return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL);
} }
unsigned int nbtd_len = env->GetArrayLength(out_nextBackgroundTaskDeadline); unsigned int nbtd_len = (unsigned int)env->GetArrayLength(out_nextBackgroundTaskDeadline);
if(nbtd_len < 1) if(nbtd_len < 1)
{ {
LOGE("nbtd_len < 1"); LOGE("nbtd_len < 1");
@ -992,12 +989,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket(
jmethodID inetSockGetAddressMethod = lookup.findMethod( jmethodID inetSockGetAddressMethod = lookup.findMethod(
InetSocketAddressClass, "getAddress", "()Ljava/net/InetAddress;"); InetSocketAddressClass, "getAddress", "()Ljava/net/InetAddress;");
jobject localAddrObj = NULL;
if(in_localAddress != NULL)
{
localAddrObj = env->CallObjectMethod(in_localAddress, inetSockGetAddressMethod);
}
jobject remoteAddrObject = env->CallObjectMethod(in_remoteAddress, inetSockGetAddressMethod); jobject remoteAddrObject = env->CallObjectMethod(in_remoteAddress, inetSockGetAddressMethod);
if(remoteAddrObject == NULL) if(remoteAddrObject == NULL)
@ -1034,47 +1025,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket(
unsigned int addrSize = env->GetArrayLength(remoteAddressArray); unsigned int addrSize = env->GetArrayLength(remoteAddressArray);
sockaddr_storage localAddress = {};
if(localAddrObj == NULL)
{
localAddress = ZT_SOCKADDR_NULL;
}
else
{
int localPort = env->CallIntMethod(in_localAddress, inetSock_getPort);
jbyteArray localAddressArray = (jbyteArray)env->CallObjectMethod(localAddrObj, getAddressMethod);
if(localAddressArray != NULL)
{
unsigned int localAddrSize = env->GetArrayLength(localAddressArray);
jbyte *addr = (jbyte*)env->GetPrimitiveArrayCritical(localAddressArray, NULL);
if(localAddrSize == 16)
{
sockaddr_in6 ipv6 = {};
ipv6.sin6_family = AF_INET6;
ipv6.sin6_port = htons(localPort);
memcpy(ipv6.sin6_addr.s6_addr, addr, 16);
memcpy(&localAddress, &ipv6, sizeof(sockaddr_in6));
}
else if(localAddrSize)
{
// IPV4 address
sockaddr_in ipv4 = {};
ipv4.sin_family = AF_INET;
ipv4.sin_port = htons(localPort);
memcpy(&ipv4.sin_addr, addr, 4);
memcpy(&localAddress, &ipv4, sizeof(sockaddr_in));
}
else
{
localAddress = ZT_SOCKADDR_NULL;
}
env->ReleasePrimitiveArrayCritical(localAddressArray, addr, 0);
}
}
// get the address bytes // get the address bytes
jbyte *addr = (jbyte*)env->GetPrimitiveArrayCritical(remoteAddressArray, NULL); jbyte *addr = (jbyte*)env->GetPrimitiveArrayCritical(remoteAddressArray, NULL);
sockaddr_storage remoteAddress = {}; sockaddr_storage remoteAddress = {};
@ -1106,7 +1056,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket(
} }
env->ReleasePrimitiveArrayCritical(remoteAddressArray, addr, 0); env->ReleasePrimitiveArrayCritical(remoteAddressArray, addr, 0);
unsigned int packetLength = env->GetArrayLength(in_packetData); unsigned int packetLength = (unsigned int)env->GetArrayLength(in_packetData);
if(packetLength == 0) if(packetLength == 0)
{ {
LOGE("Empty packet?!?"); LOGE("Empty packet?!?");
@ -1123,7 +1073,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket(
node, node,
NULL, NULL,
now, now,
&localAddress, in_localSocket,
&remoteAddress, &remoteAddress,
localData, localData,
packetLength, packetLength,

View File

@ -37,7 +37,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame
* Signature: (JJLjava/net/InetSockAddress;Ljava/net/InetSockAddress;[B[J)Lcom/zerotier/sdk/ResultCode; * Signature: (JJLjava/net/InetSockAddress;Ljava/net/InetSockAddress;[B[J)Lcom/zerotier/sdk/ResultCode;
*/ */
JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket
(JNIEnv *, jobject, jlong, jlong, jobject, jobject, jbyteArray, jlongArray); (JNIEnv *, jobject, jlong, jlong, jlong, jobject, jbyteArray, jlongArray);
/* /*
* Class: com_zerotier_sdk_Node * Class: com_zerotier_sdk_Node

View File

@ -46,13 +46,9 @@ public interface DataStoreGetListener {
* *
* @param name Name of the object in the data store * @param name Name of the object in the data store
* @param out_buffer buffer to put the object in * @param out_buffer buffer to put the object in
* @param bufferIndex index in the object to start reading * @return size of the object
* @param out_objectSize long[1] to be set to the actual size of the object if it exists.
* @return the actual number of bytes read.
*/ */
public long onDataStoreGet( public long onDataStoreGet(
String name, String name,
byte[] out_buffer, byte[] out_buffer);
long bufferIndex,
long[] out_objectSize);
} }

View File

@ -37,13 +37,13 @@ public interface PacketSender {
* on failure. Note that success does not (of course) guarantee packet * on failure. Note that success does not (of course) guarantee packet
* delivery. It only means that the packet appears to have been sent.</p> * delivery. It only means that the packet appears to have been sent.</p>
* *
* @param localAddr {@link InetSocketAddress} to send from. Set to null if not specified. * @param localSocket socket file descriptor to send from. Set to -1 if not specified.
* @param remoteAddr {@link InetSocketAddress} to send to * @param remoteAddr {@link InetSocketAddress} to send to
* @param packetData data to send * @param packetData data to send
* @return 0 on success, any error code on failure. * @return 0 on success, any error code on failure.
*/ */
public int onSendPacketRequested( public int onSendPacketRequested(
InetSocketAddress localAddr, long localSocket,
InetSocketAddress remoteAddr, InetSocketAddress remoteAddr,
byte[] packetData, byte[] packetData,
int ttl); int ttl);

View File

@ -26,10 +26,10 @@ public interface PathChecker {
* such as network containers or embedded. * such as network containers or embedded.
* *
* @param ztAddress ZeroTier address or 0 for none/any * @param ztAddress ZeroTier address or 0 for none/any
* @param localAddress Local interface address * @param localSocket Local interface socket. -1 if unspecified
* @param remoteAddress remote address * @param remoteAddress remote address
*/ */
boolean onPathCheck(long ztAddress, InetSocketAddress localAddress, InetSocketAddress remoteAddress); boolean onPathCheck(long ztAddress, long localSocket, InetSocketAddress remoteAddress);
/** /**
* Function to get physical addresses for ZeroTier peers * Function to get physical addresses for ZeroTier peers