From e831c748c7ce20b9c6d5670050e2f053b022a27c Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Tue, 31 Jul 2018 11:53:19 -0700 Subject: [PATCH] Moved Android library project to packages/ --- examples/cpp/ipv4simple/ipv4server.cpp | 18 +++++- .../java/com/zerotier/libzt/ZeroTier.java | 12 ++-- packages/README.md | 9 +++ {examples => packages}/android/.gitignore | 0 {examples => packages}/android/app/.gitignore | 0 .../android/app/build.gradle | 10 +++- .../android/app/proguard-rules.pro | 0 .../zerotier/ExampleInstrumentedTest.java | 0 .../android/app/src/main/AndroidManifest.xml | 0 .../android/app/src/main/java/ZTFDSet.java | 54 ++++++++++++++++++ .../app/src/main/java/ZTSocketAddress.java | 17 +++--- .../android/app/src/main/java/ZeroTier.java | 15 ++--- .../com/example/zerotier/MainActivity.java | 5 +- .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../app/src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../app/src/main/res/values/colors.xml | 0 .../app/src/main/res/values/strings.xml | 0 .../app/src/main/res/values/styles.xml | 0 .../com/example/zerotier/ExampleUnitTest.java | 0 {examples => packages}/android/build.gradle | 0 .../android/gradle.properties | 0 .../android/gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 {examples => packages}/android/gradlew | 0 {examples => packages}/android/gradlew.bat | 0 .../android/settings.gradle | 0 39 files changed, 111 insertions(+), 29 deletions(-) create mode 100644 packages/README.md rename {examples => packages}/android/.gitignore (100%) rename {examples => packages}/android/app/.gitignore (100%) rename {examples => packages}/android/app/build.gradle (79%) rename {examples => packages}/android/app/proguard-rules.pro (100%) rename {examples => packages}/android/app/src/androidTest/java/com/example/zerotier/ExampleInstrumentedTest.java (100%) rename {examples => packages}/android/app/src/main/AndroidManifest.xml (100%) create mode 100644 packages/android/app/src/main/java/ZTFDSet.java rename {examples => packages}/android/app/src/main/java/ZTSocketAddress.java (90%) rename {examples => packages}/android/app/src/main/java/ZeroTier.java (85%) rename {examples => packages}/android/app/src/main/java/com/example/zerotier/MainActivity.java (96%) rename {examples => packages}/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename {examples => packages}/android/app/src/main/res/drawable/ic_launcher_background.xml (100%) rename {examples => packages}/android/app/src/main/res/layout/activity_main.xml (100%) rename {examples => packages}/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {examples => packages}/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename {examples => packages}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {examples => packages}/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename {examples => packages}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {examples => packages}/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename {examples => packages}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {examples => packages}/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename {examples => packages}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {examples => packages}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename {examples => packages}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {examples => packages}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename {examples => packages}/android/app/src/main/res/values/colors.xml (100%) rename {examples => packages}/android/app/src/main/res/values/strings.xml (100%) rename {examples => packages}/android/app/src/main/res/values/styles.xml (100%) rename {examples => packages}/android/app/src/test/java/com/example/zerotier/ExampleUnitTest.java (100%) rename {examples => packages}/android/build.gradle (100%) rename {examples => packages}/android/gradle.properties (100%) rename {examples => packages}/android/gradle/wrapper/gradle-wrapper.jar (100%) rename {examples => packages}/android/gradle/wrapper/gradle-wrapper.properties (100%) rename {examples => packages}/android/gradlew (100%) rename {examples => packages}/android/gradlew.bat (100%) rename {examples => packages}/android/settings.gradle (100%) diff --git a/examples/cpp/ipv4simple/ipv4server.cpp b/examples/cpp/ipv4simple/ipv4server.cpp index 9744b5b..260e9e4 100644 --- a/examples/cpp/ipv4simple/ipv4server.cpp +++ b/examples/cpp/ipv4simple/ipv4server.cpp @@ -52,7 +52,7 @@ int main(int argc, char **argv) std::string nwidstr = argv[2]; int bind_port = atoi(argv[3]); int w=0, r=0, err=0, sockfd, accfd; - char rbuf[32]; + char rbuf[1000]; memset(rbuf, 0, sizeof rbuf); struct sockaddr_in in4, acc_in4; @@ -90,11 +90,25 @@ int main(int argc, char **argv) zts_getpeername(accfd, (struct sockaddr*)&acc_in4, &peer_addrlen); printf("accepted connection from %s : %d\n", inet_ntoa(acc_in4.sin_addr), ntohs(acc_in4.sin_port)); + int tot = 0; printf("reading from client...\n"); - r = zts_read(accfd, rbuf, sizeof rbuf); + while(true) { + memset(rbuf, 0, sizeof rbuf); + if (tot == 500000) + { + break; + } + r = zts_read(accfd, rbuf, sizeof rbuf); + printf("r=%d\n", r); + printf("Received : %s\n", rbuf); + tot+= r; + printf("tot=%d\n", tot); + } + printf("tot=%d\n", tot); printf("sending to client...\n"); w = zts_write(accfd, rbuf, strlen(rbuf)); + printf("w=%d\n", r); printf("Received : %s\n", rbuf); diff --git a/examples/java/com/zerotier/libzt/ZeroTier.java b/examples/java/com/zerotier/libzt/ZeroTier.java index f6c3c01..26e337b 100644 --- a/examples/java/com/zerotier/libzt/ZeroTier.java +++ b/examples/java/com/zerotier/libzt/ZeroTier.java @@ -68,12 +68,12 @@ public class ZeroTier { public native int close(int fd); public native int setsockopt(int fd, int level, int optname, int optval, int optlen); public native int getsockopt(int fd, int level, int optname, int optval, int optlen); - public native int sendto(int fd, byte[] buf, int len, int flags, ZTSocketAddress addr); - public native int send(int fd, byte[] buf, int len, int flags); - public native int recv(int fd, byte[] buf, int len, int flags); - public native int recvfrom(int fd, byte[] buf, int len, int flags, ZTSocketAddress addr); - public native int read(int fd, byte[] buf, int len); - public native int write(int fd, byte[] buf, int len); + public native int sendto(int fd, byte[] buf, int flags, ZTSocketAddress addr); + public native int send(int fd, byte[] buf, int flags); + public native int recv(int fd, byte[] buf, int flags); + public native int recvfrom(int fd, byte[] buf, int flags, ZTSocketAddress addr); + public native int read(int fd, byte[] buf); + public native int write(int fd, byte[] buf); public native int shutdown(int fd, int how); public native boolean getsockname(int fd, ZTSocketAddress addr); public native int getpeername(int fd, ZTSocketAddress addr); diff --git a/packages/README.md b/packages/README.md new file mode 100644 index 0000000..c1289e3 --- /dev/null +++ b/packages/README.md @@ -0,0 +1,9 @@ +### Projects and scripts for building various packages + +### Android + +Pre-built binaries can be found [here]() + +This android project builds from the root `CMakeLists.txt` and generates a `.aar` Android Archive which can be imported into an Android Studio project as a library. An example of this library's usage can be found in [examples/android](examples/android). Further examples of the libzt JNI API can be seen in [examples/java](examples/java). + +### PyPI \ No newline at end of file diff --git a/examples/android/.gitignore b/packages/android/.gitignore similarity index 100% rename from examples/android/.gitignore rename to packages/android/.gitignore diff --git a/examples/android/app/.gitignore b/packages/android/app/.gitignore similarity index 100% rename from examples/android/app/.gitignore rename to packages/android/app/.gitignore diff --git a/examples/android/app/build.gradle b/packages/android/app/build.gradle similarity index 79% rename from examples/android/app/build.gradle rename to packages/android/app/build.gradle index b624c7a..b52d99b 100644 --- a/examples/android/app/build.gradle +++ b/packages/android/app/build.gradle @@ -1,9 +1,8 @@ -apply plugin: 'com.android.application' +apply plugin: 'com.android.library' android { compileSdkVersion 28 defaultConfig { - applicationId "com.example.zerotier" minSdkVersion 21 targetSdkVersion 28 versionCode 1 @@ -14,6 +13,11 @@ android { cppFlags "" } } + ndk { + // Tells Gradle to build outputs for the following ABIs and package + // them into your APK. + abiFilters 'armeabi-v7a' + } } buildTypes { release { @@ -23,7 +27,7 @@ android { } externalNativeBuild { cmake { - path "/Users/joseph/op/zt/neolibzt/CMakeLists.txt" + path "../../../CMakeLists.txt" } } } diff --git a/examples/android/app/proguard-rules.pro b/packages/android/app/proguard-rules.pro similarity index 100% rename from examples/android/app/proguard-rules.pro rename to packages/android/app/proguard-rules.pro diff --git a/examples/android/app/src/androidTest/java/com/example/zerotier/ExampleInstrumentedTest.java b/packages/android/app/src/androidTest/java/com/example/zerotier/ExampleInstrumentedTest.java similarity index 100% rename from examples/android/app/src/androidTest/java/com/example/zerotier/ExampleInstrumentedTest.java rename to packages/android/app/src/androidTest/java/com/example/zerotier/ExampleInstrumentedTest.java diff --git a/examples/android/app/src/main/AndroidManifest.xml b/packages/android/app/src/main/AndroidManifest.xml similarity index 100% rename from examples/android/app/src/main/AndroidManifest.xml rename to packages/android/app/src/main/AndroidManifest.xml diff --git a/packages/android/app/src/main/java/ZTFDSet.java b/packages/android/app/src/main/java/ZTFDSet.java new file mode 100644 index 0000000..cf5bd7b --- /dev/null +++ b/packages/android/app/src/main/java/ZTFDSet.java @@ -0,0 +1,54 @@ +/* + * ZeroTier SDK - Network Virtualization Everywhere + * Copyright (C) 2011-2018 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. + */ + +package com.zerotier.libzt; + +public class ZTFDSet +{ + byte[] fds_bits = new byte[1024]; + + public void CLR(int fd) + { + fds_bits[fd] = 0x00; + } + + public boolean ISSET(int fd) + { + return fds_bits[fd] == 0x01; + } + + public void SET(int fd) + { + fds_bits[fd] = 0x01; + } + + public void ZERO() + { + for (int i=0; i<1024; i++) { + fds_bits[i] = 0x00; + } + } +} \ No newline at end of file diff --git a/examples/android/app/src/main/java/ZTSocketAddress.java b/packages/android/app/src/main/java/ZTSocketAddress.java similarity index 90% rename from examples/android/app/src/main/java/ZTSocketAddress.java rename to packages/android/app/src/main/java/ZTSocketAddress.java index eac95a3..b86a985 100644 --- a/examples/android/app/src/main/java/ZTSocketAddress.java +++ b/packages/android/app/src/main/java/ZTSocketAddress.java @@ -24,9 +24,11 @@ * of your own application. */ -package zerotier; +package com.zerotier.libzt; -import java.net.*; +import com.zerotier.libzt.ZeroTier; + +import java.net.InetAddress; // Designed to transport address information across the JNI boundary public class ZTSocketAddress @@ -34,9 +36,6 @@ public class ZTSocketAddress public byte[] _ip6 = new byte[16]; public byte[] _ip4 = new byte[4]; - public long _ipdata; - public long _ipdata_ext; - public int _family; public int _port; // Also reused for netmask or prefix @@ -45,7 +44,7 @@ public class ZTSocketAddress public ZTSocketAddress(String ipStr, int port) { if(ipStr.contains(":")) { - _family = zerotier.ZeroTier.AF_INET6; + _family = ZeroTier.AF_INET6; try { InetAddress ip = InetAddress.getByName(ipStr); _ip6 = ip.getAddress(); @@ -53,7 +52,7 @@ public class ZTSocketAddress catch (Exception e) { } } else if(ipStr.contains(".")) { - _family = zerotier.ZeroTier.AF_INET; + _family = ZeroTier.AF_INET; try { InetAddress ip = InetAddress.getByName(ipStr); _ip4 = ip.getAddress(); @@ -69,7 +68,7 @@ public class ZTSocketAddress private String ipString() { - if (_family == zerotier.ZeroTier.AF_INET) { + if (_family == ZeroTier.AF_INET) { try { InetAddress inet = InetAddress.getByAddress(_ip4); return "" + inet.getHostAddress(); @@ -77,7 +76,7 @@ public class ZTSocketAddress System.out.println(e); } } - if (_family == zerotier.ZeroTier.AF_INET6) { + if (_family == ZeroTier.AF_INET6) { try { InetAddress inet = InetAddress.getByAddress(_ip6); return "" + inet.getHostAddress(); diff --git a/examples/android/app/src/main/java/ZeroTier.java b/packages/android/app/src/main/java/ZeroTier.java similarity index 85% rename from examples/android/app/src/main/java/ZeroTier.java rename to packages/android/app/src/main/java/ZeroTier.java index 8c7d060..26e337b 100644 --- a/examples/android/app/src/main/java/ZeroTier.java +++ b/packages/android/app/src/main/java/ZeroTier.java @@ -24,7 +24,7 @@ * of your own application. */ -package zerotier; +package com.zerotier.libzt; import java.net.*; @@ -68,14 +68,15 @@ public class ZeroTier { public native int close(int fd); public native int setsockopt(int fd, int level, int optname, int optval, int optlen); public native int getsockopt(int fd, int level, int optname, int optval, int optlen); - public native int sendto(int fd, byte[] buf, int len, int flags, ZTSocketAddress addr); - public native int send(int fd, byte[] buf, int len, int flags); - public native int recv(int fd, byte[] buf, int len, int flags); - public native int recvfrom(int fd, byte[] buf, int len, int flags, ZTSocketAddress addr); - public native int read(int fd, byte[] buf, int len); - public native int write(int fd, byte[] buf, int len); + public native int sendto(int fd, byte[] buf, int flags, ZTSocketAddress addr); + public native int send(int fd, byte[] buf, int flags); + public native int recv(int fd, byte[] buf, int flags); + public native int recvfrom(int fd, byte[] buf, int flags, ZTSocketAddress addr); + public native int read(int fd, byte[] buf); + public native int write(int fd, byte[] buf); public native int shutdown(int fd, int how); public native boolean getsockname(int fd, ZTSocketAddress addr); public native int getpeername(int fd, ZTSocketAddress addr); public native int fcntl(int sock, int cmd, int flag); + public native int select(int nfds, ZTFDSet readfds, ZTFDSet writefds, ZTFDSet exceptfds, int timeout_sec, int timeout_usec); } \ No newline at end of file diff --git a/examples/android/app/src/main/java/com/example/zerotier/MainActivity.java b/packages/android/app/src/main/java/com/example/zerotier/MainActivity.java similarity index 96% rename from examples/android/app/src/main/java/com/example/zerotier/MainActivity.java rename to packages/android/app/src/main/java/com/example/zerotier/MainActivity.java index 7ad79e7..66ee81b 100644 --- a/examples/android/app/src/main/java/com/example/zerotier/MainActivity.java +++ b/packages/android/app/src/main/java/com/example/zerotier/MainActivity.java @@ -4,8 +4,9 @@ import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; -import zerotier.*; -import java.net.*; +import com.zerotier.libzt.ZeroTier; +import com.zerotier.libzt.ZTSocketAddress; +import com.zerotier.libzt.ZTFDSet; public class MainActivity extends AppCompatActivity { diff --git a/examples/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/packages/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from examples/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to packages/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/examples/android/app/src/main/res/drawable/ic_launcher_background.xml b/packages/android/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from examples/android/app/src/main/res/drawable/ic_launcher_background.xml rename to packages/android/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/examples/android/app/src/main/res/layout/activity_main.xml b/packages/android/app/src/main/res/layout/activity_main.xml similarity index 100% rename from examples/android/app/src/main/res/layout/activity_main.xml rename to packages/android/app/src/main/res/layout/activity_main.xml diff --git a/examples/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/packages/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from examples/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to packages/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/examples/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/packages/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from examples/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to packages/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/examples/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from examples/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to packages/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/examples/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from examples/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to packages/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/examples/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from examples/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to packages/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/examples/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/packages/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from examples/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to packages/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/examples/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from examples/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/examples/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from examples/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/examples/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from examples/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/examples/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from examples/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/examples/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from examples/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/examples/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from examples/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/examples/android/app/src/main/res/values/colors.xml b/packages/android/app/src/main/res/values/colors.xml similarity index 100% rename from examples/android/app/src/main/res/values/colors.xml rename to packages/android/app/src/main/res/values/colors.xml diff --git a/examples/android/app/src/main/res/values/strings.xml b/packages/android/app/src/main/res/values/strings.xml similarity index 100% rename from examples/android/app/src/main/res/values/strings.xml rename to packages/android/app/src/main/res/values/strings.xml diff --git a/examples/android/app/src/main/res/values/styles.xml b/packages/android/app/src/main/res/values/styles.xml similarity index 100% rename from examples/android/app/src/main/res/values/styles.xml rename to packages/android/app/src/main/res/values/styles.xml diff --git a/examples/android/app/src/test/java/com/example/zerotier/ExampleUnitTest.java b/packages/android/app/src/test/java/com/example/zerotier/ExampleUnitTest.java similarity index 100% rename from examples/android/app/src/test/java/com/example/zerotier/ExampleUnitTest.java rename to packages/android/app/src/test/java/com/example/zerotier/ExampleUnitTest.java diff --git a/examples/android/build.gradle b/packages/android/build.gradle similarity index 100% rename from examples/android/build.gradle rename to packages/android/build.gradle diff --git a/examples/android/gradle.properties b/packages/android/gradle.properties similarity index 100% rename from examples/android/gradle.properties rename to packages/android/gradle.properties diff --git a/examples/android/gradle/wrapper/gradle-wrapper.jar b/packages/android/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from examples/android/gradle/wrapper/gradle-wrapper.jar rename to packages/android/gradle/wrapper/gradle-wrapper.jar diff --git a/examples/android/gradle/wrapper/gradle-wrapper.properties b/packages/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from examples/android/gradle/wrapper/gradle-wrapper.properties rename to packages/android/gradle/wrapper/gradle-wrapper.properties diff --git a/examples/android/gradlew b/packages/android/gradlew similarity index 100% rename from examples/android/gradlew rename to packages/android/gradlew diff --git a/examples/android/gradlew.bat b/packages/android/gradlew.bat similarity index 100% rename from examples/android/gradlew.bat rename to packages/android/gradlew.bat diff --git a/examples/android/settings.gradle b/packages/android/settings.gradle similarity index 100% rename from examples/android/settings.gradle rename to packages/android/settings.gradle