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