diff options
author | Grant Limberg <glimberg@gmail.com> | 2015-04-27 17:48:37 -0700 |
---|---|---|
committer | Grant Limberg <glimberg@gmail.com> | 2015-04-27 17:48:37 -0700 |
commit | d1ed2695378d62145c0820a3d9125526874a8809 (patch) | |
tree | 1cef6364adca0b370a55f223a935e91c18abc472 /java/jni | |
parent | 73d68c0c988b6c5d038176700cf1055c8a865c7e (diff) | |
download | infinitytier-d1ed2695378d62145c0820a3d9125526874a8809.tar.gz infinitytier-d1ed2695378d62145c0820a3d9125526874a8809.zip |
Switch to InetSockAddress instead of InetAddress so we can send the port # to java as well
Diffstat (limited to 'java/jni')
-rw-r--r-- | java/jni/ZT1_jniutils.cpp | 55 | ||||
-rw-r--r-- | java/jni/ZT1_jniutils.h | 1 | ||||
-rw-r--r-- | java/jni/com_zerotierone_sdk_Node.cpp | 30 | ||||
-rw-r--r-- | java/jni/com_zerotierone_sdk_Node.h | 2 |
4 files changed, 80 insertions, 8 deletions
diff --git a/java/jni/ZT1_jniutils.cpp b/java/jni/ZT1_jniutils.cpp index fc97eb7d..4c4e8e60 100644 --- a/java/jni/ZT1_jniutils.cpp +++ b/java/jni/ZT1_jniutils.cpp @@ -301,6 +301,9 @@ bool appendItemToArrayList(JNIEnv *env, jobject array, jobject object) jobject newInetAddress(JNIEnv *env, const sockaddr_storage &addr) { + static jclass inetAddressClass = NULL; + static jmethodID inetAddress_getByAddress = NULL; + if(inetAddressClass == NULL) { inetAddressClass = env->FindClass("java/net/InetAddress"); @@ -356,6 +359,58 @@ jobject newInetAddress(JNIEnv *env, const sockaddr_storage &addr) return inetAddressObj; } +jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr) +{ + static jclass inetSocketAddressClass = NULL; + static jmethodID inetSocketAddress_constructor = NULL; + + if(inetSocketAddressClass == NULL) + { + inetSocketAddressClass == env->FindClass("java/net/InetSocketAddress"); + if(inetSocketAddressClass == NULL) + { + return NULL; + } + } + + jobject inetAddressObject = newInetAddress(env, addr); + + if(inetAddressObject == NULL) + { + return NULL; + } + + if(inetSocketAddress_constructor == NULL) + { + inetSocketAddress_constructor = env->GetMethodID( + inetSocketAddressClass, "<init>", "(Ljava/net/InetAddress;I)V"); + if(inetSocketAddress_constructor == NULL) + { + return NULL; + } + } + + int port = 0; + switch(addr.ss_family) + { + case AF_INET6: + { + sockaddr_in6 *ipv6 = (sockaddr_in6*)&addr; + port = ipv6->sin6_port; + } + break; + case AF_INET: + { + sockaddr_in *ipv4 = (sockaddr_in*)&addr; + port = ipv4->sin_port; + } + break; + }; + + jobject inetSocketAddressObject = env->NewObject(inetSocketAddressClass, inetSocketAddress_constructor, inetAddressObject, port); + return inetSocketAddressObject; +} + jobject newMulticastGroup(JNIEnv *env, const ZT1_MulticastGroup &mc) { static jclass multicastGroupClass = NULL; diff --git a/java/jni/ZT1_jniutils.h b/java/jni/ZT1_jniutils.h index 4c7a69bf..6c43704c 100644 --- a/java/jni/ZT1_jniutils.h +++ b/java/jni/ZT1_jniutils.h @@ -30,6 +30,7 @@ jobject createVirtualNetworkConfigOperation(JNIEnv *env, ZT1_VirtualNetworkConfi jobject newArrayList(JNIEnv *env); bool appendItemToArrayList(JNIEnv *env, jobject array, jobject object); +jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr); jobject newInetAddress(JNIEnv *env, const sockaddr_storage &addr); jobject newMulticastGroup(JNIEnv *env, const ZT1_MulticastGroup &mc); diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index c23547a1..a434cc9a 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -245,7 +245,7 @@ namespace { if(ref->onOutOfDateMethod == NULL) { ref->onNetworkErrorMethod = env->GetMethodID(ref->eventListenerClass, - "onNetworkError", "(Lcom/zerotierone/sdk/Event;Ljava/net/InetAddress;)V"); + "onNetworkError", "(Lcom/zerotierone/sdk/Event;Ljava/net/InetSocketAddress;)V"); if(ref->onNetworkErrorMethod == NULL) { LOGE("Couldn't find onNetworkError method"); @@ -301,7 +301,7 @@ namespace { if(data != NULL) { sockaddr_storage *addr = (sockaddr_storage*)data; - jobject addressObj = newInetAddress(env, *addr); + jobject addressObj = newInetSocketAddress(env, *addr); env->CallVoidMethod(ref->eventListener, ref->onNetworkErrorMethod, addressObj); } } @@ -463,7 +463,7 @@ namespace { if(ref->packetSenderCallbackMethod == NULL) { ref->packetSenderCallbackMethod = env->GetMethodID(ref->packetSenderClass, - "onSendPacketRequested", "(Ljava/net/InetAddress;I[B)I"); + "onSendPacketRequested", "(Ljava/net/InetSocketAddress;I[B)I"); if(ref->packetSenderCallbackMethod == NULL) { LOGE("Couldn't find onSendPacketRequested method"); @@ -471,7 +471,7 @@ namespace { } } - jobject addressObj = newInetAddress(env, *address); + jobject addressObj = newInetSocketAddress(env, *address); jbyteArray bufferObj = env->NewByteArray(bufferSize); env->SetByteArrayRegion(bufferObj, 0, bufferSize, (jbyte*)buffer); return env->CallIntMethod(ref->packetSender, ref->packetSenderCallbackMethod, addressObj, linkDesparation, bufferObj); @@ -717,7 +717,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotierone_sdk_Node_processVirtualNetworkFra /* * Class: com_zerotierone_sdk_Node * Method: processWirePacket - * Signature: (JJLjava/net/InetAddress;I[B[J)Lcom/zerotierone/sdk/ResultCode; + * Signature: (JJLjava/net/InetSocketAddress;I[B[J)Lcom/zerotierone/sdk/ResultCode; */ JNIEXPORT jobject JNICALL Java_com_zerotierone_sdk_Node_processWirePacket( JNIEnv *env, jobject obj, @@ -745,7 +745,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotierone_sdk_Node_processWirePacket( uint64_t now = (uint64_t)in_now; unsigned int linkDesparation = (unsigned int)in_linkDesparation; - // get the java.net.InetAddress class and getAddress() method + // get the java.net.InetSocketAddress class and getAddress() method jclass inetAddressClass = env->FindClass("java/net/InetAddress"); if(inetAddressClass == NULL) { @@ -761,8 +761,24 @@ JNIEXPORT jobject JNICALL Java_com_zerotierone_sdk_Node_processWirePacket( return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); } + jclass InetSocketAddressClass = env->FindClass("java/net/InetSocketAddress"); + if(InetSocketAddressClass == NULL) + { + return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + } + + jmethodID inetSockGetAddressMethod = env->GetMethodID( + InetSocketAddressClass, "getAddress", "()Ljava/net/InetAddress;"); + + jobject addrObject = env->CallObjectMethod(in_remoteAddress, inetSockGetAddressMethod); + + if(addrObject == NULL) + { + return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + } + // Call InetAddress.getAddress() - jbyteArray addressArray = (jbyteArray)env->CallObjectMethod(in_remoteAddress, getAddressMethod); + jbyteArray addressArray = (jbyteArray)env->CallObjectMethod(addrObject, getAddressMethod); if(addressArray == NULL) { // unable to call getAddress() diff --git a/java/jni/com_zerotierone_sdk_Node.h b/java/jni/com_zerotierone_sdk_Node.h index fefc9fc5..eb88def5 100644 --- a/java/jni/com_zerotierone_sdk_Node.h +++ b/java/jni/com_zerotierone_sdk_Node.h @@ -34,7 +34,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotierone_sdk_Node_processVirtualNetworkFra /* * Class: com_zerotierone_sdk_Node * Method: processWirePacket - * Signature: (JJLjava/net/InetAddress;I[B[J)Lcom/zerotierone/sdk/ResultCode; + * Signature: (JJLjava/net/InetSockAddress;I[B[J)Lcom/zerotierone/sdk/ResultCode; */ JNIEXPORT jobject JNICALL Java_com_zerotierone_sdk_Node_processWirePacket (JNIEnv *, jobject, jlong, jlong, jobject, jint, jbyteArray, jlongArray); |