From ae7eb359a0fd6471066f5172bf182d7363d2f1ba Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Tue, 21 Jun 2016 16:26:38 -0700 Subject: [PATCH] Updated Android integration, added build instructions to make-mac --- integrations/Android/java/jni/Android.mk | 120 +++++++++--------- integrations/Android/proj/app/app.iml | 11 ++ integrations/Android/proj/app/build.gradle | 4 +- .../one/service/ZeroTierOneService.java | 2 +- integrations/Android/proj/build.gradle | 2 +- .../build/intermediates/dex-cache/cache.xml | 82 ++++++++++++ .../gradle/wrapper/gradle-wrapper.properties | 2 +- integrations/Android/proj/gradlew | 0 integrations/Android/proj/proj.iml | 2 +- .../UserInterfaceState.xcuserstate | Bin 50374 -> 50874 bytes make-mac.mk | 45 ++++--- src/SDK.h | 2 +- src/SDK_ServiceSetup.cpp | 2 +- 13 files changed, 192 insertions(+), 82 deletions(-) create mode 100644 integrations/Android/proj/build/intermediates/dex-cache/cache.xml mode change 100644 => 100755 integrations/Android/proj/gradlew diff --git a/integrations/Android/java/jni/Android.mk b/integrations/Android/java/jni/Android.mk index 638e029..859cb40 100644 --- a/integrations/Android/java/jni/Android.mk +++ b/integrations/Android/java/jni/Android.mk @@ -2,24 +2,28 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) +ZTSDK := ../../../../src +ZT := ../../../../zerotierone + LOCAL_MODULE := ZeroTierOneJNI LOCAL_C_INCLUDES := $(ZT1)/include LOCAL_C_INCLUDES += $(ZT1)/ext/lwip/src/include LOCAL_C_INCLUDES += $(ZT1)/ext/lwip/src/include/ipv4 -LOCAL_C_INCLUDES += $(ZT1)/netcon +LOCAL_C_INCLUDES += $(ZT1)/node +LOCAL_C_INCLUDES += $(ZT1)/ LOCAL_C_INCLUDES += $(ZT1)/service LOCAL_C_INCLUDES += $(ZT1)/osdep -LOCAL_C_INCLUDES += $(ZT1)/node +LOCAL_C_INCLUDES += $(ZTSDK)/src LOCAL_LDLIBS := -llog # LOCAL_CFLAGS := -g # Netcon files LOCAL_SRC_FILES := \ - $(ZT1)/src/SDK_RPC.c \ - $(ZT1)/src/SDK_Proxy.cpp \ - $(ZT1)/src/SDK_ServiceSetup.cpp \ - $(ZT1)/src/SDK_EthernetTap.cpp + $(ZTSDK)/SDK_RPC.c \ + $(ZTSDK)/SDK_Proxy.cpp \ + $(ZTSDK)/SDK_ServiceSetup.cpp \ + $(ZTSDK)/SDK_EthernetTap.cpp # ZeroTierOne ext files LOCAL_SRC_FILES += \ @@ -39,70 +43,70 @@ LOCAL_SRC_FILES += \ $(ZT1)/node/IncomingPacket.cpp \ $(ZT1)/node/InetAddress.cpp \ $(ZT1)/node/Multicaster.cpp \ - $(ZT1)/node/Network.cpp \ - $(ZT1)/node/NetworkConfig.cpp \ - $(ZT1)/node/Node.cpp \ - $(ZT1)/node/OutboundMulticast.cpp \ - $(ZT1)/node/Packet.cpp \ - $(ZT1)/node/Path.cpp \ - $(ZT1)/node/Peer.cpp \ - $(ZT1)/node/Poly1305.cpp \ - $(ZT1)/node/Salsa20.cpp \ - $(ZT1)/node/SelfAwareness.cpp \ - $(ZT1)/node/SHA512.cpp \ - $(ZT1)/node/Switch.cpp \ - $(ZT1)/node/Topology.cpp \ - $(ZT1)/node/Utils.cpp \ - $(ZT1)/osdep/Http.cpp \ - $(ZT1)/osdep/OSUtils.cpp \ - $(ZT1)/osdep/BackgroundResolver.cpp + $(ZT)/node/Network.cpp \ + $(ZT)/node/NetworkConfig.cpp \ + $(ZT)/node/Node.cpp \ + $(ZT)/node/OutboundMulticast.cpp \ + $(ZT)/node/Packet.cpp \ + $(ZT)/node/Path.cpp \ + $(ZT)/node/Peer.cpp \ + $(ZT)/node/Poly1305.cpp \ + $(ZT)/node/Salsa20.cpp \ + $(ZT)/node/SelfAwareness.cpp \ + $(ZT)/node/SHA512.cpp \ + $(ZT)/node/Switch.cpp \ + $(ZT)/node/Topology.cpp \ + $(ZT)/node/Utils.cpp \ + $(ZT)/osdep/Http.cpp \ + $(ZT)/osdep/OSUtils.cpp \ + $(ZT)/osdep/BackgroundResolver.cpp # lwIP api files LOCAL_SRC_FILES += \ - $(ZT1)/ext/lwip/src/api/api_lib.c \ - $(ZT1)/ext/lwip/src/api/api_msg.c \ - $(ZT1)/ext/lwip/src/api/err.c \ - $(ZT1)/ext/lwip/src/api/netbuf.c \ - $(ZT1)/ext/lwip/src/api/netdb.c \ - $(ZT1)/ext/lwip/src/api/netifapi.c \ - $(ZT1)/ext/lwip/src/api/sockets.c \ - $(ZT1)/ext/lwip/src/api/tcpip.c + $(ZT)/ext/lwip/src/api/api_lib.c \ + $(ZT)/ext/lwip/src/api/api_msg.c \ + $(ZT)/ext/lwip/src/api/err.c \ + $(ZT)/ext/lwip/src/api/netbuf.c \ + $(ZT)/ext/lwip/src/api/netdb.c \ + $(ZT)/ext/lwip/src/api/netifapi.c \ + $(ZT)/ext/lwip/src/api/sockets.c \ + $(ZT)/ext/lwip/src/api/tcpip.c # lwIP core files LOCAL_SRC_FILES += \ - $(ZT1)/ext/lwip/src/core/def.c \ - $(ZT1)/ext/lwip/src/core/dhcp.c \ - $(ZT1)/ext/lwip/src/core/dns.c \ - $(ZT1)/ext/lwip/src/core/init.c \ - $(ZT1)/ext/lwip/src/core/mem.c \ - $(ZT1)/ext/lwip/src/core/memp.c \ - $(ZT1)/ext/lwip/src/core/netif.c \ - $(ZT1)/ext/lwip/src/core/pbuf.c \ - $(ZT1)/ext/lwip/src/core/raw.c \ - $(ZT1)/ext/lwip/src/core/stats.c \ - $(ZT1)/ext/lwip/src/core/sys.c \ - $(ZT1)/ext/lwip/src/core/tcp_in.c \ - $(ZT1)/ext/lwip/src/core/tcp_out.c \ - $(ZT1)/ext/lwip/src/core/tcp.c \ - $(ZT1)/ext/lwip/src/core/timers.c \ - $(ZT1)/ext/lwip/src/core/udp.c + $(ZT)/ext/lwip/src/core/def.c \ + $(ZT)/ext/lwip/src/core/dhcp.c \ + $(ZT)/ext/lwip/src/core/dns.c \ + $(ZT)/ext/lwip/src/core/init.c \ + $(ZT)/ext/lwip/src/core/mem.c \ + $(ZT)/ext/lwip/src/core/memp.c \ + $(ZT)/ext/lwip/src/core/netif.c \ + $(ZT)/ext/lwip/src/core/pbuf.c \ + $(ZT)/ext/lwip/src/core/raw.c \ + $(ZT)/ext/lwip/src/core/stats.c \ + $(ZT)/ext/lwip/src/core/sys.c \ + $(ZT)/ext/lwip/src/core/tcp_in.c \ + $(ZT)/ext/lwip/src/core/tcp_out.c \ + $(ZT)/ext/lwip/src/core/tcp.c \ + $(ZT)/ext/lwip/src/core/timers.c \ + $(ZT)/ext/lwip/src/core/udp.c # lwIP core/ip4 files LOCAL_SRC_FILES += \ - $(ZT1)/ext/lwip/src/core/ipv4/autoip.c \ - $(ZT1)/ext/lwip/src/core/ipv4/icmp.c \ - $(ZT1)/ext/lwip/src/core/ipv4/igmp.c \ - $(ZT1)/ext/lwip/src/core/ipv4/inet_chksum.c \ - $(ZT1)/ext/lwip/src/core/ipv4/inet.c \ - $(ZT1)/ext/lwip/src/core/ipv4/ip_addr.c \ - $(ZT1)/ext/lwip/src/core/ipv4/ip_frag.c \ - $(ZT1)/ext/lwip/src/core/ipv4/ip.c \ + $(ZT)/ext/lwip/src/core/ipv4/autoip.c \ + $(ZT)/ext/lwip/src/core/ipv4/icmp.c \ + $(ZT)/ext/lwip/src/core/ipv4/igmp.c \ + $(ZT)/ext/lwip/src/core/ipv4/inet_chksum.c \ + $(ZT)/ext/lwip/src/core/ipv4/inet.c \ + $(ZT)/ext/lwip/src/core/ipv4/ip_addr.c \ + $(ZT)/ext/lwip/src/core/ipv4/ip_frag.c \ + $(ZT)/ext/lwip/src/core/ipv4/ip.c \ # lwIP netif files LOCAL_SRC_FILES += \ - $(ZT1)/ext/lwip/src/netif/etharp.c \ - $(ZT1)/ext/lwip/src/netif/ethernetif.c \ - $(ZT1)/ext/lwip/src/netif/slipif.c + $(ZT)/ext/lwip/src/netif/etharp.c \ + $(ZT)/ext/lwip/src/netif/ethernetif.c \ + $(ZT)/ext/lwip/src/netif/slipif.c # JNI Files LOCAL_SRC_FILES += \ diff --git a/integrations/Android/proj/app/app.iml b/integrations/Android/proj/app/app.iml index 849ac37..ee8e8ab 100644 --- a/integrations/Android/proj/app/app.iml +++ b/integrations/Android/proj/app/app.iml @@ -51,6 +51,7 @@ + @@ -58,12 +59,14 @@ + + @@ -71,6 +74,7 @@ + @@ -78,16 +82,23 @@ + + + + + + + diff --git a/integrations/Android/proj/app/build.gradle b/integrations/Android/proj/app/build.gradle index 0716500..5f63419 100644 --- a/integrations/Android/proj/app/build.gradle +++ b/integrations/Android/proj/app/build.gradle @@ -29,9 +29,9 @@ android { } task ndkBuild(type: Exec) { if (Os.isFamily(Os.FAMILY_WINDOWS)) { - commandLine "${android.getNdkDirectory().getAbsolutePath()}/ndk-build.cmd", '-j8', '-C', file('../../java').absolutePath, "ZT1=${System.getProperty('user.dir')}/../../.." + commandLine "${android.getNdkDirectory().getAbsolutePath()}/ndk-build.cmd", '-j8', '-C', file('../../java').absolutePath, "ZT1=${System.getProperty('user.dir')}/../../../../zerotierone" } else { - commandLine "${android.getNdkDirectory().getAbsolutePath()}/ndk-build", '-j8', '-C', file('../../java').absolutePath, "ZT1=${System.getProperty('user.dir')}/../../.." + commandLine "${android.getNdkDirectory().getAbsolutePath()}/ndk-build", '-j8', '-C', file('../../java').absolutePath, "ZT1=${System.getProperty('user.dir')}/../../../zerotierone" } } tasks.withType(JavaCompile) { diff --git a/integrations/Android/proj/app/src/main/java/com/zerotier/one/service/ZeroTierOneService.java b/integrations/Android/proj/app/src/main/java/com/zerotier/one/service/ZeroTierOneService.java index bc64530..5aa1aa7 100644 --- a/integrations/Android/proj/app/src/main/java/com/zerotier/one/service/ZeroTierOneService.java +++ b/integrations/Android/proj/app/src/main/java/com/zerotier/one/service/ZeroTierOneService.java @@ -93,7 +93,7 @@ public class ZeroTierOneService extends VpnService implements Runnable, EventLis networkConfigs = new HashMap<>(); eventBus.register(this); - Netcon.NetconWrapper wrapper = new Netcon.NetconWrapper(); + Netcon.ZT_SDK_Wrapper wrapper = new Netcon.ZT_SDK_Wrapper(); wrapper.startOneService(); diff --git a/integrations/Android/proj/build.gradle b/integrations/Android/proj/build.gradle index 2174a6b..1f0a3fa 100644 --- a/integrations/Android/proj/build.gradle +++ b/integrations/Android/proj/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.3.0' + classpath 'com.android.tools.build:gradle:2.1.0' classpath 'com.google.gms:google-services:1.3.0-beta1' // NOTE: Do not place your application dependencies here; they belong diff --git a/integrations/Android/proj/build/intermediates/dex-cache/cache.xml b/integrations/Android/proj/build/intermediates/dex-cache/cache.xml new file mode 100644 index 0000000..9223a95 --- /dev/null +++ b/integrations/Android/proj/build/intermediates/dex-cache/cache.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/Android/proj/gradle/wrapper/gradle-wrapper.properties b/integrations/Android/proj/gradle/wrapper/gradle-wrapper.properties index fd27bdf..d570517 100644 --- a/integrations/Android/proj/gradle/wrapper/gradle-wrapper.properties +++ b/integrations/Android/proj/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip diff --git a/integrations/Android/proj/gradlew b/integrations/Android/proj/gradlew old mode 100644 new mode 100755 diff --git a/integrations/Android/proj/proj.iml b/integrations/Android/proj/proj.iml index 16853d9..2c2e416 100644 --- a/integrations/Android/proj/proj.iml +++ b/integrations/Android/proj/proj.iml @@ -13,7 +13,7 @@ - + \ No newline at end of file diff --git a/integrations/Apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate b/integrations/Apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate index cb1d0ed1afe7d8a74036eb9b682552c1da9d9cb2..63bfc4a8efdeef49db15b06c4a49e9b954438782 100644 GIT binary patch delta 15049 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 B2ao^& diff --git a/make-mac.mk b/make-mac.mk index abadbbe..235f819 100644 --- a/make-mac.mk +++ b/make-mac.mk @@ -67,21 +67,36 @@ else STRIP=strip endif -# Debug output for Network Containers -# Specific levels can be controlled in netcon/common.inc.c +# Debug output for SDK +# Specific levels can be controlled in src/debug.h ifeq ($(SDK_DEBUG),1) DEFS+=-DSDK_DEBUG endif CXXFLAGS=$(CFLAGS) -fno-rtti +all: + +# TODO: CHECK if XCODE TOOLS are installed # Build frameworks for application development +OSX_app_framework: + cd integrations/Apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_OSX build SYMROOT="../../../build/OSX_app_framework" +iOS_app_framework: + cd integrations/Apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_iOS build SYMROOT="../../../build/iOS_app_framework" + # Build bundles for Unity integrations -all: - cd integrations/Apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_OSX build SYMROOT="../../../build/OSX_Framework" - cd integrations/Apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_iOS build SYMROOT="../../../build/iOS_Framework" - cd integrations/Apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_Unity3D_OSX build SYMROOT="../../../build/OSX_Unity_Bundle" - cd integrations/Apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_Unity3D_iOS build SYMROOT="../../../build/iOS_Unity_Bundle" +OSX_unity3d_bundle: + cd integrations/Apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_Unity3D_OSX build SYMROOT="../../../build/OSX_unity3d_bundle" +iOS_unity3d_bundle: + cd integrations/Apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_Unity3D_iOS build SYMROOT="../../../build/iOS_unity3d_bundle" + +# TODO: CHECK if ANDROID/GRADLE TOOLS are installed + +# Build JNI library for Android app integration +Android_JNI_library: + cd integrations/Android/proj; ./gradlew assembleDebug + +# Build library for Android Unity integrations sdk: $(OBJS) rm -f *.o @@ -99,15 +114,13 @@ sdk: $(OBJS) ln -sf zerotier-netcon-service zerotier-cli ln -sf zerotier-netcon-service zerotier-idtool -selftest: $(OBJS) selftest.o - $(CXX) $(CXXFLAGS) -o zerotier-selftest selftest.o $(OBJS) $(LIBS) - $(STRIP) zerotier-selftest - clean: - rm -rf build + rm -rf build/* + find . -type f -name '*.o' -delete + find . -type f -name '*.so' -delete + find . -type f -name '*.o.d' -delete # Remove junk generated by Android builds - rm -rf netcon/Android/*.o.d - rm -rf netcon/Netcon-Android/proj/app/build/intermediates - rm -rf netcon/*.o netcon/*.so *.dSYM build-* *.pkg *.dmg *.o node/*.o controller/*.o service/*.o osdep/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o $(OBJS) netcon/zerotier-intercept zerotier-netcon-service ztproxy libztapi.so libztkq.so libztintercept.so zerotier-one zerotier-idtool zerotier-selftest zerotier-cli ZeroTierOneInstaller-* mkworld - + cd integrations/Android/proj; ./gradlew clean + rm -rf integrations/Android/proj/.gradle + rm -rf integrations/Android/proj/.idea FORCE: diff --git a/src/SDK.h b/src/SDK.h index ff7eb31..06e0e1b 100644 --- a/src/SDK.h +++ b/src/SDK.h @@ -40,7 +40,6 @@ extern "C" { void zt_init_rpc(char *nwid); const char *get_netpath(); -bool check_intercept_enabled_for_thread(); #if defined(__linux__) static int (*realaccept4)(ACCEPT4_SIG) = 0; @@ -50,6 +49,7 @@ bool check_intercept_enabled_for_thread(); #endif #if !defined(__ANDROID__) + bool check_intercept_enabled_for_thread(); static int (*realbind)(BIND_SIG) = 0; static int (*realsendmsg)(SENDMSG_SIG) = 0; static ssize_t (*realsendto)(SENDTO_SIG) = 0; diff --git a/src/SDK_ServiceSetup.cpp b/src/SDK_ServiceSetup.cpp index 9aef71e..87b82ab 100644 --- a/src/SDK_ServiceSetup.cpp +++ b/src/SDK_ServiceSetup.cpp @@ -42,7 +42,7 @@ #include #include -#include "OneService.hpp" +#include "service/OneService.hpp" #include "Utils.hpp" #include "OSUtils.hpp"