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 cd6c9f2..4443b15 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 @@ -29,6 +29,7 @@ package ZeroTier; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.util.ArrayList; import android.os.ParcelFileDescriptor; import android.util.Pair; @@ -50,6 +51,7 @@ public class SDK { public native void zt_start_service(String homeDir); public native void zt_join_network(String nwid); public native void zt_leave_network(String nwid); + public native ArrayList zt_get_addresses(String nwid); public native boolean zt_running(); // Direct-call API 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 255c981..4f6cdcb 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 @@ -4,6 +4,7 @@ import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import java.net.InetSocketAddress; import android.util.*; +import java.util.ArrayList; import ZeroTier.SDK; @@ -72,28 +73,28 @@ public class MainActivity extends AppCompatActivity { // Listen to incoming connections if(mode==1) { + ArrayList addresses = new ArrayList(); while(err < 0) { try { Thread.sleep(1000); } catch(java.lang.InterruptedException e) { } + addresses = zt.zt_get_addresses("XXXXXXXXXXXXXXXX"); + + if(addresses.size() > 0) { + for(int i=0; ileave(nwid); } bool zts_is_running() { return zt1Service->isRunning(); } void zts_terminate() { zt1Service->terminate(); } +std::vector zt_get_addresses(std::string nwid) +{ + uint64_t nwid_int = strtoull(nwid.c_str(), NULL, 16); + ZeroTier::NetconEthernetTap * tap = zt1Service->getTaps()[nwid_int]; + std::vector ip_strings; + if(tap) { + for(int i=0; i_ips.size(); i++) { + ip_strings.push_back(tap->_ips[i].toString()); + } + return ip_strings; + } + return ip_strings; +} + // Android JNI wrapper // JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME @@ -138,9 +153,27 @@ void zts_terminate() { zt1Service->terminate(); } if(zt1Service) zts_terminate(); } + JNIEXPORT jobject JNICALL Java_ZeroTier_SDK_zt_1get_1addresses(JNIEnv *env, jobject thisObj, jstring nwid) { + const char *nwid_str = env->GetStringUTFChars(nwid, NULL); + std::vector address_strings = zt_get_addresses(nwid_str); + jclass clazz = (*env).FindClass("java/util/ArrayList"); + jobject addresses = (*env).NewObject(clazz, (*env).GetMethodID(clazz, "", "()V")); + + if(address_strings.size()) { + for (int n=0;nCallBooleanMethod(addresses, env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str); + } + } + else { // Add dummy value + jstring _str = (*env).NewStringUTF("-1.-1.-1.-1/-1"); + env->CallBooleanMethod(addresses, env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z"), _str); + } + return addresses; + } #endif - + // Typically used on iOS/OSX #if !defined(__ANDROID__) /* diff --git a/src/SDK_ServiceSetup.hpp b/src/SDK_ServiceSetup.hpp index a021b1c..ee3a309 100644 --- a/src/SDK_ServiceSetup.hpp +++ b/src/SDK_ServiceSetup.hpp @@ -33,12 +33,14 @@ extern "C" { #include #endif +#include + #ifndef ONE_SERVICE_SETUP_HPP #define ONE_SERVICE_SETUP_HPP #define INTERCEPT_ENABLED 111 #define INTERCEPT_DISABLED 222 - + #if defined(__ANDROID__) // JNI naming convention: Java_PACKAGENAME_CLASSNAME_METHODNAME /* If you define anything else in this file it that you wish to expose to your Android @@ -47,6 +49,7 @@ extern "C" { JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1join_1network(JNIEnv *env, jobject thisObj, jstring nwid); JNIEXPORT void JNICALL Java_ZeroTier_SDK_zt_1leave_1network(JNIEnv *env, jobject thisObj, jstring nwid); JNIEXPORT jboolean JNICALL Java_ZeroTier_SDK_zt_1running(JNIEnv *env, jobject thisObj); + JNIEXPORT jobject JNICALL Java_ZeroTier_SDK_zt_1get_1addresses(JNIEnv *env, jobject thisObj, jstring nwid); #else void init_service(int key, const char * path); void init_service_and_rpc(int key, const char * path, const char * nwid); @@ -64,7 +67,7 @@ void zts_join_network(const char * nwid); void zts_leave_network(const char * nwid); bool zts_is_running(); void zts_terminate(); - +std::vector zt_get_addresses(std::string nwid); #endif diff --git a/zerotierone/service/OneService.cpp b/zerotierone/service/OneService.cpp index 045520f..d597f0c 100755 --- a/zerotierone/service/OneService.cpp +++ b/zerotierone/service/OneService.cpp @@ -951,6 +951,8 @@ public: _phy.whack(); } + // For ZT SDK API + virtual void join(const char *hp) { _node->join(Utils::hexStrToU64(hp),NULL); @@ -966,6 +968,11 @@ public: return _homePath; } + virtual std::map< uint64_t,EthernetTap * > getTaps() + { + return _taps; + } + // Begin private implementation methods inline void phyOnDatagram(PhySocket *sock,void **uptr,const struct sockaddr *localAddr,const struct sockaddr *from,void *data,unsigned long len) diff --git a/zerotierone/service/OneService.hpp b/zerotierone/service/OneService.hpp index 8e56cc8..1aa2002 100755 --- a/zerotierone/service/OneService.hpp +++ b/zerotierone/service/OneService.hpp @@ -20,6 +20,14 @@ #define ZT_ONESERVICE_HPP #include +#include + +// Include the right tap device driver for this platform -- add new platforms here +#ifdef SDK + // In network containers builds, use the virtual netcon endpoint instead of a tun/tap port driver + #include "../src/SDK_EthernetTap.hpp" + namespace ZeroTier { typedef NetconEthernetTap EthernetTap; } +#endif // not ZT_SDK so pick a tap driver namespace ZeroTier { @@ -146,6 +154,11 @@ public: */ virtual std::string givenHomePath() = 0; + /* + * + */ + virtual std::map< uint64_t,EthernetTap * > getTaps() = 0; + /** * @return True if service is still running */