From 1487ac304ca7ee9d45bc6f53ce02efe18356f3b4 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Tue, 12 Jul 2016 02:44:17 -0500 Subject: [PATCH] android update --- .../app/src/main/java/ZeroTier/SDK.java | 6 ++- .../joseph/example_app/MainActivity.java | 16 +++++-- integrations/android/example_app/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../UserInterfaceState.xcuserstate | Bin 15031 -> 14966 bytes make-mac.mk | 8 ++-- src/SDK_ServiceSetup.cpp | 44 +++++++++++++++--- src/SDK_ServiceSetup.hpp | 3 ++ 8 files changed, 65 insertions(+), 16 deletions(-) diff --git a/integrations/android/example_app/app/src/main/java/ZeroTier/SDK.java b/integrations/android/example_app/app/src/main/java/ZeroTier/SDK.java index f172041..e974c52 100644 --- a/integrations/android/example_app/app/src/main/java/ZeroTier/SDK.java +++ b/integrations/android/example_app/app/src/main/java/ZeroTier/SDK.java @@ -1,5 +1,9 @@ package ZeroTier; public class SDK { - public native void startOneService(); + public native void startOneService(String homeDir); + public native void joinNetwork(String nwid); + public native void leaveNetwork(String nwid); + public native boolean isRunning(); + static { System.loadLibrary("ZeroTierOneJNI"); } // Loads JNI code } \ No newline at end of file diff --git a/integrations/android/example_app/app/src/main/java/com/example/joseph/example_app/MainActivity.java b/integrations/android/example_app/app/src/main/java/com/example/joseph/example_app/MainActivity.java index 996d011..41507f7 100644 --- a/integrations/android/example_app/app/src/main/java/com/example/joseph/example_app/MainActivity.java +++ b/integrations/android/example_app/app/src/main/java/com/example/joseph/example_app/MainActivity.java @@ -2,6 +2,7 @@ package com.example.joseph.example_app; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.util.Log; import ZeroTier.SDK; @@ -15,19 +16,28 @@ public class MainActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + final SDK wrapper = new SDK(); + final String homeDir = "sdcard/zerotier"; + + // Service thread new Thread(new Runnable() { public void run() { - SDK wrapper = new SDK(); - wrapper.startOneService(); // Calls to JNI code + wrapper.startOneService(homeDir); // Calls to JNI code } }).start(); + // Wait for service before joining network + Log.d("SDK-Javaland", "Waiting for service to start...\n"); + while(!wrapper.isRunning()) { + Log.d("SDK-Javaland", "Waiting...\n"); + } + Log.d("SDK-Javaland","Joining network...\n"); + wrapper.joinNetwork("e5cd7a9e1c3511dd"); // Set up example proxy connection to SDK proxy server Log.d("ZTSDK-InJavaland", "Setting up connection to SDK proxy server"); Socket s = new Socket(); SocketAddress proxyAddr = new InetSocketAddress("0.0.0.0", 1337); Proxy proxy = new Proxy(Proxy.Type.SOCKS, proxyAddr); - } } \ No newline at end of file diff --git a/integrations/android/example_app/build.gradle b/integrations/android/example_app/build.gradle index 12df91c..aff4f41 100644 --- a/integrations/android/example_app/build.gradle +++ b/integrations/android/example_app/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.0-alpha1' + classpath 'com.android.tools.build:gradle:2.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/integrations/android/example_app/gradle/wrapper/gradle-wrapper.properties b/integrations/android/example_app/gradle/wrapper/gradle-wrapper.properties index 122a0dc..bb42b01 100644 --- a/integrations/android/example_app/gradle/wrapper/gradle-wrapper.properties +++ b/integrations/android/example_app/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.10-all.zip +distributionUrl=https://downloads.gradle.org/distributions/gradle-2.14-all.zip diff --git a/integrations/apple/example_app/Example_iOS_App/Example_iOS_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate b/integrations/apple/example_app/Example_iOS_App/Example_iOS_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate index f7b63f17b78f7ab2eb5f5d993802b9baa4769895..1aff161becba01a7c0be72bfb91ffd1a3457b3b1 100644 GIT binary patch delta 4415 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 + "/networks.d/" + nwid + ".conf"; + LOGV("writing conf file = %s\n", confFile.c_str()); if(!ZeroTier::OSUtils::mkdir(netDir)) { LOGV("unable to create %s\n", netDir.c_str()); } if(!ZeroTier::OSUtils::writeFile(confFile.c_str(), "")) { - LOGV("unable to write network conf file: %s\n", nwid); + LOGV("unable to write network conf file: %s\n", confFile.c_str()); } zt1Service->join(nwid); zt_init_rpc(homeDir.c_str(), nwid); // This provides the shim API with the RPC information } void leave_network(const char *nwid) { zt1Service->leave(nwid); } - void zt_join_network(char * nwid) { join_network(nwid); } - void zt_leave_network(char * nwid) { leave_network(nwid); } + + void zt_join_network(const char * nwid) { join_network(nwid); } + void zt_leave_network(const char * nwid) { leave_network(nwid); } bool zt_is_running() { return zt1Service->isRunning(); } void zt_terminate() { zt1Service->terminate(); } + + +#if defined(__ANDROID__) + // JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME + JNIEXPORT void JNICALL Java_ZeroTier_SDK_joinNetwork(JNIEnv *env, jobject thisObj, jstring nwid) { + const char *nwidstr; + if(nwid) { + nwidstr = env->GetStringUTFChars(nwid, NULL); + zt_join_network(nwidstr); + } + } + // JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME + JNIEXPORT void JNICALL Java_ZeroTier_SDK_leaveNetwork(JNIEnv *env, jobject thisObj, jstring nwid) { + const char *nwidstr; + if(nwid) { + nwidstr = env->GetStringUTFChars(nwid, NULL); + zt_leave_network(nwidstr); + } + } + // JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME + JNIEXPORT jboolean JNICALL Java_ZeroTier_SDK_isRunning(JNIEnv *env, jobject thisObj) { + if(zt1Service) + return zt1Service->isRunning(); + return false; + } +#endif + + + #if !defined(__ANDROID__) /* @@ -134,8 +165,9 @@ void zt_init_rpc(const char * path, const char * nwid); #if defined(__ANDROID__) // JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME JNIEXPORT void JNICALL Java_ZeroTier_SDK_startOneService(JNIEnv *env, jobject thisObj, jstring path) { - //char * path; - homeDir = env->GetStringUTFChars(path, NULL); + if(path) { + homeDir = env->GetStringUTFChars(path, NULL); + } #else void *startOneService(void *thread_id) { #endif diff --git a/src/SDK_ServiceSetup.hpp b/src/SDK_ServiceSetup.hpp index 493698b..f2320ea 100644 --- a/src/SDK_ServiceSetup.hpp +++ b/src/SDK_ServiceSetup.hpp @@ -51,6 +51,9 @@ extern std::string homeDir; Java application you *must* follow that convention and any corresponding Java package/classes in your Android project must match this as well */ JNIEXPORT void JNICALL Java_ZeroTier_SDK_startOneService(JNIEnv *env, jobject thisObj, jstring path); + JNIEXPORT void JNICALL Java_ZeroTier_SDK_joinNetwork(JNIEnv *env, jobject thisObj, jstring nwid); + JNIEXPORT void JNICALL Java_ZeroTier_SDK_leaveNetwork(JNIEnv *env, jobject thisObj, jstring nwid); + JNIEXPORT jboolean JNICALL Java_ZeroTier_SDK_isRunning(JNIEnv *env, jobject thisObj); #else void *startOneService(void *thread_id); void init_service(int key, const char * path);