From eec54ae91157fa64a6beda95c1bf295adb12e8a4 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Wed, 22 Jun 2016 16:01:03 -0700 Subject: [PATCH] updated android readme --- ...id_zt_sdk.md => android_unity3d_zt_sdk.md} | 0 docs/android_zt_sdk.md | 38 ++++++++---------- ...3d_ios_zt_sdk.md => ios_unity3d_zt_sdk.md} | 0 ...3d_osx_zt_sdk.md => osx_unity3d_zt_sdk.md} | 0 .../UserInterfaceState.xcuserstate | Bin 24070 -> 24066 bytes .../project.pbxproj | 16 +------- .../UserInterfaceState.xcuserstate | Bin 56405 -> 56023 bytes integrations/README.md | 4 +- make-linux.mk | 5 --- make-mac.mk | 18 ++++++--- 10 files changed, 34 insertions(+), 47 deletions(-) rename docs/{unity3d_android_zt_sdk.md => android_unity3d_zt_sdk.md} (100%) rename docs/{unity3d_ios_zt_sdk.md => ios_unity3d_zt_sdk.md} (100%) rename docs/{unity3d_osx_zt_sdk.md => osx_unity3d_zt_sdk.md} (100%) diff --git a/docs/unity3d_android_zt_sdk.md b/docs/android_unity3d_zt_sdk.md similarity index 100% rename from docs/unity3d_android_zt_sdk.md rename to docs/android_unity3d_zt_sdk.md diff --git a/docs/android_zt_sdk.md b/docs/android_zt_sdk.md index 67c24d7..a4c7b5d 100644 --- a/docs/android_zt_sdk.md +++ b/docs/android_zt_sdk.md @@ -1,29 +1,29 @@ -Android + ZeroTier SDK +Android + ZeroTier SDK ==== Welcome! -Imagine a flat, encrypted, no-configuration LAN for all of the instances of your Android app. +Imagine a flat, encrypted, no-configuration LAN for all of the instances of your Android app. This short tutorial will show you how to enable ZeroTier functionality for your Android app with little to no code modification. Check out our [ZeroTier SDK](https://www.zerotier.com/blog) page for more info on how the integration works and [Shim Techniques](https://www.zerotier.com/blog) for a discussion of shims available for your app/technology. In this example we aim to set up a minimal [Android Studio](https://developer.android.com/studio/index.html) project which contains all of the components necessary to enable ZeroTier for your app. If you'd rather skip all of these steps and grab the code, look in the [sdk/android](https://github.com/zerotier/ZeroTierOne/tree/dev/netcon/Android) folder in the source tree. Otherwise, let's get started! -**Step 1: Build Shared Library `libZeroTierOneJNI.so`** +*NOTE: For Android JNI libraries to build you'll need to install [Android Studio](https://developer.android.com/studio/index.html) and the [Android NDK](https://developer.android.com/ndk/index.html), and you'll need to tell our project where you put it by putting the path in [this file](Android/proj/local.properties), if you don't have these things installed and configured we will detect that and just skip those builds automatically.* -Open `zerotiersdk/integrations/Android/proj` and build it. +**Step 1: Select build targets** + - Specify the target architectures you want to build in [Application.mk](android/java/jni/Application.mk). By default it will build `arm64-v8a`, `armeabi`, `armeabi-v7a`, `mips`, `mips64`, `x86`, and `x86_64`. -*Note: Building the project will take a while if you are building for all architectures, See note below on how to speed up this process.* +**Step 2: Build Shared Library** + - `make android_jni_lib` + - The resultant `build/android_jni_lib_*/libZeroTierOneJNI.so` will be what you want to import for your own project to provide the API to your app. Select your architecture and copy the shared library into `YourProject/src/main/jniLibs/YOUR_ARCH/` -The resultant `zerotiersdk/integrations/Android/java/libs/YOUR_ARCH/libZeroTierOneJNI.so` will be what you want to import for your own project to provide the shim interface to your app. Select your architecture and copy the shared library into `YourProject/src/main/jniLibs/YOUR_ARCH/` - -**Step 2: App Code Modifications** - -Create new package called `Netcon` in your project and add a new file called `NetconWrapper.java` containing: +**Step 3: App Code Modifications** + - Create new package called `ZeroTierSDK` in your project and add a new file called `ZeroTierSDK.java` containing: ``` -package Netcon; -public class NetconWrapper { +package ZeroTierSDK; +public class ZeroTierSDK_Wrapper { public native void startOneService(); static { System.loadLibrary("ZeroTierOneJNIā€); } // Loads JNI code } @@ -33,17 +33,15 @@ And now, start the service: ``` new Thread(new Runnable() { public void run() { - NetconWrapper wrapper = new NetconWrapper(); + ZeroTierSDK_Wrapper wrapper = new ZeroTierSDK_Wrapper(); wrapper.startOneService(); // Calls to JNI code } }).start(); ``` -**Step 3: Pick a shim for your app** - +**Step 4: Pick an API for your app** If functional interposition isn't available for the API or library you've chosen to use, ZeroTier offers a SOCKS5 proxy server which can allow connectivity to your virtual network as long as your client API supports the SOCKS5 protocol. This proxy service will run alongside the tap service and can be turned on by compiling with the `-DUSE_SOCKS_PROXY` flag. By default, the proxy service is available at `0.0.0.0:1337`. -**Step 4: Add necessary app permissions** - +**Step 5: Add necessary app permissions** In order for your application to write the auth keys to the internal storage you'll need to set a few permissions in your `AndroidManifest.xml` file: ``` @@ -51,13 +49,11 @@ In order for your application to write the auth keys to the internal storage you ``` -**Step 5: Join a network!** +**Step 6: Join a network!** Simply call `zt_join_network("XXXXXXXXXXXXXXXX")` *** **Additional notes** -As mentioned above, you can reduce the amount of time required to build the ZeroTier JNI library by only building for the architectures you want. You can specify the architectures in `zerotiersdk/integrations/Android/java/jni/Application.mk` - -If you change the method/class/package name for the Netcon glue code in `NetconWrapper.java` (Not recommended!), you must also change the name of the JNI implementation in the Netcon source to match the new java name. For example, if the glue code is contained in a package `Java.com.example.joseph.NetconProxyTest`, a JNI implementation name of `Java_com_example_joseph_netconproxytest_NetconWrapper_startOneService` would be required in the appropriate C/C++ source/header files. \ No newline at end of file +If you change the method/class/package name for the Netcon glue code in `NetconWrapper.java` (Not recommended!), you must also change the name of the JNI implementation in the Netcon source to match the new java name. For example, if the glue code is contained in a package `Java.com.example.joseph.NetconProxyTest`, a JNI implementation name of `Java_com_example_joseph_netconproxytest_NetconWrapper_startOneService` would be required in the appropriate C/C++ source/header files. diff --git a/docs/unity3d_ios_zt_sdk.md b/docs/ios_unity3d_zt_sdk.md similarity index 100% rename from docs/unity3d_ios_zt_sdk.md rename to docs/ios_unity3d_zt_sdk.md diff --git a/docs/unity3d_osx_zt_sdk.md b/docs/osx_unity3d_zt_sdk.md similarity index 100% rename from docs/unity3d_osx_zt_sdk.md rename to docs/osx_unity3d_zt_sdk.md diff --git a/integrations/Apple/Example_OSX_App/Example_OSX_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate b/integrations/Apple/Example_OSX_App/Example_OSX_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate index 9182bd0cde5fa17093e8cda28fff50e1ec13c704..093efafd38d98f24ae6dba758363cb5f7516d7cd 100644 GIT binary patch delta 3750 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 diff --git a/integrations/Apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.pbxproj b/integrations/Apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.pbxproj index a7fa6fa..b8eaa7f 100644 --- a/integrations/Apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.pbxproj +++ b/integrations/Apple/ZeroTierSDK_Apple/ZeroTierSDK_Apple.xcodeproj/project.pbxproj @@ -56,8 +56,6 @@ 7CC003DC1D121833003E68DC /* BackgroundResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003CE1D121833003E68DC /* BackgroundResolver.cpp */; }; 7CC003DD1D121833003E68DC /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D11D121833003E68DC /* Http.cpp */; }; 7CC003DE1D121833003E68DC /* OSUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D31D121833003E68DC /* OSUtils.cpp */; }; - 7CC003DF1D121833003E68DC /* PortMapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D61D121833003E68DC /* PortMapper.cpp */; }; - 7CC003E01D121833003E68DC /* RoutingTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D81D121833003E68DC /* RoutingTable.cpp */; }; 7CC0041F1D121840003E68DC /* C25519.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003E61D121840003E68DC /* C25519.cpp */; }; 7CC004201D121840003E68DC /* CertificateOfMembership.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003E81D121840003E68DC /* CertificateOfMembership.cpp */; }; 7CC004211D121840003E68DC /* Cluster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003EA1D121840003E68DC /* Cluster.cpp */; }; @@ -119,7 +117,6 @@ 7CC0045D1D1316F5003E68DC /* BackgroundResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003CE1D121833003E68DC /* BackgroundResolver.cpp */; }; 7CC0045E1D1316F5003E68DC /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D11D121833003E68DC /* Http.cpp */; }; 7CC0045F1D1316F5003E68DC /* OSUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D31D121833003E68DC /* OSUtils.cpp */; }; - 7CC004601D1316F5003E68DC /* PortMapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D61D121833003E68DC /* PortMapper.cpp */; }; 7CC004621D131704003E68DC /* etharp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0039D1D1217F2003E68DC /* etharp.c */; }; 7CC004631D131704003E68DC /* ethernetif.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0039E1D1217F2003E68DC /* ethernetif.c */; }; 7CC004641D131704003E68DC /* slipif.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0039F1D1217F2003E68DC /* slipif.c */; }; @@ -193,8 +190,6 @@ 7CC004A81D131E21003E68DC /* BackgroundResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003CE1D121833003E68DC /* BackgroundResolver.cpp */; }; 7CC004A91D131E21003E68DC /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D11D121833003E68DC /* Http.cpp */; }; 7CC004AA1D131E21003E68DC /* OSUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D31D121833003E68DC /* OSUtils.cpp */; }; - 7CC004AB1D131E21003E68DC /* PortMapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D61D121833003E68DC /* PortMapper.cpp */; }; - 7CC004AC1D131E21003E68DC /* RoutingTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D81D121833003E68DC /* RoutingTable.cpp */; }; 7CC004AD1D131E2D003E68DC /* etharp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0039D1D1217F2003E68DC /* etharp.c */; }; 7CC004AE1D131E2D003E68DC /* ethernetif.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0039E1D1217F2003E68DC /* ethernetif.c */; }; 7CC004AF1D131E2D003E68DC /* slipif.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0039F1D1217F2003E68DC /* slipif.c */; }; @@ -268,8 +263,6 @@ 7CC004F81D1324A2003E68DC /* BackgroundResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003CE1D121833003E68DC /* BackgroundResolver.cpp */; }; 7CC004F91D1324A2003E68DC /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D11D121833003E68DC /* Http.cpp */; }; 7CC004FA1D1324A2003E68DC /* OSUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D31D121833003E68DC /* OSUtils.cpp */; }; - 7CC004FB1D1324A2003E68DC /* PortMapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D61D121833003E68DC /* PortMapper.cpp */; }; - 7CC004FC1D1324A2003E68DC /* RoutingTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC003D81D121833003E68DC /* RoutingTable.cpp */; }; 7CC004FD1D1324AB003E68DC /* etharp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0039D1D1217F2003E68DC /* etharp.c */; }; 7CC004FE1D1324AB003E68DC /* ethernetif.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0039E1D1217F2003E68DC /* ethernetif.c */; }; 7CC004FF1D1324AB003E68DC /* slipif.c in Sources */ = {isa = PBXBuildFile; fileRef = 7CC0039F1D1217F2003E68DC /* slipif.c */; }; @@ -994,7 +987,6 @@ 7CC003681D1217C3003E68DC /* netbuf.c in Sources */, 7CC0036B1D1217C3003E68DC /* sockets.c in Sources */, 7CC0038B1D1217D1003E68DC /* timers.c in Sources */, - 7CC003DF1D121833003E68DC /* PortMapper.cpp in Sources */, 7CC0039C1D1217DD003E68DC /* ip.c in Sources */, 7CC004251D121840003E68DC /* IncomingPacket.cpp in Sources */, 7CC003DC1D121833003E68DC /* BackgroundResolver.cpp in Sources */, @@ -1036,7 +1028,6 @@ 7CC004271D121840003E68DC /* Multicaster.cpp in Sources */, 7CC003521D12178D003E68DC /* SDK_Intercept.c in Sources */, 7CC004281D121840003E68DC /* Network.cpp in Sources */, - 7CC003E01D121833003E68DC /* RoutingTable.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1110,7 +1101,6 @@ 7CC0045D1D1316F5003E68DC /* BackgroundResolver.cpp in Sources */, 7CC0045E1D1316F5003E68DC /* Http.cpp in Sources */, 7CC0045F1D1316F5003E68DC /* OSUtils.cpp in Sources */, - 7CC004601D1316F5003E68DC /* PortMapper.cpp in Sources */, 7CC0043C1D1316BF003E68DC /* SDK_Debug.c in Sources */, 7CC0043D1D1316BF003E68DC /* SDK_EthernetTap.cpp in Sources */, 7CC0043E1D1316BF003E68DC /* SDK_Intercept.c in Sources */, @@ -1198,8 +1188,6 @@ 7CC004A81D131E21003E68DC /* BackgroundResolver.cpp in Sources */, 7CC004A91D131E21003E68DC /* Http.cpp in Sources */, 7CC004AA1D131E21003E68DC /* OSUtils.cpp in Sources */, - 7CC004AB1D131E21003E68DC /* PortMapper.cpp in Sources */, - 7CC004AC1D131E21003E68DC /* RoutingTable.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1273,8 +1261,6 @@ 7CC004F81D1324A2003E68DC /* BackgroundResolver.cpp in Sources */, 7CC004F91D1324A2003E68DC /* Http.cpp in Sources */, 7CC004FA1D1324A2003E68DC /* OSUtils.cpp in Sources */, - 7CC004FB1D1324A2003E68DC /* PortMapper.cpp in Sources */, - 7CC004FC1D1324A2003E68DC /* RoutingTable.cpp in Sources */, 7CC004D71D13247A003E68DC /* SDK_Debug.c in Sources */, 7CC004D81D13247A003E68DC /* SDK_EthernetTap.cpp in Sources */, 7CC004D91D13247A003E68DC /* SDK_Intercept.c in Sources */, @@ -1380,6 +1366,7 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; + ENABLE_BITCODE = NO; HEADER_SEARCH_PATHS = ( "$(SRCROOT)/../../../zerotierone", "$(SRCROOT)/../../../ext/lwip/src/include/", @@ -1404,6 +1391,7 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; + ENABLE_BITCODE = NO; HEADER_SEARCH_PATHS = ( "$(SRCROOT)/../../../zerotierone", "$(SRCROOT)/../../../ext/lwip/src/include/", 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 63876e04232c080b62576cd70235c79687427df8..6ac21d7912a7cc202b31967099188952e6e64876 100644 GIT binary patch delta 26329 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 delta 26122 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 M?$v+$|2j|q2f%eGrvLx| diff --git a/integrations/README.md b/integrations/README.md index 9f2ba87..820aa88 100644 --- a/integrations/README.md +++ b/integrations/README.md @@ -5,9 +5,9 @@ If you want everything built at once, type `make all` and go play outside for a *NOTE for Apple platforms: In order to build iOS/OSX Frameworks and Bundles you will need XCode command line tools `xcode-select --install`* -*NOTE for Android: for Android JNI libraries to build you'll need to install [Android Studio](https://developer.android.com/studio/index.html) and the [Android NDK](https://developer.android.com/ndk/index.html), and you'll need to tell our project where you put it by putting the path in [this file](Android/proj/local.properties), if you don't have these things installed and configured we will detect that and just skip those builds automatically. Additionally, you can specify the target architectures you want to build in [Application.mk](Android/java/jni/Application.mk). By default it will build `arm64-v8a`, `armeabi`, `armeabi-v7a`, `mips`, `mips64`, `x86`, and `x86_64`* +*NOTE: For Android JNI libraries to build you'll need to install [Android Studio](https://developer.android.com/studio/index.html) and the [Android NDK](https://developer.android.com/ndk/index.html), and you'll need to tell our project where you put it by putting the path in [this file](Android/proj/local.properties), if you don't have these things installed and configured we will detect that and just skip those builds automatically. Additionally, you can specify the target architectures you want to build in [Application.mk](android/java/jni/Application.mk). By default it will build `arm64-v8a`, `armeabi`, `armeabi-v7a`, `mips`, `mips64`, `x86`, and `x86_64`* -Below are the specific instructions for each integration requiring *little to no modification to your code*. Remember, with a full build we'll put a copy of the appropriate integration instructions in the resultant binary's folder for you anyway. +Below are the specific instructions for each integration requiring *little to no modification to your code*. Remember, with a full build we'll put a copy of the appropriate integration instructions in the resultant binary's folder for you anyway. For more support on these integrations, or if you'd like help creating a new integration, stop by our [community section](https://www.zerotier.com/community/)! diff --git a/make-linux.mk b/make-linux.mk index be509a3..606d472 100644 --- a/make-linux.mk +++ b/make-linux.mk @@ -38,11 +38,6 @@ LDLIBS?= include objects.mk -ifeq ($(ZT_OFFICIAL_RELEASE),1) - DEFS+=-DZT_OFFICIAL_RELEASE - ZT_USE_MINIUPNPC=1 -endif - ifeq ($(ZT_DEBUG),1) DEFS+=-DZT_TRACE CFLAGS+=-Wall -g -pthread $(INCLUDES) $(DEFS) diff --git a/make-mac.mk b/make-mac.mk index e1a45e0..b3ffcf3 100644 --- a/make-mac.mk +++ b/make-mac.mk @@ -42,7 +42,7 @@ else STRIP=strip endif -# Debug output for SDK +# Debug output for SDK # Specific levels can be controlled in src/debug.h ifeq ($(SDK_DEBUG),1) DEFS+=-DSDK_DEBUG @@ -50,24 +50,31 @@ endif CXXFLAGS=$(CFLAGS) -fno-rtti -all: +all: osx_app_framework ios_app_framework osx_unity3d_bundle ios_unity3d_bundle android_jni_lib osx_shared_lib # TODO: CHECK if XCODE TOOLS are installed # Build frameworks for application development -osx_app_framework: +osx_app_framework: cd integrations/apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_OSX build SYMROOT="../../../build/osx_app_framework" -ios_app_framework: + cp docs/osx_zt_sdk.md build/osx_app_framework/README.md +ios_app_framework: cd integrations/apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_iOS build SYMROOT="../../../build/ios_app_framework" + cp docs/ios_zt_sdk.md build/ios_app_framework/README.md # Build bundles for Unity integrations osx_unity3d_bundle: cd integrations/apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_Unity3D_OSX build SYMROOT="../../../build/osx_unity3d_bundle" + cp docs/osx_unity3d_zt_sdk.md build/osx_unity3d_bundle/README.md ios_unity3d_bundle: cd integrations/apple/ZeroTierSDK_Apple; xcodebuild -scheme ZeroTierSDK_Unity3D_iOS build SYMROOT="../../../build/ios_unity3d_bundle" + cp docs/ios_unity3d_zt_sdk.md build/ios_unity3d_bundle/README.md # TODO: CHECK if ANDROID/GRADLE TOOLS are installed # Build library for Android Unity integrations # Build JNI library for Android app integration -android_jni_library: +android_jni_lib: cd integrations/android/proj; ./gradlew assembleDebug +# cd integrations/android/java/libs/; for f in *; do mv "$f" "android_jni_lib_$f"; done + mv integrations/android/java/libs/* build + cp docs/android_zt_sdk.md build/README.md osx_shared_lib: $(OBJS) rm -f *.o @@ -81,6 +88,7 @@ osx_shared_lib: $(OBJS) cp src/libztintercept.so build/osx_shared_lib/libztintercept.so ln -sf zerotier-sdk-service zerotier-cli ln -sf zerotier-sdk-service zerotier-idtool + cp docs/osx_zt_sdk.md build/osx_shared_lib/README.md clean: rm -rf zerotier-cli zerotier-idtool