summaryrefslogtreecommitdiff
path: root/java/jni
diff options
context:
space:
mode:
authorGrant Limberg <glimberg@gmail.com>2015-04-27 17:48:37 -0700
committerGrant Limberg <glimberg@gmail.com>2015-04-27 17:48:37 -0700
commitd1ed2695378d62145c0820a3d9125526874a8809 (patch)
tree1cef6364adca0b370a55f223a935e91c18abc472 /java/jni
parent73d68c0c988b6c5d038176700cf1055c8a865c7e (diff)
downloadinfinitytier-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.cpp55
-rw-r--r--java/jni/ZT1_jniutils.h1
-rw-r--r--java/jni/com_zerotierone_sdk_Node.cpp30
-rw-r--r--java/jni/com_zerotierone_sdk_Node.h2
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);