From 58e3b8c5addbb8688b8c25a9ec308b2249dcb510 Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Tue, 24 Jan 2023 11:50:00 -0500
Subject: [PATCH 01/68] add StringUtils
---
.../zerotier/sdk/VirtualNetworkConfig.java | 8 +-
.../com/zerotier/sdk/util/StringUtils.java | 52 +++++++++++++
.../zerotier/sdk/util/StringUtilsTest.java | 73 +++++++++++++++++++
3 files changed, 130 insertions(+), 3 deletions(-)
create mode 100644 java/src/com/zerotier/sdk/util/StringUtils.java
create mode 100644 java/test/com/zerotier/sdk/util/StringUtilsTest.java
diff --git a/java/src/com/zerotier/sdk/VirtualNetworkConfig.java b/java/src/com/zerotier/sdk/VirtualNetworkConfig.java
index c7b48d5c5..0236f813c 100644
--- a/java/src/com/zerotier/sdk/VirtualNetworkConfig.java
+++ b/java/src/com/zerotier/sdk/VirtualNetworkConfig.java
@@ -29,6 +29,8 @@ package com.zerotier.sdk;
import android.util.Log;
+import com.zerotier.sdk.util.StringUtils;
+
import java.lang.Comparable;
import java.lang.Override;
import java.lang.String;
@@ -88,11 +90,11 @@ public final class VirtualNetworkConfig implements Comparable>= 8;
+ }
+
+ return String.format("%02x:%02x:%02x:%02x:%02x:%02x", macChars[5], macChars[4], macChars[3], macChars[2], macChars[1], macChars[0]);
+ }
+
+ /**
+ * Convert long to hex string.
+ *
+ * @param networkId long
+ * @return string with 0 padding
+ */
+ public static String networkIdToString(long networkId) {
+ return String.format("%016x", networkId);
+ }
+
+ /**
+ * Convert node address to string.
+ *
+ * Node addresses are 40 bits, so print 10 hex characters.
+ *
+ * @param address Node address
+ * @return formatted string
+ */
+ public static String addressToString(long address) {
+ return String.format("%010x", address);
+ }
+
+ public static String etherTypeToString(long etherType) {
+ return String.format("%04x", etherType);
+ }
+}
diff --git a/java/test/com/zerotier/sdk/util/StringUtilsTest.java b/java/test/com/zerotier/sdk/util/StringUtilsTest.java
new file mode 100644
index 000000000..257b14a99
--- /dev/null
+++ b/java/test/com/zerotier/sdk/util/StringUtilsTest.java
@@ -0,0 +1,73 @@
+/*
+ * ZeroTier One - Network Virtualization Everywhere
+ * Copyright (C) 2011-2023 ZeroTier, Inc. https://www.zerotier.com/
+ */
+
+package com.zerotier.sdk.util;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class StringUtilsTest {
+
+ public StringUtilsTest() {
+ }
+
+ public String oldMacDisplay(long mac) {
+
+ String macStr = Long.toHexString(mac);
+
+ if (macStr.length() > 12) {
+ throw new RuntimeException();
+ }
+
+ while (macStr.length() < 12) {
+ //noinspection StringConcatenationInLoop
+ macStr = "0" + macStr;
+ }
+
+ //noinspection StringBufferReplaceableByString
+ StringBuilder displayMac = new StringBuilder();
+ displayMac.append(macStr.charAt(0));
+ displayMac.append(macStr.charAt(1));
+ displayMac.append(':');
+ displayMac.append(macStr.charAt(2));
+ displayMac.append(macStr.charAt(3));
+ displayMac.append(':');
+ displayMac.append(macStr.charAt(4));
+ displayMac.append(macStr.charAt(5));
+ displayMac.append(':');
+ displayMac.append(macStr.charAt(6));
+ displayMac.append(macStr.charAt(7));
+ displayMac.append(':');
+ displayMac.append(macStr.charAt(8));
+ displayMac.append(macStr.charAt(9));
+ displayMac.append(':');
+ displayMac.append(macStr.charAt(10));
+ displayMac.append(macStr.charAt(11));
+
+ return displayMac.toString();
+ }
+
+ @Test
+ public void testMacDisplay() {
+
+ long mac1 = 1234567891;
+ assertThat(StringUtils.macAddressToString(mac1)).isEqualTo(oldMacDisplay(mac1));
+
+ long mac2 = 999999999;
+ assertThat(StringUtils.macAddressToString(mac2)).isEqualTo(oldMacDisplay(mac2));
+
+ long mac3 = 0x7fffffffffffL;
+ assertThat(StringUtils.macAddressToString(mac3)).isEqualTo(oldMacDisplay(mac3));
+ assertThat(StringUtils.macAddressToString(mac3)).isEqualTo("7f:ff:ff:ff:ff:ff");
+
+ long mac4 = 0x7fafcf3f8fffL;
+ assertThat(StringUtils.macAddressToString(mac4)).isEqualTo(oldMacDisplay(mac4));
+ assertThat(StringUtils.macAddressToString(mac4)).isEqualTo("7f:af:cf:3f:8f:ff");
+ }
+}
From 216ed8c8ea932b2e03a1efb4431bae8363a8b3e3 Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Wed, 1 Feb 2023 08:05:24 -0500
Subject: [PATCH 02/68] fix headers use recommended headers and remove unused
headers
---
java/jni/ZT_jniutils.cpp | 2 +-
java/jni/ZT_jniutils.h | 2 +-
java/jni/com_zerotierone_sdk_Node.cpp | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp
index c479f87e2..f58154d16 100644
--- a/java/jni/ZT_jniutils.cpp
+++ b/java/jni/ZT_jniutils.cpp
@@ -21,7 +21,7 @@
#include "ZT_jniarray.h"
#include
-#include
+#include
#include
#include
diff --git a/java/jni/ZT_jniutils.h b/java/jni/ZT_jniutils.h
index 3e81b934d..02c2e20f1 100644
--- a/java/jni/ZT_jniutils.h
+++ b/java/jni/ZT_jniutils.h
@@ -18,7 +18,7 @@
#ifndef ZT_jniutils_h_
#define ZT_jniutils_h_
-#include
+
#include
#include
diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp
index 75af18bc8..877865828 100644
--- a/java/jni/com_zerotierone_sdk_Node.cpp
+++ b/java/jni/com_zerotierone_sdk_Node.cpp
@@ -34,8 +34,8 @@
#include
*/
public enum ResultCode {
+
/**
* Operation completed normally
*/
@@ -76,4 +77,4 @@ public enum ResultCode {
public boolean isFatal(int id) {
return (id > 100 && id < 1000);
}
-}
\ No newline at end of file
+}
diff --git a/java/src/com/zerotier/sdk/VirtualNetworkConfigListener.java b/java/src/com/zerotier/sdk/VirtualNetworkConfigListener.java
index 15ae301cd..24229039e 100644
--- a/java/src/com/zerotier/sdk/VirtualNetworkConfigListener.java
+++ b/java/src/com/zerotier/sdk/VirtualNetworkConfigListener.java
@@ -25,11 +25,11 @@
* LLC. Start here: http://www.zerotier.com/
*/
-
package com.zerotier.sdk;
public interface VirtualNetworkConfigListener {
+
/**
* Callback called to update virtual network port configuration
*
@@ -57,4 +57,4 @@ public interface VirtualNetworkConfigListener {
long nwid,
VirtualNetworkConfigOperation op,
VirtualNetworkConfig config);
-}
\ No newline at end of file
+}
diff --git a/java/src/com/zerotier/sdk/VirtualNetworkConfigOperation.java b/java/src/com/zerotier/sdk/VirtualNetworkConfigOperation.java
index b70eb4786..6abf2755f 100644
--- a/java/src/com/zerotier/sdk/VirtualNetworkConfigOperation.java
+++ b/java/src/com/zerotier/sdk/VirtualNetworkConfigOperation.java
@@ -24,9 +24,11 @@
* redistribute it in a modified binary form, please contact ZeroTier Networks
* LLC. Start here: http://www.zerotier.com/
*/
+
package com.zerotier.sdk;
public enum VirtualNetworkConfigOperation {
+
/**
* Network is coming up (either for the first time or after service restart)
*/
diff --git a/java/src/com/zerotier/sdk/VirtualNetworkFrameListener.java b/java/src/com/zerotier/sdk/VirtualNetworkFrameListener.java
index 9ad322825..a1c676172 100644
--- a/java/src/com/zerotier/sdk/VirtualNetworkFrameListener.java
+++ b/java/src/com/zerotier/sdk/VirtualNetworkFrameListener.java
@@ -28,6 +28,7 @@
package com.zerotier.sdk;
public interface VirtualNetworkFrameListener {
+
/**
* Function to send a frame out to a virtual network port
*
diff --git a/java/src/com/zerotier/sdk/VirtualNetworkStatus.java b/java/src/com/zerotier/sdk/VirtualNetworkStatus.java
index 68e01bd61..f98aec4a5 100644
--- a/java/src/com/zerotier/sdk/VirtualNetworkStatus.java
+++ b/java/src/com/zerotier/sdk/VirtualNetworkStatus.java
@@ -24,9 +24,11 @@
* redistribute it in a modified binary form, please contact ZeroTier Networks
* LLC. Start here: http://www.zerotier.com/
*/
+
package com.zerotier.sdk;
public enum VirtualNetworkStatus {
+
/**
* Waiting for network configuration (also means revision == 0)
*/
diff --git a/java/src/com/zerotier/sdk/VirtualNetworkType.java b/java/src/com/zerotier/sdk/VirtualNetworkType.java
index ab1f4e087..0b55828eb 100644
--- a/java/src/com/zerotier/sdk/VirtualNetworkType.java
+++ b/java/src/com/zerotier/sdk/VirtualNetworkType.java
@@ -24,9 +24,11 @@
* redistribute it in a modified binary form, please contact ZeroTier Networks
* LLC. Start here: http://www.zerotier.com/
*/
+
package com.zerotier.sdk;
public enum VirtualNetworkType {
+
/**
* Private networks are authorized via certificates of membership
*/
From 87edbb2d3aae2e6549f0f6024d4d0e7a6e0c1a1d Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Tue, 31 Jan 2023 09:53:49 -0500
Subject: [PATCH 05/68] fix ANDROID-50: RESULT_ERROR_BAD_PARAMETER typo
---
java/jni/ZT_jniutils.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp
index f3d528183..82772b979 100644
--- a/java/jni/ZT_jniutils.cpp
+++ b/java/jni/ZT_jniutils.cpp
@@ -69,7 +69,7 @@ jobject createResultObject(JNIEnv *env, ZT_ResultCode code)
break;
case ZT_RESULT_ERROR_BAD_PARAMETER:
LOGV("ZT_RESULT_ERROR_BAD_PARAMETER");
- fieldName = "ZT_RESULT_ERROR_BAD_PARAMETER";
+ fieldName = "RESULT_ERROR_BAD_PARAMETER";
break;
case ZT_RESULT_FATAL_ERROR_INTERNAL:
default:
From 0027e6bdab920b1c22b1068deba2e34f4cf66521 Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Tue, 31 Jan 2023 11:31:52 -0500
Subject: [PATCH 06/68] fix typo in log message
---
java/jni/ZT_jniutils.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp
index 82772b979..34df2781f 100644
--- a/java/jni/ZT_jniutils.cpp
+++ b/java/jni/ZT_jniutils.cpp
@@ -56,7 +56,7 @@ jobject createResultObject(JNIEnv *env, ZT_ResultCode code)
fieldName = "RESULT_FATAL_ERROR_OUT_OF_MEMORY";
break;
case ZT_RESULT_FATAL_ERROR_DATA_STORE_FAILED:
- LOGV("RESULT_FATAL_ERROR_DATA_STORE_FAILED");
+ LOGV("ZT_RESULT_FATAL_ERROR_DATA_STORE_FAILED");
fieldName = "RESULT_FATAL_ERROR_DATA_STORE_FAILED";
break;
case ZT_RESULT_ERROR_NETWORK_NOT_FOUND:
From 1c88037ea07c0e3a206c47482b1de7728eda6459 Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Wed, 1 Feb 2023 16:52:52 -0500
Subject: [PATCH 07/68] fix typos in JNI method signatures
---
java/jni/com_zerotierone_sdk_Node.cpp | 6 +++---
java/jni/com_zerotierone_sdk_Node.h | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp
index 4fcb939ef..90895dbe3 100644
--- a/java/jni/com_zerotierone_sdk_Node.cpp
+++ b/java/jni/com_zerotierone_sdk_Node.cpp
@@ -1002,7 +1002,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame(
/*
* Class: com_zerotier_sdk_Node
* Method: processWirePacket
- * Signature: (JJJLjava/net/InetSocketAddress;I[B[J)Lcom/zerotier/sdk/ResultCode;
+ * Signature: (JJJLjava/net/InetSocketAddress;[B[J)Lcom/zerotier/sdk/ResultCode;
*/
JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket(
JNIEnv *env, jobject obj,
@@ -1466,7 +1466,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_status
/*
* Class: com_zerotier_sdk_Node
* Method: networkConfig
- * Signature: (J)Lcom/zerotier/sdk/VirtualNetworkConfig;
+ * Signature: (JJ)Lcom/zerotier/sdk/VirtualNetworkConfig;
*/
JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_networkConfig(
JNIEnv *env, jobject obj, jlong id, jlong nwid)
@@ -1491,7 +1491,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_networkConfig(
/*
* Class: com_zerotier_sdk_Node
* Method: version
- * Signature: (J)Lcom/zerotier/sdk/Version;
+ * Signature: ()Lcom/zerotier/sdk/Version;
*/
JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_version(
JNIEnv *env, jobject obj)
diff --git a/java/jni/com_zerotierone_sdk_Node.h b/java/jni/com_zerotierone_sdk_Node.h
index 8487d8af2..a5c9668a6 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_zerotier_sdk_Node_processVirtualNetworkFrame
/*
* Class: com_zerotier_sdk_Node
* Method: processWirePacket
- * Signature: (JJLjava/net/InetSockAddress;Ljava/net/InetSockAddress;[B[J)Lcom/zerotier/sdk/ResultCode;
+ * Signature: (JJJLjava/net/InetSockAddress;[B[J)Lcom/zerotier/sdk/ResultCode;
*/
JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket
(JNIEnv *, jobject, jlong, jlong, jlong, jobject, jbyteArray, jlongArray);
From bfe4bc2894c2b83c2b0881a1bbd78097be0e8753 Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Sat, 4 Feb 2023 09:16:39 -0500
Subject: [PATCH 08/68] fix typo
---
java/src/com/zerotier/sdk/VirtualNetworkConfig.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/java/src/com/zerotier/sdk/VirtualNetworkConfig.java b/java/src/com/zerotier/sdk/VirtualNetworkConfig.java
index 0236f813c..d1caee07d 100644
--- a/java/src/com/zerotier/sdk/VirtualNetworkConfig.java
+++ b/java/src/com/zerotier/sdk/VirtualNetworkConfig.java
@@ -191,7 +191,7 @@ public final class VirtualNetworkConfig implements Comparable
Date: Tue, 31 Jan 2023 11:33:34 -0500
Subject: [PATCH 09/68] fix ANDROID-51: fieldName is uninitialized
---
java/jni/ZT_jniutils.cpp | 3 +++
java/src/com/zerotier/sdk/Event.java | 22 +++++++++++++++++++++-
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp
index 34df2781f..8c1fed768 100644
--- a/java/jni/ZT_jniutils.cpp
+++ b/java/jni/ZT_jniutils.cpp
@@ -170,8 +170,11 @@ jobject createEvent(JNIEnv *env, ZT_Event event)
fieldName = "EVENT_TRACE";
break;
case ZT_EVENT_USER_MESSAGE:
+ fieldName = "EVENT_USER_MESSAGE";
break;
case ZT_EVENT_REMOTE_TRACE:
+ fieldName = "EVENT_REMOTE_TRACE";
+ break;
default:
break;
}
diff --git a/java/src/com/zerotier/sdk/Event.java b/java/src/com/zerotier/sdk/Event.java
index d0f314e9a..1f33cea5c 100644
--- a/java/src/com/zerotier/sdk/Event.java
+++ b/java/src/com/zerotier/sdk/Event.java
@@ -95,5 +95,25 @@ public enum Event {
*
* Meta-data: {@link String}, TRACE message
*/
- EVENT_TRACE
+ EVENT_TRACE,
+
+ /**
+ * VERB_USER_MESSAGE received
+ *
+ * These are generated when a VERB_USER_MESSAGE packet is received via
+ * ZeroTier VL1.
+ */
+ EVENT_USER_MESSAGE,
+
+ /**
+ * Remote trace received
+ *
+ * These are generated when a VERB_REMOTE_TRACE is received. Note
+ * that any node can fling one of these at us. It is your responsibility
+ * to filter and determine if it's worth paying attention to. If it's
+ * not just drop it. Most nodes that are not active controllers ignore
+ * these, and controllers only save them if they pertain to networks
+ * with remote tracing enabled.
+ */
+ EVENT_REMOTE_TRACE;
}
\ No newline at end of file
From dd1b52c7d914303ebcbcc4a68ac3c6833b82242c Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Wed, 1 Feb 2023 17:06:02 -0500
Subject: [PATCH 10/68] fix ANDROID-35: memory leak
---
java/jni/com_zerotierone_sdk_Node.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp
index 90895dbe3..7fe2b2cc0 100644
--- a/java/jni/com_zerotierone_sdk_Node.cpp
+++ b/java/jni/com_zerotierone_sdk_Node.cpp
@@ -992,6 +992,8 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame(
frameLength,
&nextBackgroundTaskDeadline);
+ free(localData);
+
jlong *outDeadline = (jlong*)env->GetPrimitiveArrayCritical(out_nextBackgroundTaskDeadline, NULL);
outDeadline[0] = (jlong)nextBackgroundTaskDeadline;
env->ReleasePrimitiveArrayCritical(out_nextBackgroundTaskDeadline, outDeadline, 0);
From 703f9290c993423d81f67fd433ceca144c55e206 Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Wed, 1 Feb 2023 17:44:51 -0500
Subject: [PATCH 11/68] fix missing DeleteLocalRef in loops
---
java/jni/ZT_jniutils.cpp | 6 ++++++
java/jni/com_zerotierone_sdk_Node.cpp | 13 ++++---------
2 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp
index 8c1fed768..fe5408491 100644
--- a/java/jni/ZT_jniutils.cpp
+++ b/java/jni/ZT_jniutils.cpp
@@ -608,6 +608,8 @@ jobject newPeer(JNIEnv *env, const ZT_Peer &peer)
LOGE("exception assigning PeerPhysicalPath to array");
break;
}
+
+ env->DeleteLocalRef(path);
}
env->SetObjectField(peerObject, pathsField, arrayObject);
@@ -809,6 +811,8 @@ jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &vnetConfig)
LOGE("Error assigning InetSocketAddress to array");
return NULL;
}
+
+ env->DeleteLocalRef(inetAddrObj);
}
env->SetObjectField(vnetConfigObj, assignedAddressesField, assignedAddrArrayObj);
@@ -837,6 +841,8 @@ jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &vnetConfig)
LOGE("Error assigning VirtualNetworkRoute to array");
return NULL;
}
+
+ env->DeleteLocalRef(routeObj);
}
env->SetObjectField(vnetConfigObj, routesField, routesArrayObj);
diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp
index 7fe2b2cc0..b05ad1954 100644
--- a/java/jni/com_zerotierone_sdk_Node.cpp
+++ b/java/jni/com_zerotierone_sdk_Node.cpp
@@ -1531,15 +1531,6 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_peers(
return NULL;
}
- int peerCount = peerList->peerCount * 100;
- LOGV("Ensure Local Capacity: %d", peerCount);
- if(env->EnsureLocalCapacity(peerCount))
- {
- LOGE("EnsureLocalCapacity failed!!");
- ZT_Node_freeQueryResult(node, peerList);
- return NULL;
- }
-
jclass peerClass = lookup.findClass("com/zerotier/sdk/Peer");
if(env->ExceptionCheck() || peerClass == NULL)
{
@@ -1568,6 +1559,8 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_peers(
LOGE("Error assigning Peer object to array");
break;
}
+
+ env->DeleteLocalRef(peerObj);
}
ZT_Node_freeQueryResult(node, peerList);
@@ -1624,6 +1617,8 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_networks(
LOGE("Error assigning VirtualNetworkConfig object to array");
break;
}
+
+ env->DeleteLocalRef(networkObject);
}
ZT_Node_freeQueryResult(node, networkList);
From 21264baaae34ab05d3e88254f3a2eb9c910fe093 Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Sat, 4 Feb 2023 08:12:17 -0500
Subject: [PATCH 12/68] update to use unique error codes
---
java/jni/com_zerotierone_sdk_Node.cpp | 30 +++++++++++++--------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp
index b05ad1954..8c44e7456 100644
--- a/java/jni/com_zerotierone_sdk_Node.cpp
+++ b/java/jni/com_zerotierone_sdk_Node.cpp
@@ -110,14 +110,14 @@ namespace {
if (ref->configListener == NULL) {
LOGE("configListener is NULL");
- return -1;
+ return -100;
}
jclass configListenerClass = env->GetObjectClass(ref->configListener);
if(configListenerClass == NULL)
{
LOGE("Couldn't find class for VirtualNetworkConfigListener instance");
- return -1;
+ return -101;
}
jmethodID configListenerCallbackMethod = lookup.findMethod(configListenerClass,
@@ -126,21 +126,21 @@ namespace {
if(configListenerCallbackMethod == NULL)
{
LOGE("Couldn't find onVirtualNetworkFrame() method");
- return -2;
+ return -102;
}
jobject operationObject = createVirtualNetworkConfigOperation(env, operation);
if(operationObject == NULL)
{
LOGE("Error creating VirtualNetworkConfigOperation object");
- return -3;
+ return -103;
}
jobject networkConfigObject = newNetworkConfig(env, *config);
if(networkConfigObject == NULL)
{
LOGE("Error creating VirtualNetworkConfig object");
- return -4;
+ return -104;
}
return env->CallIntMethod(
@@ -425,11 +425,11 @@ namespace {
snprintf(p, sizeof(p), "peers.d/%.10llx", (unsigned long long)id[0]);
break;
default:
- return -1;
+ return -100;
}
if (strlen(p) < 1) {
- return -1;
+ return -101;
}
JniRef *ref = (JniRef*)userData;
@@ -438,14 +438,14 @@ namespace {
if (ref->dataStoreGetListener == NULL) {
LOGE("dataStoreGetListener is NULL");
- return -2;
+ return -102;
}
jclass dataStoreGetClass = env->GetObjectClass(ref->dataStoreGetListener);
if(dataStoreGetClass == NULL)
{
LOGE("Couldn't find class for DataStoreGetListener instance");
- return -2;
+ return -103;
}
jmethodID dataStoreGetCallbackMethod = lookup.findMethod(
@@ -455,21 +455,21 @@ namespace {
if(dataStoreGetCallbackMethod == NULL)
{
LOGE("Couldn't find onDataStoreGet method");
- return -2;
+ return -104;
}
jstring nameStr = env->NewStringUTF(p);
if(nameStr == NULL)
{
LOGE("Error creating name string object");
- return -2; // out of memory
+ return -105; // out of memory
}
jbyteArray bufferObj = env->NewByteArray(bufferLength);
if(bufferObj == NULL)
{
LOGE("Error creating byte[] buffer of size: %u", bufferLength);
- return -2;
+ return -106;
}
LOGV("Calling onDataStoreGet(%s, %p)", p, buffer);
@@ -510,14 +510,14 @@ namespace {
if (ref->packetSender == NULL) {
LOGE("packetSender is NULL");
- return -1;
+ return -100;
}
jclass packetSenderClass = env->GetObjectClass(ref->packetSender);
if(packetSenderClass == NULL)
{
LOGE("Couldn't find class for PacketSender instance");
- return -1;
+ return -101;
}
jmethodID packetSenderCallbackMethod = lookup.findMethod(packetSenderClass,
@@ -525,7 +525,7 @@ namespace {
if(packetSenderCallbackMethod == NULL)
{
LOGE("Couldn't find onSendPacketRequested method");
- return -2;
+ return -102;
}
jobject remoteAddressObj = newInetSocketAddress(env, *remoteAddress);
From 8373a0fa6063507e55b12167e53b63a2217d5b1e Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Thu, 2 Feb 2023 14:00:39 -0500
Subject: [PATCH 13/68] add GETENV macro
---
java/jni/ZT_jniutils.h | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/java/jni/ZT_jniutils.h b/java/jni/ZT_jniutils.h
index 6b911c5ef..a948d61c7 100644
--- a/java/jni/ZT_jniutils.h
+++ b/java/jni/ZT_jniutils.h
@@ -51,6 +51,32 @@
#define LOGE(...) fprintf(stdout, __VA_ARGS__)
#endif
+//
+// Call GetEnv and assert if there is an error
+//
+#define GETENV(env, vm) \
+ do { \
+ jint getEnvRet; \
+ assert(vm); \
+ if ((getEnvRet = vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6)) != JNI_OK) { \
+ LOGE("Error calling GetEnv: %d", getEnvRet); \
+ assert(false && "Error calling GetEnv"); \
+ } \
+ } while (false)
+
+//
+// Call GetJavaVM and assert if there is an error
+//
+#define GETJAVAVM(env, vm) \
+ do { \
+ jint getJavaVMRet; \
+ if ((getJavaVMRet = env->GetJavaVM(&vm)) != 0) { \
+ LOGE("Error calling GetJavaVM: %d", getJavaVMRet); \
+ assert(false && "Error calling GetJavaVM"); \
+ } \
+ } while (false)
+
+
jobject createResultObject(JNIEnv *env, ZT_ResultCode code);
jobject createVirtualNetworkStatus(JNIEnv *env, ZT_VirtualNetworkStatus status);
jobject createVirtualNetworkType(JNIEnv *env, ZT_VirtualNetworkType type);
From 71fc0dd097b62d4398470be999272e12b58c3308 Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Thu, 2 Feb 2023 16:13:02 -0500
Subject: [PATCH 14/68] add LOG_TAG defines
---
java/jni/ZT_jnilookup.cpp | 2 ++
java/jni/ZT_jniutils.cpp | 2 ++
java/jni/ZT_jniutils.h | 2 --
java/jni/com_zerotierone_sdk_Node.cpp | 2 ++
4 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/java/jni/ZT_jnilookup.cpp b/java/jni/ZT_jnilookup.cpp
index 4d867a35c..fc76f6762 100644
--- a/java/jni/ZT_jnilookup.cpp
+++ b/java/jni/ZT_jnilookup.cpp
@@ -28,6 +28,8 @@
#include "ZT_jnilookup.h"
#include "ZT_jniutils.h"
+#define LOG_TAG "Lookup"
+
JniLookup::JniLookup()
: m_jvm(NULL)
{
diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp
index fe5408491..efc4b7289 100644
--- a/java/jni/ZT_jniutils.cpp
+++ b/java/jni/ZT_jniutils.cpp
@@ -28,6 +28,8 @@
#include
#include
+#define LOG_TAG "Utils"
+
extern JniLookup lookup;
jobject createResultObject(JNIEnv *env, ZT_ResultCode code)
diff --git a/java/jni/ZT_jniutils.h b/java/jni/ZT_jniutils.h
index a948d61c7..3a9b227f1 100644
--- a/java/jni/ZT_jniutils.h
+++ b/java/jni/ZT_jniutils.h
@@ -22,8 +22,6 @@
#include
#include
-#define LOG_TAG "ZeroTierOneJNI"
-
#if defined(__ANDROID__)
#include
diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp
index 8c44e7456..3df3fd285 100644
--- a/java/jni/com_zerotierone_sdk_Node.cpp
+++ b/java/jni/com_zerotierone_sdk_Node.cpp
@@ -37,6 +37,8 @@
#include
#include
+#define LOG_TAG "Node"
+
// global static JNI Lookup Object
JniLookup lookup;
From 7890185e81641b4faadd21894fe8e639950c5791 Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Mon, 30 Jan 2023 16:28:45 -0500
Subject: [PATCH 15/68] ANDROID-48: add ZT_jnicache.cpp
---
java/jni/ZT_jnicache.cpp | 396 ++++++++++++++++++++++++++
java/jni/ZT_jnicache.h | 172 +++++++++++
java/jni/com_zerotierone_sdk_Node.cpp | 7 +-
3 files changed, 574 insertions(+), 1 deletion(-)
create mode 100644 java/jni/ZT_jnicache.cpp
create mode 100644 java/jni/ZT_jnicache.h
diff --git a/java/jni/ZT_jnicache.cpp b/java/jni/ZT_jnicache.cpp
new file mode 100644
index 000000000..ab5344b79
--- /dev/null
+++ b/java/jni/ZT_jnicache.cpp
@@ -0,0 +1,396 @@
+//
+// Created by Brenton Bostick on 1/18/23.
+//
+
+#include "ZT_jnicache.h"
+
+#include "ZT_jniutils.h"
+
+#include
+
+#define LOG_TAG "Cache"
+
+#define EXCEPTIONANDNULLCHECK(var) \
+ do { \
+ if (env->ExceptionCheck()) { \
+ assert(false && "Exception"); \
+ } \
+ if ((var) == NULL) { \
+ assert(false && #var " is NULL"); \
+ } \
+ } while (false)
+
+#define SETCLASS(classVar, classNameString) \
+ do { \
+ jclass classVar ## _local = env->FindClass(classNameString); \
+ EXCEPTIONANDNULLCHECK(classVar ## _local); \
+ classVar = reinterpret_cast(env->NewGlobalRef(classVar ## _local)); \
+ EXCEPTIONANDNULLCHECK(classVar); \
+ env->DeleteLocalRef(classVar ## _local); \
+ } while (false)
+
+#define SETOBJECT(objectVar, code) \
+ do { \
+ jobject objectVar ## _local = code; \
+ EXCEPTIONANDNULLCHECK(objectVar ## _local); \
+ objectVar = env->NewGlobalRef(objectVar ## _local); \
+ EXCEPTIONANDNULLCHECK(objectVar); \
+ env->DeleteLocalRef(objectVar ## _local); \
+ } while (false)
+
+
+//
+// Classes
+//
+
+jclass ArrayList_class;
+jclass DataStoreGetListener_class;
+jclass DataStorePutListener_class;
+jclass EventListener_class;
+jclass Event_class;
+jclass Inet4Address_class;
+jclass Inet6Address_class;
+jclass InetAddress_class;
+jclass InetSocketAddress_class;
+jclass NodeStatus_class;
+jclass Node_class;
+jclass PacketSender_class;
+jclass PathChecker_class;
+jclass PeerPhysicalPath_class;
+jclass PeerRole_class;
+jclass Peer_class;
+jclass ResultCode_class;
+jclass Version_class;
+jclass VirtualNetworkConfigListener_class;
+jclass VirtualNetworkConfigOperation_class;
+jclass VirtualNetworkConfig_class;
+jclass VirtualNetworkDNS_class;
+jclass VirtualNetworkFrameListener_class;
+jclass VirtualNetworkRoute_class;
+jclass VirtualNetworkStatus_class;
+jclass VirtualNetworkType_class;
+
+//
+// Instance methods
+//
+
+jmethodID ArrayList_add_method;
+jmethodID ArrayList_ctor;
+jmethodID DataStoreGetListener_onDataStoreGet_method;
+jmethodID DataStorePutListener_onDataStorePut_method;
+jmethodID DataStorePutListener_onDelete_method;
+jmethodID EventListener_onEvent_method;
+jmethodID EventListener_onTrace_method;
+jmethodID InetAddress_getAddress_method;
+jmethodID InetSocketAddress_ctor;
+jmethodID InetSocketAddress_getAddress_method;
+jmethodID InetSocketAddress_getPort_method;
+jmethodID NodeStatus_ctor;
+jmethodID PacketSender_onSendPacketRequested_method;
+jmethodID PathChecker_onPathCheck_method;
+jmethodID PathChecker_onPathLookup_method;
+jmethodID PeerPhysicalPath_ctor;
+jmethodID Peer_ctor;
+jmethodID Version_ctor;
+jmethodID VirtualNetworkConfigListener_onNetworkConfigurationUpdated_method;
+jmethodID VirtualNetworkConfig_ctor;
+jmethodID VirtualNetworkDNS_ctor;
+jmethodID VirtualNetworkFrameListener_onVirtualNetworkFrame_method;
+jmethodID VirtualNetworkRoute_ctor;
+
+//
+// Static methods
+//
+
+jmethodID InetAddress_getByAddress_method;
+
+//
+// Instance fields
+//
+
+jfieldID NodeStatus_address_field;
+jfieldID NodeStatus_online_field;
+jfieldID NodeStatus_publicIdentity_field;
+jfieldID NodeStatus_secretIdentity_field;
+jfieldID Node_configListener_field;
+jfieldID Node_eventListener_field;
+jfieldID Node_frameListener_field;
+jfieldID Node_getListener_field;
+jfieldID Node_pathChecker_field;
+jfieldID Node_putListener_field;
+jfieldID Node_sender_field;
+jfieldID PeerPhysicalPath_address_field;
+jfieldID PeerPhysicalPath_lastReceive_field;
+jfieldID PeerPhysicalPath_lastSend_field;
+jfieldID PeerPhysicalPath_preferred_field;
+jfieldID Peer_address_field;
+jfieldID Peer_latency_field;
+jfieldID Peer_paths_field;
+jfieldID Peer_role_field;
+jfieldID Peer_versionMajor_field;
+jfieldID Peer_versionMinor_field;
+jfieldID Peer_versionRev_field;
+jfieldID Version_major_field;
+jfieldID Version_minor_field;
+jfieldID Version_revision_field;
+jfieldID VirtualNetworkConfig_assignedAddresses_field;
+jfieldID VirtualNetworkConfig_bridge_field;
+jfieldID VirtualNetworkConfig_broadcastEnabled_field;
+jfieldID VirtualNetworkConfig_dhcp_field;
+jfieldID VirtualNetworkConfig_dns_field;
+jfieldID VirtualNetworkConfig_enabled_field;
+jfieldID VirtualNetworkConfig_mac_field;
+jfieldID VirtualNetworkConfig_mtu_field;
+jfieldID VirtualNetworkConfig_name_field;
+jfieldID VirtualNetworkConfig_nwid_field;
+jfieldID VirtualNetworkConfig_portError_field;
+jfieldID VirtualNetworkConfig_routes_field;
+jfieldID VirtualNetworkConfig_status_field;
+jfieldID VirtualNetworkConfig_type_field;
+jfieldID VirtualNetworkDNS_domain_field;
+jfieldID VirtualNetworkDNS_servers_field;
+jfieldID VirtualNetworkRoute_flags_field;
+jfieldID VirtualNetworkRoute_metric_field;
+jfieldID VirtualNetworkRoute_target_field;
+jfieldID VirtualNetworkRoute_via_field;
+
+//
+// Static fields
+//
+
+jfieldID Event_EVENT_DOWN_field;
+jfieldID Event_EVENT_FATAL_ERROR_IDENTITY_COLLISION_field;
+jfieldID Event_EVENT_OFFLINE_field;
+jfieldID Event_EVENT_ONLINE_field;
+jfieldID Event_EVENT_REMOTE_TRACE_field;
+jfieldID Event_EVENT_TRACE_field;
+jfieldID Event_EVENT_UP_field;
+jfieldID Event_EVENT_USER_MESSAGE_field;
+jfieldID PeerRole_PEER_ROLE_LEAF_field;
+jfieldID PeerRole_PEER_ROLE_MOON_field;
+jfieldID PeerRole_PEER_ROLE_PLANET_field;
+jfieldID ResultCode_RESULT_ERROR_BAD_PARAMETER_field;
+jfieldID ResultCode_RESULT_ERROR_NETWORK_NOT_FOUND_field;
+jfieldID ResultCode_RESULT_ERROR_UNSUPPORTED_OPERATION_field;
+jfieldID ResultCode_RESULT_FATAL_ERROR_DATA_STORE_FAILED_field;
+jfieldID ResultCode_RESULT_FATAL_ERROR_INTERNAL_field;
+jfieldID ResultCode_RESULT_FATAL_ERROR_OUT_OF_MEMORY_field;
+jfieldID ResultCode_RESULT_OK_field;
+jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE_field;
+jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY_field;
+jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN_field;
+jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_UP_field;
+jfieldID VirtualNetworkStatus_NETWORK_STATUS_ACCESS_DENIED_field;
+jfieldID VirtualNetworkStatus_NETWORK_STATUS_AUTHENTICATION_REQUIRED_field;
+jfieldID VirtualNetworkStatus_NETWORK_STATUS_CLIENT_TOO_OLD_field;
+jfieldID VirtualNetworkStatus_NETWORK_STATUS_NOT_FOUND_field;
+jfieldID VirtualNetworkStatus_NETWORK_STATUS_OK_field;
+jfieldID VirtualNetworkStatus_NETWORK_STATUS_PORT_ERROR_field;
+jfieldID VirtualNetworkStatus_NETWORK_STATUS_REQUESTING_CONFIGURATION_field;
+jfieldID VirtualNetworkType_NETWORK_TYPE_PRIVATE_field;
+jfieldID VirtualNetworkType_NETWORK_TYPE_PUBLIC_field;
+
+//
+// Enums
+//
+
+jobject ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
+jobject ResultCode_RESULT_OK_enum;
+
+void setupJNICache(JavaVM *vm) {
+
+ JNIEnv *env;
+ GETENV(env, vm);
+
+ //
+ // Classes
+ //
+
+ SETCLASS(ArrayList_class, "java/util/ArrayList");
+ SETCLASS(DataStoreGetListener_class, "com/zerotier/sdk/DataStoreGetListener");
+ SETCLASS(DataStorePutListener_class, "com/zerotier/sdk/DataStorePutListener");
+ SETCLASS(EventListener_class, "com/zerotier/sdk/EventListener");
+ SETCLASS(Event_class, "com/zerotier/sdk/Event");
+ SETCLASS(Inet4Address_class, "java/net/Inet4Address");
+ SETCLASS(Inet6Address_class, "java/net/Inet6Address");
+ SETCLASS(InetAddress_class, "java/net/InetAddress");
+ SETCLASS(InetSocketAddress_class, "java/net/InetSocketAddress");
+ SETCLASS(NodeStatus_class, "com/zerotier/sdk/NodeStatus");
+ SETCLASS(Node_class, "com/zerotier/sdk/Node");
+ SETCLASS(PacketSender_class, "com/zerotier/sdk/PacketSender");
+ SETCLASS(PathChecker_class, "com/zerotier/sdk/PathChecker");
+ SETCLASS(PeerPhysicalPath_class, "com/zerotier/sdk/PeerPhysicalPath");
+ SETCLASS(PeerRole_class, "com/zerotier/sdk/PeerRole");
+ SETCLASS(Peer_class, "com/zerotier/sdk/Peer");
+ SETCLASS(ResultCode_class, "com/zerotier/sdk/ResultCode");
+ SETCLASS(Version_class, "com/zerotier/sdk/Version");
+ SETCLASS(VirtualNetworkConfigListener_class, "com/zerotier/sdk/VirtualNetworkConfigListener");
+ SETCLASS(VirtualNetworkConfigOperation_class, "com/zerotier/sdk/VirtualNetworkConfigOperation");
+ SETCLASS(VirtualNetworkConfig_class, "com/zerotier/sdk/VirtualNetworkConfig");
+ SETCLASS(VirtualNetworkDNS_class, "com/zerotier/sdk/VirtualNetworkDNS");
+ SETCLASS(VirtualNetworkFrameListener_class, "com/zerotier/sdk/VirtualNetworkFrameListener");
+ SETCLASS(VirtualNetworkRoute_class, "com/zerotier/sdk/VirtualNetworkRoute");
+ SETCLASS(VirtualNetworkStatus_class, "com/zerotier/sdk/VirtualNetworkStatus");
+ SETCLASS(VirtualNetworkType_class, "com/zerotier/sdk/VirtualNetworkType");
+
+ //
+ // Instance methods
+ //
+
+ EXCEPTIONANDNULLCHECK(ArrayList_add_method = env->GetMethodID(ArrayList_class, "add", "(Ljava/lang/Object;)Z"));
+ EXCEPTIONANDNULLCHECK(ArrayList_ctor = env->GetMethodID(ArrayList_class, "", "(I)V"));
+ EXCEPTIONANDNULLCHECK(DataStoreGetListener_onDataStoreGet_method = env->GetMethodID(DataStoreGetListener_class, "onDataStoreGet", "(Ljava/lang/String;[B)J"));
+ EXCEPTIONANDNULLCHECK(DataStorePutListener_onDataStorePut_method = env->GetMethodID(DataStorePutListener_class, "onDataStorePut", "(Ljava/lang/String;[BZ)I"));
+ EXCEPTIONANDNULLCHECK(DataStorePutListener_onDelete_method = env->GetMethodID(DataStorePutListener_class, "onDelete", "(Ljava/lang/String;)I"));
+ EXCEPTIONANDNULLCHECK(EventListener_onEvent_method = env->GetMethodID(EventListener_class, "onEvent", "(Lcom/zerotier/sdk/Event;)V"));
+ EXCEPTIONANDNULLCHECK(EventListener_onTrace_method = env->GetMethodID(EventListener_class, "onTrace", "(Ljava/lang/String;)V"));
+ EXCEPTIONANDNULLCHECK(InetAddress_getAddress_method = env->GetMethodID(InetAddress_class, "getAddress", "()[B"));
+ EXCEPTIONANDNULLCHECK(InetSocketAddress_ctor = env->GetMethodID(InetSocketAddress_class, "", "(Ljava/net/InetAddress;I)V"));
+ EXCEPTIONANDNULLCHECK(InetSocketAddress_getAddress_method = env->GetMethodID(InetSocketAddress_class, "getAddress", "()Ljava/net/InetAddress;"));
+ EXCEPTIONANDNULLCHECK(InetSocketAddress_getPort_method = env->GetMethodID(InetSocketAddress_class, "getPort", "()I"));
+ EXCEPTIONANDNULLCHECK(NodeStatus_ctor = env->GetMethodID(NodeStatus_class, "", "()V"));
+ EXCEPTIONANDNULLCHECK(PacketSender_onSendPacketRequested_method = env->GetMethodID(PacketSender_class, "onSendPacketRequested", "(JLjava/net/InetSocketAddress;[BI)I"));
+ EXCEPTIONANDNULLCHECK(PathChecker_onPathCheck_method = env->GetMethodID(PathChecker_class, "onPathCheck", "(JJLjava/net/InetSocketAddress;)Z"));
+ EXCEPTIONANDNULLCHECK(PathChecker_onPathLookup_method = env->GetMethodID(PathChecker_class, "onPathLookup", "(JI)Ljava/net/InetSocketAddress;"));
+ EXCEPTIONANDNULLCHECK(PeerPhysicalPath_ctor = env->GetMethodID(PeerPhysicalPath_class, "", "()V"));
+ EXCEPTIONANDNULLCHECK(Peer_ctor = env->GetMethodID(Peer_class, "", "()V"));
+ EXCEPTIONANDNULLCHECK(Version_ctor = env->GetMethodID(Version_class, "", "()V"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfigListener_onNetworkConfigurationUpdated_method = env->GetMethodID(VirtualNetworkConfigListener_class, "onNetworkConfigurationUpdated", "(JLcom/zerotier/sdk/VirtualNetworkConfigOperation;Lcom/zerotier/sdk/VirtualNetworkConfig;)I"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_ctor = env->GetMethodID(VirtualNetworkConfig_class, "", "()V"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkDNS_ctor = env->GetMethodID(VirtualNetworkDNS_class, "", "()V"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkFrameListener_onVirtualNetworkFrame_method = env->GetMethodID(VirtualNetworkFrameListener_class, "onVirtualNetworkFrame", "(JJJJJ[B)V"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkRoute_ctor = env->GetMethodID(VirtualNetworkRoute_class, "", "()V"));
+
+ //
+ // Static methods
+ //
+
+ EXCEPTIONANDNULLCHECK(InetAddress_getByAddress_method = env->GetStaticMethodID(InetAddress_class, "getByAddress", "([B)Ljava/net/InetAddress;"));
+
+ //
+ // Instance fields
+ //
+
+ EXCEPTIONANDNULLCHECK(NodeStatus_address_field = env->GetFieldID(NodeStatus_class, "address", "J"));
+ EXCEPTIONANDNULLCHECK(NodeStatus_online_field = env->GetFieldID(NodeStatus_class, "online", "Z"));
+ EXCEPTIONANDNULLCHECK(NodeStatus_publicIdentity_field = env->GetFieldID(NodeStatus_class, "publicIdentity", "Ljava/lang/String;"));
+ EXCEPTIONANDNULLCHECK(NodeStatus_secretIdentity_field = env->GetFieldID(NodeStatus_class, "secretIdentity", "Ljava/lang/String;"));
+ EXCEPTIONANDNULLCHECK(Node_configListener_field = env->GetFieldID(Node_class, "configListener", "Lcom/zerotier/sdk/VirtualNetworkConfigListener;"));
+ EXCEPTIONANDNULLCHECK(Node_eventListener_field = env->GetFieldID(Node_class, "eventListener", "Lcom/zerotier/sdk/EventListener;"));
+ EXCEPTIONANDNULLCHECK(Node_frameListener_field = env->GetFieldID(Node_class, "frameListener", "Lcom/zerotier/sdk/VirtualNetworkFrameListener;"));
+ EXCEPTIONANDNULLCHECK(Node_getListener_field = env->GetFieldID(Node_class, "getListener", "Lcom/zerotier/sdk/DataStoreGetListener;"));
+ EXCEPTIONANDNULLCHECK(Node_pathChecker_field = env->GetFieldID(Node_class, "pathChecker", "Lcom/zerotier/sdk/PathChecker;"));
+ EXCEPTIONANDNULLCHECK(Node_putListener_field = env->GetFieldID(Node_class, "putListener", "Lcom/zerotier/sdk/DataStorePutListener;"));
+ EXCEPTIONANDNULLCHECK(Node_sender_field = env->GetFieldID(Node_class, "sender", "Lcom/zerotier/sdk/PacketSender;"));
+ EXCEPTIONANDNULLCHECK(PeerPhysicalPath_address_field = env->GetFieldID(PeerPhysicalPath_class, "address", "Ljava/net/InetSocketAddress;"));
+ EXCEPTIONANDNULLCHECK(PeerPhysicalPath_lastReceive_field = env->GetFieldID(PeerPhysicalPath_class, "lastReceive", "J"));
+ EXCEPTIONANDNULLCHECK(PeerPhysicalPath_lastSend_field = env->GetFieldID(PeerPhysicalPath_class, "lastSend", "J"));
+ EXCEPTIONANDNULLCHECK(PeerPhysicalPath_preferred_field = env->GetFieldID(PeerPhysicalPath_class, "preferred", "Z"));
+ EXCEPTIONANDNULLCHECK(Peer_address_field = env->GetFieldID(Peer_class, "address", "J"));
+ EXCEPTIONANDNULLCHECK(Peer_latency_field = env->GetFieldID(Peer_class, "latency", "I"));
+ EXCEPTIONANDNULLCHECK(Peer_paths_field = env->GetFieldID(Peer_class, "paths", "[Lcom/zerotier/sdk/PeerPhysicalPath;"));
+ EXCEPTIONANDNULLCHECK(Peer_role_field = env->GetFieldID(Peer_class, "role", "Lcom/zerotier/sdk/PeerRole;"));
+ EXCEPTIONANDNULLCHECK(Peer_versionMajor_field = env->GetFieldID(Peer_class, "versionMajor", "I"));
+ EXCEPTIONANDNULLCHECK(Peer_versionMinor_field = env->GetFieldID(Peer_class, "versionMinor", "I"));
+ EXCEPTIONANDNULLCHECK(Peer_versionRev_field = env->GetFieldID(Peer_class, "versionRev", "I"));
+ EXCEPTIONANDNULLCHECK(Version_major_field = env->GetFieldID(Version_class, "major", "I"));
+ EXCEPTIONANDNULLCHECK(Version_minor_field = env->GetFieldID(Version_class, "minor", "I"));
+ EXCEPTIONANDNULLCHECK(Version_revision_field = env->GetFieldID(Version_class, "revision", "I"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_assignedAddresses_field = env->GetFieldID(VirtualNetworkConfig_class, "assignedAddresses", "[Ljava/net/InetSocketAddress;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_bridge_field = env->GetFieldID(VirtualNetworkConfig_class, "bridge", "Z"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_broadcastEnabled_field = env->GetFieldID(VirtualNetworkConfig_class, "broadcastEnabled", "Z"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_dhcp_field = env->GetFieldID(VirtualNetworkConfig_class, "dhcp", "Z"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_dns_field = env->GetFieldID(VirtualNetworkConfig_class, "dns", "Lcom/zerotier/sdk/VirtualNetworkDNS;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_enabled_field = env->GetFieldID(VirtualNetworkConfig_class, "enabled", "Z"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_mac_field = env->GetFieldID(VirtualNetworkConfig_class, "mac", "J"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_mtu_field = env->GetFieldID(VirtualNetworkConfig_class, "mtu", "I"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_name_field = env->GetFieldID(VirtualNetworkConfig_class, "name", "Ljava/lang/String;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_nwid_field = env->GetFieldID(VirtualNetworkConfig_class, "nwid", "J"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_portError_field = env->GetFieldID(VirtualNetworkConfig_class, "portError", "I"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_routes_field = env->GetFieldID(VirtualNetworkConfig_class, "routes", "[Lcom/zerotier/sdk/VirtualNetworkRoute;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_status_field = env->GetFieldID(VirtualNetworkConfig_class, "status", "Lcom/zerotier/sdk/VirtualNetworkStatus;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_type_field = env->GetFieldID(VirtualNetworkConfig_class, "type", "Lcom/zerotier/sdk/VirtualNetworkType;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkDNS_domain_field = env->GetFieldID(VirtualNetworkDNS_class, "domain", "Ljava/lang/String;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkDNS_servers_field = env->GetFieldID(VirtualNetworkDNS_class, "servers", "Ljava/util/ArrayList;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkRoute_flags_field = env->GetFieldID(VirtualNetworkRoute_class, "flags", "I"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkRoute_metric_field = env->GetFieldID(VirtualNetworkRoute_class, "metric", "I"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkRoute_target_field = env->GetFieldID(VirtualNetworkRoute_class, "target", "Ljava/net/InetSocketAddress;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkRoute_via_field = env->GetFieldID(VirtualNetworkRoute_class, "via", "Ljava/net/InetSocketAddress;"));
+
+ //
+ // Static fields
+ //
+
+ EXCEPTIONANDNULLCHECK(Event_EVENT_DOWN_field = env->GetStaticFieldID(Event_class, "EVENT_DOWN", "Lcom/zerotier/sdk/Event;"));
+ EXCEPTIONANDNULLCHECK(Event_EVENT_FATAL_ERROR_IDENTITY_COLLISION_field = env->GetStaticFieldID(Event_class, "EVENT_FATAL_ERROR_IDENTITY_COLLISION", "Lcom/zerotier/sdk/Event;"));
+ EXCEPTIONANDNULLCHECK(Event_EVENT_OFFLINE_field = env->GetStaticFieldID(Event_class, "EVENT_OFFLINE", "Lcom/zerotier/sdk/Event;"));
+ EXCEPTIONANDNULLCHECK(Event_EVENT_ONLINE_field = env->GetStaticFieldID(Event_class, "EVENT_ONLINE", "Lcom/zerotier/sdk/Event;"));
+ EXCEPTIONANDNULLCHECK(Event_EVENT_REMOTE_TRACE_field = env->GetStaticFieldID(Event_class, "EVENT_REMOTE_TRACE", "Lcom/zerotier/sdk/Event;"));
+ EXCEPTIONANDNULLCHECK(Event_EVENT_TRACE_field = env->GetStaticFieldID(Event_class, "EVENT_TRACE", "Lcom/zerotier/sdk/Event;"));
+ EXCEPTIONANDNULLCHECK(Event_EVENT_UP_field = env->GetStaticFieldID(Event_class, "EVENT_UP", "Lcom/zerotier/sdk/Event;"));
+ EXCEPTIONANDNULLCHECK(Event_EVENT_USER_MESSAGE_field = env->GetStaticFieldID(Event_class, "EVENT_USER_MESSAGE", "Lcom/zerotier/sdk/Event;"));
+ EXCEPTIONANDNULLCHECK(PeerRole_PEER_ROLE_LEAF_field = env->GetStaticFieldID(PeerRole_class, "PEER_ROLE_LEAF", "Lcom/zerotier/sdk/PeerRole;"));
+ EXCEPTIONANDNULLCHECK(PeerRole_PEER_ROLE_MOON_field = env->GetStaticFieldID(PeerRole_class, "PEER_ROLE_MOON", "Lcom/zerotier/sdk/PeerRole;"));
+ EXCEPTIONANDNULLCHECK(PeerRole_PEER_ROLE_PLANET_field = env->GetStaticFieldID(PeerRole_class, "PEER_ROLE_PLANET", "Lcom/zerotier/sdk/PeerRole;"));
+ EXCEPTIONANDNULLCHECK(ResultCode_RESULT_ERROR_BAD_PARAMETER_field = env->GetStaticFieldID(ResultCode_class, "RESULT_ERROR_BAD_PARAMETER", "Lcom/zerotier/sdk/ResultCode;"));
+ EXCEPTIONANDNULLCHECK(ResultCode_RESULT_ERROR_NETWORK_NOT_FOUND_field = env->GetStaticFieldID(ResultCode_class, "RESULT_ERROR_NETWORK_NOT_FOUND", "Lcom/zerotier/sdk/ResultCode;"));
+ EXCEPTIONANDNULLCHECK(ResultCode_RESULT_ERROR_UNSUPPORTED_OPERATION_field = env->GetStaticFieldID(ResultCode_class, "RESULT_ERROR_UNSUPPORTED_OPERATION", "Lcom/zerotier/sdk/ResultCode;"));
+ EXCEPTIONANDNULLCHECK(ResultCode_RESULT_FATAL_ERROR_DATA_STORE_FAILED_field = env->GetStaticFieldID(ResultCode_class, "RESULT_FATAL_ERROR_DATA_STORE_FAILED", "Lcom/zerotier/sdk/ResultCode;"));
+ EXCEPTIONANDNULLCHECK(ResultCode_RESULT_FATAL_ERROR_INTERNAL_field = env->GetStaticFieldID(ResultCode_class, "RESULT_FATAL_ERROR_INTERNAL", "Lcom/zerotier/sdk/ResultCode;"));
+ EXCEPTIONANDNULLCHECK(ResultCode_RESULT_FATAL_ERROR_OUT_OF_MEMORY_field = env->GetStaticFieldID(ResultCode_class, "RESULT_FATAL_ERROR_OUT_OF_MEMORY", "Lcom/zerotier/sdk/ResultCode;"));
+ EXCEPTIONANDNULLCHECK(ResultCode_RESULT_OK_field = env->GetStaticFieldID(ResultCode_class, "RESULT_OK", "Lcom/zerotier/sdk/ResultCode;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE_field = env->GetStaticFieldID(VirtualNetworkConfigOperation_class, "VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE", "Lcom/zerotier/sdk/VirtualNetworkConfigOperation;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY_field = env->GetStaticFieldID(VirtualNetworkConfigOperation_class, "VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY", "Lcom/zerotier/sdk/VirtualNetworkConfigOperation;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN_field = env->GetStaticFieldID(VirtualNetworkConfigOperation_class, "VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN", "Lcom/zerotier/sdk/VirtualNetworkConfigOperation;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_UP_field = env->GetStaticFieldID(VirtualNetworkConfigOperation_class, "VIRTUAL_NETWORK_CONFIG_OPERATION_UP", "Lcom/zerotier/sdk/VirtualNetworkConfigOperation;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkStatus_NETWORK_STATUS_ACCESS_DENIED_field = env->GetStaticFieldID(VirtualNetworkStatus_class, "NETWORK_STATUS_ACCESS_DENIED", "Lcom/zerotier/sdk/VirtualNetworkStatus;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkStatus_NETWORK_STATUS_AUTHENTICATION_REQUIRED_field = env->GetStaticFieldID(VirtualNetworkStatus_class, "NETWORK_STATUS_AUTHENTICATION_REQUIRED", "Lcom/zerotier/sdk/VirtualNetworkStatus;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkStatus_NETWORK_STATUS_CLIENT_TOO_OLD_field = env->GetStaticFieldID(VirtualNetworkStatus_class, "NETWORK_STATUS_CLIENT_TOO_OLD", "Lcom/zerotier/sdk/VirtualNetworkStatus;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkStatus_NETWORK_STATUS_NOT_FOUND_field = env->GetStaticFieldID(VirtualNetworkStatus_class, "NETWORK_STATUS_NOT_FOUND", "Lcom/zerotier/sdk/VirtualNetworkStatus;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkStatus_NETWORK_STATUS_OK_field = env->GetStaticFieldID(VirtualNetworkStatus_class, "NETWORK_STATUS_OK", "Lcom/zerotier/sdk/VirtualNetworkStatus;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkStatus_NETWORK_STATUS_PORT_ERROR_field = env->GetStaticFieldID(VirtualNetworkStatus_class, "NETWORK_STATUS_PORT_ERROR", "Lcom/zerotier/sdk/VirtualNetworkStatus;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkStatus_NETWORK_STATUS_REQUESTING_CONFIGURATION_field = env->GetStaticFieldID(VirtualNetworkStatus_class, "NETWORK_STATUS_REQUESTING_CONFIGURATION", "Lcom/zerotier/sdk/VirtualNetworkStatus;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkType_NETWORK_TYPE_PRIVATE_field = env->GetStaticFieldID(VirtualNetworkType_class, "NETWORK_TYPE_PRIVATE", "Lcom/zerotier/sdk/VirtualNetworkType;"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkType_NETWORK_TYPE_PUBLIC_field = env->GetStaticFieldID(VirtualNetworkType_class, "NETWORK_TYPE_PUBLIC", "Lcom/zerotier/sdk/VirtualNetworkType;"));
+
+ //
+ // Enums
+ //
+
+ SETOBJECT(ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum, createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL));
+ SETOBJECT(ResultCode_RESULT_OK_enum, createResultObject(env, ZT_RESULT_OK));
+}
+
+void teardownJNICache(JavaVM *vm) {
+
+ JNIEnv *env;
+ GETENV(env, vm);
+
+ env->DeleteGlobalRef(ArrayList_class);
+ env->DeleteGlobalRef(DataStoreGetListener_class);
+ env->DeleteGlobalRef(DataStorePutListener_class);
+ env->DeleteGlobalRef(EventListener_class);
+ env->DeleteGlobalRef(Event_class);
+ env->DeleteGlobalRef(InetAddress_class);
+ env->DeleteGlobalRef(InetSocketAddress_class);
+ env->DeleteGlobalRef(NodeStatus_class);
+ env->DeleteGlobalRef(Node_class);
+ env->DeleteGlobalRef(PacketSender_class);
+ env->DeleteGlobalRef(PathChecker_class);
+ env->DeleteGlobalRef(PeerPhysicalPath_class);
+ env->DeleteGlobalRef(PeerRole_class);
+ env->DeleteGlobalRef(Peer_class);
+ env->DeleteGlobalRef(ResultCode_class);
+ env->DeleteGlobalRef(Version_class);
+ env->DeleteGlobalRef(VirtualNetworkConfigListener_class);
+ env->DeleteGlobalRef(VirtualNetworkConfigOperation_class);
+ env->DeleteGlobalRef(VirtualNetworkConfig_class);
+ env->DeleteGlobalRef(VirtualNetworkDNS_class);
+ env->DeleteGlobalRef(VirtualNetworkFrameListener_class);
+ env->DeleteGlobalRef(VirtualNetworkRoute_class);
+ env->DeleteGlobalRef(VirtualNetworkStatus_class);
+ env->DeleteGlobalRef(VirtualNetworkType_class);
+
+ env->DeleteGlobalRef(ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum);
+ env->DeleteGlobalRef(ResultCode_RESULT_OK_enum);
+}
diff --git a/java/jni/ZT_jnicache.h b/java/jni/ZT_jnicache.h
new file mode 100644
index 000000000..fb9cf6442
--- /dev/null
+++ b/java/jni/ZT_jnicache.h
@@ -0,0 +1,172 @@
+//
+// Created by Brenton Bostick on 1/18/23.
+//
+
+#ifndef ZEROTIERANDROID_JNICACHE_H
+#define ZEROTIERANDROID_JNICACHE_H
+
+#include
+
+
+//
+// Classes
+//
+
+extern jclass ArrayList_class;
+extern jclass DataStoreGetListener_class;
+extern jclass DataStorePutListener_class;
+extern jclass EventListener_class;
+extern jclass Event_class;
+extern jclass Inet4Address_class;
+extern jclass Inet6Address_class;
+extern jclass InetAddress_class;
+extern jclass InetSocketAddress_class;
+extern jclass NodeStatus_class;
+extern jclass Node_class;
+extern jclass PacketSender_class;
+extern jclass PathChecker_class;
+extern jclass PeerPhysicalPath_class;
+extern jclass PeerRole_class;
+extern jclass Peer_class;
+extern jclass ResultCode_class;
+extern jclass Version_class;
+extern jclass VirtualNetworkConfigListener_class;
+extern jclass VirtualNetworkConfigOperation_class;
+extern jclass VirtualNetworkConfig_class;
+extern jclass VirtualNetworkDNS_class;
+extern jclass VirtualNetworkFrameListener_class;
+extern jclass VirtualNetworkRoute_class;
+extern jclass VirtualNetworkStatus_class;
+extern jclass VirtualNetworkType_class;
+
+//
+// Instance methods
+//
+
+extern jmethodID ArrayList_add_method;
+extern jmethodID ArrayList_ctor;
+extern jmethodID DataStoreGetListener_onDataStoreGet_method;
+extern jmethodID DataStorePutListener_onDataStorePut_method;
+extern jmethodID DataStorePutListener_onDelete_method;
+extern jmethodID EventListener_onEvent_method;
+extern jmethodID EventListener_onTrace_method;
+extern jmethodID InetAddress_getAddress_method;
+extern jmethodID InetSocketAddress_ctor;
+extern jmethodID InetSocketAddress_getAddress_method;
+extern jmethodID InetSocketAddress_getPort_method;
+extern jmethodID NodeStatus_ctor;
+extern jmethodID PacketSender_onSendPacketRequested_method;
+extern jmethodID PathChecker_onPathCheck_method;
+extern jmethodID PathChecker_onPathLookup_method;
+extern jmethodID PeerPhysicalPath_ctor;
+extern jmethodID Peer_ctor;
+extern jmethodID Version_ctor;
+extern jmethodID VirtualNetworkConfigListener_onNetworkConfigurationUpdated_method;
+extern jmethodID VirtualNetworkConfig_ctor;
+extern jmethodID VirtualNetworkDNS_ctor;
+extern jmethodID VirtualNetworkFrameListener_onVirtualNetworkFrame_method;
+extern jmethodID VirtualNetworkRoute_ctor;
+
+//
+// Static methods
+//
+
+extern jmethodID InetAddress_getByAddress_method;
+
+//
+// Instance fields
+//
+
+extern jfieldID NodeStatus_address_field;
+extern jfieldID NodeStatus_online_field;
+extern jfieldID NodeStatus_publicIdentity_field;
+extern jfieldID NodeStatus_secretIdentity_field;
+extern jfieldID Node_configListener_field;
+extern jfieldID Node_eventListener_field;
+extern jfieldID Node_frameListener_field;
+extern jfieldID Node_getListener_field;
+extern jfieldID Node_pathChecker_field;
+extern jfieldID Node_putListener_field;
+extern jfieldID Node_sender_field;
+extern jfieldID PeerPhysicalPath_address_field;
+extern jfieldID PeerPhysicalPath_lastReceive_field;
+extern jfieldID PeerPhysicalPath_lastSend_field;
+extern jfieldID PeerPhysicalPath_preferred_field;
+extern jfieldID Peer_address_field;
+extern jfieldID Peer_latency_field;
+extern jfieldID Peer_paths_field;
+extern jfieldID Peer_role_field;
+extern jfieldID Peer_versionMajor_field;
+extern jfieldID Peer_versionMinor_field;
+extern jfieldID Peer_versionRev_field;
+extern jfieldID Version_major_field;
+extern jfieldID Version_minor_field;
+extern jfieldID Version_revision_field;
+extern jfieldID VirtualNetworkConfig_assignedAddresses_field;
+extern jfieldID VirtualNetworkConfig_bridge_field;
+extern jfieldID VirtualNetworkConfig_broadcastEnabled_field;
+extern jfieldID VirtualNetworkConfig_dhcp_field;
+extern jfieldID VirtualNetworkConfig_dns_field;
+extern jfieldID VirtualNetworkConfig_enabled_field;
+extern jfieldID VirtualNetworkConfig_mac_field;
+extern jfieldID VirtualNetworkConfig_mtu_field;
+extern jfieldID VirtualNetworkConfig_name_field;
+extern jfieldID VirtualNetworkConfig_nwid_field;
+extern jfieldID VirtualNetworkConfig_portError_field;
+extern jfieldID VirtualNetworkConfig_routes_field;
+extern jfieldID VirtualNetworkConfig_status_field;
+extern jfieldID VirtualNetworkConfig_type_field;
+extern jfieldID VirtualNetworkDNS_domain_field;
+extern jfieldID VirtualNetworkDNS_servers_field;
+extern jfieldID VirtualNetworkRoute_flags_field;
+extern jfieldID VirtualNetworkRoute_metric_field;
+extern jfieldID VirtualNetworkRoute_target_field;
+extern jfieldID VirtualNetworkRoute_via_field;
+
+//
+// Static fields
+//
+
+extern jfieldID Event_EVENT_DOWN_field;
+extern jfieldID Event_EVENT_FATAL_ERROR_IDENTITY_COLLISION_field;
+extern jfieldID Event_EVENT_OFFLINE_field;
+extern jfieldID Event_EVENT_ONLINE_field;
+extern jfieldID Event_EVENT_REMOTE_TRACE_field;
+extern jfieldID Event_EVENT_TRACE_field;
+extern jfieldID Event_EVENT_UP_field;
+extern jfieldID Event_EVENT_USER_MESSAGE_field;
+extern jfieldID PeerRole_PEER_ROLE_LEAF_field;
+extern jfieldID PeerRole_PEER_ROLE_MOON_field;
+extern jfieldID PeerRole_PEER_ROLE_PLANET_field;
+extern jfieldID ResultCode_RESULT_ERROR_BAD_PARAMETER_field;
+extern jfieldID ResultCode_RESULT_ERROR_NETWORK_NOT_FOUND_field;
+extern jfieldID ResultCode_RESULT_ERROR_UNSUPPORTED_OPERATION_field;
+extern jfieldID ResultCode_RESULT_FATAL_ERROR_DATA_STORE_FAILED_field;
+extern jfieldID ResultCode_RESULT_FATAL_ERROR_INTERNAL_field;
+extern jfieldID ResultCode_RESULT_FATAL_ERROR_OUT_OF_MEMORY_field;
+extern jfieldID ResultCode_RESULT_OK_field;
+extern jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE_field;
+extern jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY_field;
+extern jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN_field;
+extern jfieldID VirtualNetworkConfigOperation_VIRTUAL_NETWORK_CONFIG_OPERATION_UP_field;
+extern jfieldID VirtualNetworkStatus_NETWORK_STATUS_ACCESS_DENIED_field;
+extern jfieldID VirtualNetworkStatus_NETWORK_STATUS_AUTHENTICATION_REQUIRED_field;
+extern jfieldID VirtualNetworkStatus_NETWORK_STATUS_CLIENT_TOO_OLD_field;
+extern jfieldID VirtualNetworkStatus_NETWORK_STATUS_NOT_FOUND_field;
+extern jfieldID VirtualNetworkStatus_NETWORK_STATUS_OK_field;
+extern jfieldID VirtualNetworkStatus_NETWORK_STATUS_PORT_ERROR_field;
+extern jfieldID VirtualNetworkStatus_NETWORK_STATUS_REQUESTING_CONFIGURATION_field;
+extern jfieldID VirtualNetworkType_NETWORK_TYPE_PRIVATE_field;
+extern jfieldID VirtualNetworkType_NETWORK_TYPE_PUBLIC_field;
+
+//
+// Enums
+//
+
+extern jobject ResultCode_RESULT_FATAL_ERROR_INTERNAL_enum;
+extern jobject ResultCode_RESULT_OK_enum;
+
+void setupJNICache(JavaVM *vm);
+void teardownJNICache(JavaVM *vm);
+
+#endif // ZEROTIERANDROID_JNICACHE_H
diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp
index 3df3fd285..b649b9c61 100644
--- a/java/jni/com_zerotierone_sdk_Node.cpp
+++ b/java/jni/com_zerotierone_sdk_Node.cpp
@@ -26,6 +26,8 @@
*/
#include "com_zerotierone_sdk_Node.h"
+
+#include "ZT_jnicache.h"
#include "ZT_jniutils.h"
#include "ZT_jnilookup.h"
@@ -737,12 +739,15 @@ extern "C" {
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
lookup.setJavaVM(vm);
+
+ setupJNICache(vm);
+
return JNI_VERSION_1_6;
}
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
{
-
+ teardownJNICache(vm);
}
From 82749e44420a1b96c8ee0aff87a84fa10c3b1a35 Mon Sep 17 00:00:00 2001
From: Brenton Bostick
Date: Mon, 30 Jan 2023 17:11:39 -0500
Subject: [PATCH 16/68] ANDROID-48: use ZT_jnicache.cpp and remove
ZT_jnilookup.cpp and ZT_jniarray.cpp
---
java/jni/ZT_jniarray.cpp | 112 -----
java/jni/ZT_jniarray.h | 60 ---
java/jni/ZT_jnilookup.cpp | 160 ------
java/jni/ZT_jnilookup.h | 54 ---
java/jni/ZT_jniutils.cpp | 672 ++++----------------------
java/jni/com_zerotierone_sdk_Node.cpp | 468 +++---------------
6 files changed, 164 insertions(+), 1362 deletions(-)
delete mode 100644 java/jni/ZT_jniarray.cpp
delete mode 100644 java/jni/ZT_jniarray.h
delete mode 100644 java/jni/ZT_jnilookup.cpp
delete mode 100644 java/jni/ZT_jnilookup.h
diff --git a/java/jni/ZT_jniarray.cpp b/java/jni/ZT_jniarray.cpp
deleted file mode 100644
index a1cae76ed..000000000
--- a/java/jni/ZT_jniarray.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-//
-// Created by Grant Limberg on 10/21/20.
-//
-
-#include "ZT_jniarray.h"
-#include
-#include
-#include
-
-jclass java_util_ArrayList;
-jmethodID java_util_ArrayList_;
-jmethodID java_util_ArrayList_size;
-jmethodID java_util_ArrayList_get;
-jmethodID java_util_ArrayList_add;
-
-void InitListJNI(JNIEnv* env) {
- java_util_ArrayList = static_cast(env->NewGlobalRef(env->FindClass("java/util/ArrayList")));
- java_util_ArrayList_ = env->GetMethodID(java_util_ArrayList, "", "(I)V");
- java_util_ArrayList_size = env->GetMethodID (java_util_ArrayList, "size", "()I");
- java_util_ArrayList_get = env->GetMethodID(java_util_ArrayList, "get", "(I)Ljava/lang/Object;");
- java_util_ArrayList_add = env->GetMethodID(java_util_ArrayList, "add", "(Ljava/lang/Object;)Z");
-}
-
-jclass ListJNI::getListClass(JNIEnv* env) {
- jclass jclazz = env->FindClass("java/util/List");
- assert(jclazz != nullptr);
- return jclazz;
-}
-
-jclass ListJNI::getArrayListClass(JNIEnv* env) {
- jclass jclazz = env->FindClass("java/util/ArrayList");
- assert(jclazz != nullptr);
- return jclazz;
-}
-
-jclass ListJNI::getIteratorClass(JNIEnv* env) {
- jclass jclazz = env->FindClass("java/util/Iterator");
- assert(jclazz != nullptr);
- return jclazz;
-}
-
-jmethodID ListJNI::getIteratorMethod(JNIEnv* env) {
- static jmethodID mid = env->GetMethodID(
- getListClass(env), "iterator", "()Ljava/util/Iterator;");
- assert(mid != nullptr);
- return mid;
-}
-
-jmethodID ListJNI::getHasNextMethod(JNIEnv* env) {
- static jmethodID mid = env->GetMethodID(
- getIteratorClass(env), "hasNext", "()Z");
- assert(mid != nullptr);
- return mid;
-}
-
-jmethodID ListJNI::getNextMethod(JNIEnv* env) {
- static jmethodID mid = env->GetMethodID(
- getIteratorClass(env), "next", "()Ljava/lang/Object;");
- assert(mid != nullptr);
- return mid;
-}
-
-jmethodID ListJNI::getArrayListConstructorMethodId(JNIEnv* env, jclass jclazz) {
- static jmethodID mid = env->GetMethodID(
- jclazz, "", "(I)V");
- assert(mid != nullptr);
- return mid;
-}
-
-jmethodID ListJNI::getListAddMethodId(JNIEnv* env) {
- static jmethodID mid = env->GetMethodID(
- getListClass(env), "add", "(Ljava/lang/Object;)Z");
- assert(mid != nullptr);
- return mid;
-}
-
-jclass ByteJNI::getByteClass(JNIEnv* env) {
- jclass jclazz = env->FindClass("java/lang/Byte");
- assert(jclazz != nullptr);
- return jclazz;
-}
-
-jmethodID ByteJNI::getByteValueMethod(JNIEnv* env) {
- static jmethodID mid = env->GetMethodID(
- getByteClass(env), "byteValue", "()B");
- assert(mid != nullptr);
- return mid;
-}
-
-jobject cppToJava(JNIEnv* env, std::vector vector) {
- jobject result = env->NewObject(java_util_ArrayList, java_util_ArrayList_, vector.size());
- for (std::string s: vector) {
- jstring element = env->NewStringUTF(s.c_str());
- env->CallBooleanMethod(result, java_util_ArrayList_add, element);
- env->DeleteLocalRef(element);
- }
- return result;
-}
-
-std::vector javaToCpp(JNIEnv* env, jobject arrayList) {
- jint len = env->CallIntMethod(arrayList, java_util_ArrayList_size);
- std::vector result;
- result.reserve(len);
- for (jint i=0; i(env->CallObjectMethod(arrayList, java_util_ArrayList_get, i));
- const char* pchars = env->GetStringUTFChars(element, nullptr);
- result.emplace_back(pchars);
- env->ReleaseStringUTFChars(element, pchars);
- env->DeleteLocalRef(element);
- }
- return result;
-}
diff --git a/java/jni/ZT_jniarray.h b/java/jni/ZT_jniarray.h
deleted file mode 100644
index d93c87b9c..000000000
--- a/java/jni/ZT_jniarray.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-// Created by Grant Limberg on 10/21/20.
-//
-
-#ifndef ZEROTIERANDROID_ZT_JNIARRAY_H
-#define ZEROTIERANDROID_ZT_JNIARRAY_H
-
-#include
-#include
-#include
-
-extern jclass java_util_ArrayList;
-extern jmethodID java_util_ArrayList_;
-extern jmethodID java_util_ArrayList_size;
-extern jmethodID java_util_ArrayList_get;
-extern jmethodID java_util_ArrayList_add;
-
-void InitListJNI(JNIEnv* env);
-
-class ListJNI {
-public:
- // Get the java class id of java.util.List.
- static jclass getListClass(JNIEnv* env);
-
- // Get the java class id of java.util.ArrayList.
- static jclass getArrayListClass(JNIEnv* env);
-
- // Get the java class id of java.util.Iterator.
- static jclass getIteratorClass(JNIEnv* env);
-
- // Get the java method id of java.util.List.iterator().
- static jmethodID getIteratorMethod(JNIEnv* env);
-
- // Get the java method id of java.util.Iterator.hasNext().
- static jmethodID getHasNextMethod(JNIEnv* env);
-
- // Get the java method id of java.util.Iterator.next().
- static jmethodID getNextMethod(JNIEnv* env);
-
- // Get the java method id of arrayList constructor.
- static jmethodID getArrayListConstructorMethodId(JNIEnv* env, jclass jclazz);
-
- // Get the java method id of java.util.List.add().
- static jmethodID getListAddMethodId(JNIEnv* env);
-};
-
-class ByteJNI {
-public:
- // Get the java class id of java.lang.Byte.
- static jclass getByteClass(JNIEnv* env);
-
- // Get the java method id of java.lang.Byte.byteValue.
- static jmethodID getByteValueMethod(JNIEnv* env);
-};
-
-jobject cppToJava(JNIEnv* env, std::vector vector);
-
-std::vector javaToCpp(JNIEnv* env, jobject arrayList);
-
-#endif //ZEROTIERANDROID_ZT_JNIARRAY_H
diff --git a/java/jni/ZT_jnilookup.cpp b/java/jni/ZT_jnilookup.cpp
deleted file mode 100644
index fc76f6762..000000000
--- a/java/jni/ZT_jnilookup.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * ZeroTier One - Network Virtualization Everywhere
- * Copyright (C) 2011-2015 ZeroTier, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- *
- * --
- *
- * ZeroTier may be used and distributed under the terms of the GPLv3, which
- * are available at: http://www.gnu.org/licenses/gpl-3.0.html
- *
- * If you would like to embed ZeroTier into a commercial application or
- * redistribute it in a modified binary form, please contact ZeroTier Networks
- * LLC. Start here: http://www.zerotier.com/
- */
-
-#include "ZT_jnilookup.h"
-#include "ZT_jniutils.h"
-
-#define LOG_TAG "Lookup"
-
-JniLookup::JniLookup()
- : m_jvm(NULL)
-{
- LOGV("JNI Cache Created");
-}
-
-JniLookup::JniLookup(JavaVM *jvm)
- : m_jvm(jvm)
-{
- LOGV("JNI Cache Created");
-}
-
-JniLookup::~JniLookup()
-{
- LOGV("JNI Cache Destroyed");
-}
-
-
-void JniLookup::setJavaVM(JavaVM *jvm)
-{
- LOGV("Assigned JVM to object");
- m_jvm = jvm;
-}
-
-
-jclass JniLookup::findClass(const std::string &name)
-{
- if(!m_jvm)
- return NULL;
-
- // get the class from the JVM
- JNIEnv *env = NULL;
- if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK)
- {
- LOGE("Error retrieving JNI Environment");
- return NULL;
- }
- const char *c = name.c_str();
- jclass cls = env->FindClass(c);
- if(env->ExceptionCheck())
- {
- LOGE("Error finding class: %s", name.c_str());
- return NULL;
- }
-
- return cls;
-}
-
-
-jmethodID JniLookup::findMethod(jclass cls, const std::string &methodName, const std::string &methodSig)
-{
- if(!m_jvm)
- return NULL;
-
- JNIEnv *env = NULL;
- if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK)
- {
- return NULL;
- }
-
- jmethodID mid = env->GetMethodID(cls, methodName.c_str(), methodSig.c_str());
- if(env->ExceptionCheck())
- {
- return NULL;
- }
-
- return mid;
-}
-
-jmethodID JniLookup::findStaticMethod(jclass cls, const std::string &methodName, const std::string &methodSig)
-{
- if(!m_jvm)
- return NULL;
-
- JNIEnv *env = NULL;
- if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK)
- {
- return NULL;
- }
-
- jmethodID mid = env->GetStaticMethodID(cls, methodName.c_str(), methodSig.c_str());
- if(env->ExceptionCheck())
- {
- return NULL;
- }
-
- return mid;
-}
-
-jfieldID JniLookup::findField(jclass cls, const std::string &fieldName, const std::string &typeStr)
-{
- if(!m_jvm)
- return NULL;
-
- JNIEnv *env = NULL;
- if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK)
- {
- return NULL;
- }
-
- jfieldID fid = env->GetFieldID(cls, fieldName.c_str(), typeStr.c_str());
- if(env->ExceptionCheck())
- {
- return NULL;
- }
-
- return fid;
-}
-
-jfieldID JniLookup::findStaticField(jclass cls, const std::string &fieldName, const std::string &typeStr)
-{
- if(!m_jvm)
- return NULL;
-
- JNIEnv *env = NULL;
- if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK)
- {
- return NULL;
- }
-
- jfieldID fid = env->GetStaticFieldID(cls, fieldName.c_str(), typeStr.c_str());
- if(env->ExceptionCheck())
- {
- return NULL;
- }
-
- return fid;
-}
\ No newline at end of file
diff --git a/java/jni/ZT_jnilookup.h b/java/jni/ZT_jnilookup.h
deleted file mode 100644
index f5bd97d7d..000000000
--- a/java/jni/ZT_jnilookup.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * ZeroTier One - Network Virtualization Everywhere
- * Copyright (C) 2011-2015 ZeroTier, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- *
- * --
- *
- * ZeroTier may be used and distributed under the terms of the GPLv3, which
- * are available at: http://www.gnu.org/licenses/gpl-3.0.html
- *
- * If you would like to embed ZeroTier into a commercial application or
- * redistribute it in a modified binary form, please contact ZeroTier Networks
- * LLC. Start here: http://www.zerotier.com/
- */
-
-#ifndef ZT_JNILOOKUP_H_
-#define ZT_JNILOOKUP_H_
-
-#include
-#include