diff --git a/.gitignore b/.gitignore
index e26e487..f8f796b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,8 @@
# Binaries/Executables
*.dll
*.lib
+*.so
+*.dylib
*.o
*.class
diff --git a/Makefile b/Makefile
index 9764b2b..078d22d 100644
--- a/Makefile
+++ b/Makefile
@@ -306,6 +306,7 @@ utilities:
$(CXX) $(CXXFLAGS) -c src/Utilities.cpp \
$(ZT_DEFS) $(ZT_INCLUDES) $(LIBZT_INCLUDES) $(STACK_DRIVER_DEFS)
+# windows DLL
win_dll: lwip lwip_driver libzt_socket_layer utilities $(ZTO_OBJS)
# First we use mingw to build our DLL
@mkdir -p $(BUILD) obj
@@ -317,16 +318,19 @@ win_dll: lwip lwip_driver libzt_socket_layer utilities $(ZTO_OBJS)
# lib /machine:x64 /def:libzt.def
# or just execute: makelib
+# ordinary shared library
shared_lib: lwip lwip_driver libzt_socket_layer utilities $(ZTO_OBJS)
@mkdir -p $(BUILD) obj
mv *.o obj
$(CXX) $(CXXFLAGS) -shared -o $(BUILD)/libzt.so obj/*.o
+# dynamic library for use with Java JNI, scala, etc
shared_jni_lib: lwip lwip_driver libzt_socket_layer jni_socket_wrapper utilities $(ZTO_OBJS)
@mkdir -p $(BUILD) obj
mv *.o obj
- $(CXX) $(CXXFLAGS) -shared -o $(BUILD)/libzt.so obj/*.o
+ $(CXX) $(CXXFLAGS) -dynamiclib -o $(BUILD)/libzt.dylib obj/*.o
+# static library
ifeq ($(STACK_PICO),1)
static_lib: picotcp picotcp_driver libzt_socket_layer utilities $(ZTO_OBJS)
@mkdir -p $(BUILD) obj
diff --git a/examples/bindings/java/ZeroTierHelloWorld/src/MyClass.java b/examples/bindings/java/ExampleApp.java
similarity index 95%
rename from examples/bindings/java/ZeroTierHelloWorld/src/MyClass.java
rename to examples/bindings/java/ExampleApp.java
index 71c19aa..461e06a 100644
--- a/examples/bindings/java/ZeroTierHelloWorld/src/MyClass.java
+++ b/examples/bindings/java/ExampleApp.java
@@ -28,13 +28,13 @@
import zerotier.*;
-public class MyClass {
+public class ExampleApp {
public native int loadsymbols();
public native void startOneService();
static {
- System.load("/Users/joseph/op/zt/libzt/build/darwin/libzt.so");
+ System.loadLibrary("zt");
}
public static void main(String[] args) {
diff --git a/examples/bindings/java/Makefile b/examples/bindings/java/Makefile
new file mode 100644
index 0000000..f6af4b8
--- /dev/null
+++ b/examples/bindings/java/Makefile
@@ -0,0 +1,18 @@
+OSTYPE=$(shell uname -s | tr '[A-Z]' '[a-z]')
+BUILD=build/$(OSTYPE)
+
+ifeq ($(OSTYPE),darwin)
+SHARED_LIB=libzt.dylib
+endif
+ifeq ($(OSTYPE),linux)
+SHARED_LIB=libzt.so
+endif
+
+example_java_app:
+ javac *.java
+
+copy_dynamic_lib:
+ cp ../../../$(BUILD)/$(SHARED_LIB) .
+
+clean:
+ -find . -type f \( -name '*.class' \) -delete
\ No newline at end of file
diff --git a/examples/bindings/java/README.md b/examples/bindings/java/README.md
index ba2580d..666cad4 100644
--- a/examples/bindings/java/README.md
+++ b/examples/bindings/java/README.md
@@ -1,9 +1,14 @@
-Java Examples
-======
+## ZeroTier with Java via JNI
+***
-`make shared_jni_lib SDK_JNI=1 SDK_IPV4=1`
+To get this example project to work, do the following:
-Uses API described in [api/java/README.md]
- - Copy `src/ZeroTier.java` into `your_project/src/zerotier`
- - Copy `src/Address.java` into `your_project/src/zerotier`
- - Copy `libzt.jnilib` or `libzt.so` from `build/` into `your_project/lib`
\ No newline at end of file
+- From libzt main directory, build shared library: `make shared_jni_lib`
+- Copy the resultant dynamic library (`*.so` or `*.dylib`) from `build/` to this current directory
+- Change to this directory and `make example_java_app`
+- Run: `java -cp "." ExampleApp`
+
+
+Notes:
+
+Upon execution, it will load the libzt dynamic library via the `loadLibrary` method and begin generating an identity.
\ No newline at end of file
diff --git a/examples/bindings/java/ZeroTierHelloWorld/.classpath b/examples/bindings/java/ZeroTierHelloWorld/.classpath
deleted file mode 100644
index 3e0d493..0000000
--- a/examples/bindings/java/ZeroTierHelloWorld/.classpath
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/examples/bindings/java/ZeroTierHelloWorld/.project b/examples/bindings/java/ZeroTierHelloWorld/.project
deleted file mode 100644
index 424ba61..0000000
--- a/examples/bindings/java/ZeroTierHelloWorld/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- ZeroTierHelloWorld
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
-
- org.eclipse.jdt.core.javanature
-
-
diff --git a/examples/bindings/java/ZeroTierHelloWorld/.settings/org.eclipse.jdt.core.prefs b/examples/bindings/java/ZeroTierHelloWorld/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 3a21537..0000000
--- a/examples/bindings/java/ZeroTierHelloWorld/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,11 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/examples/bindings/java/ZeroTierHelloWorld/README.md b/examples/bindings/java/ZeroTierHelloWorld/README.md
deleted file mode 100644
index a670a6d..0000000
--- a/examples/bindings/java/ZeroTierHelloWorld/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-ZeroTierSDK Java API
-======
\ No newline at end of file
diff --git a/examples/bindings/java/ZeroTierHelloWorld/src/zerotier/Address.java b/examples/bindings/java/zerotier/Address.java
similarity index 99%
rename from examples/bindings/java/ZeroTierHelloWorld/src/zerotier/Address.java
rename to examples/bindings/java/zerotier/Address.java
index 729d71f..530ee27 100644
--- a/examples/bindings/java/ZeroTierHelloWorld/src/zerotier/Address.java
+++ b/examples/bindings/java/zerotier/Address.java
@@ -24,6 +24,8 @@
* of your own application.
*/
+package zerotier;
+
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.InetSocketAddress;
diff --git a/examples/bindings/java/ZeroTierHelloWorld/src/zerotier/ZeroTier.java b/examples/bindings/java/zerotier/ZeroTier.java
similarity index 99%
rename from examples/bindings/java/ZeroTierHelloWorld/src/zerotier/ZeroTier.java
rename to examples/bindings/java/zerotier/ZeroTier.java
index 7ae09e4..74cb9cc 100644
--- a/examples/bindings/java/ZeroTierHelloWorld/src/zerotier/ZeroTier.java
+++ b/examples/bindings/java/zerotier/ZeroTier.java
@@ -24,6 +24,10 @@
* of your own application.
*/
+package zerotier;
+
+//import zerotier.*;
+
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
diff --git a/examples/bindings/newscala/ZeroTier.java b/examples/bindings/newscala/ZeroTier.java
new file mode 100644
index 0000000..ce8da3b
--- /dev/null
+++ b/examples/bindings/newscala/ZeroTier.java
@@ -0,0 +1,7 @@
+package zerotier;
+
+public class ZeroTier
+{
+ public native int ztjni_socket(int family, int type, int protocol);
+ public int socket(int family, int type, int protocol) { return ztjni_socket(family, type, protocol); }
+}
\ No newline at end of file
diff --git a/examples/bindings/newscala/example.java b/examples/bindings/newscala/example.java
new file mode 100644
index 0000000..2a97aa7
--- /dev/null
+++ b/examples/bindings/newscala/example.java
@@ -0,0 +1,59 @@
+/*
+ * ZeroTier SDK - Network Virtualization Everywhere
+ * Copyright (C) 2011-2017 ZeroTier, Inc. https://www.zerotier.com/
+ *
+ * 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 .
+ *
+ * --
+ *
+ * You can be released from the requirements of the license by purchasing
+ * a commercial license. Buying such a license is mandatory as soon as you
+ * develop commercial closed-source software that incorporates or links
+ * directly against ZeroTier software without disclosing the source code
+ * of your own application.
+ */
+
+// Simple Java example for libzt using JNI
+
+import zerotier.ZeroTier;
+
+public class example {
+
+ public native int loadsymbols();
+ public native void startOneService();
+
+ static {
+ System.load("/Users/joseph/op/zt/libzt/build/darwin/libzt.so");
+ }
+
+ public static void main(String[] args) {
+
+ final ZeroTier z = new ZeroTier();
+
+ new Thread(new Runnable() {
+ public void run() {
+ System.out.println("starting libzt");
+ z.ztjni_socket(2, 1, 0);
+ // start(path) will not block
+ // startjoin(path, nwid) will block
+ }
+ }).start();
+
+ while(true)
+ {
+ try { Thread.sleep(3000); }
+ catch (InterruptedException e) { e.printStackTrace(); }
+ }
+ }
+}
\ No newline at end of file