The macchina.io REMOTE SDK can be built for Android with cmake
.
The main use case is including the WebTunnelClient
functionality
in an Android application - connecting to a TCP port on a remote
device through the macchina.io REMOTE server tunneling feature.
- Android NDK installed on Windows, macOS or Windows
- CMake 3.19.5 or newer
- Ninja
- OpenSSL 1.1.1 or 3.0.x compiled for Android
On Windows and Linux, download the
android-ndk-*.zip
file for your platform and unpack it in a directory of your choice.
On macOS, use Homebrew to install the NDK:
$ brew install --cask android-ndk
Windows
Install CMake via the installer.
Linux
Install via package manager, e.g.:
$ sudo apt-get install cmake
macOS
Install via Homebrew:
$ brew install cmake
Windows
Download Ninja binary for Windows (ninja-win.zip
) from GitHub ninja-build/ninja.
Linux
Install via package manager, e.g.:
$ sudo apt-get install ninja-build
macOS
Install via Homebrew:
$ brew install ninja
OpenSSL (version 1.1.1 or 3.0.x) must be built for Android, either into static or shared libraries.
Build scripts for creating static libraries (with position independent code) for linking with a shared library, as well as the built libraries can be found in the openss-_for_android project (forked from 217heidai/openssl_for_android).
Note: the libraries must be downloaded separately for each target architecture.
In the following we only show arm64
and x86_64
(for the simulator).
$ curl -L https://github.com/obiltschnig/openssl_for_android/releases/download/3.0.8/OpenSSL_3.0.8_arm64-v8a.tar.gz | tar xz
$ curl -L https://github.com/obiltschnig/openssl_for_android/releases/download/3.0.8/OpenSSL_3.0.8_x86_64.tar.gz | tar xz
These two commands will download and extract the OpenSSL headers and static libraries
for arm64
and x86_64
into the following directory structure in the current working
directory:
- openssl_3.0.8_arm64-v8a
- include
- lib
- openssl_3.0.8_x86_64
- include
- lib
$ git clone [email protected]:my-devices/sdk.git
$ cd sdk
$ cmake . -Bcmake-build-android-arm64-v8a -GNinja \
-DCMAKE_SYSTEM_NAME=Android \
-DCMAKE_SYSTEM_VERSION=21 \
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
-DCMAKE_INSTALL_PREFIX=`pwd`/cmake-install-android-arm64-v8a \
-DCMAKE_ANDROID_NDK=/path/to/android-ndk \
-DENABLE_WEBTUNNELAGENT=NO \
-DENABLE_WEBTUNNELCLIENT=NO \
-DENABLE_WEBTUNNELSSH=NO \
-DENABLE_WEBTUNNELSCP=NO \
-DENABLE_WEBTUNNELSFTP=NO \
-DENABLE_WEBTUNNELVNC=NO \
-DENABLE_WEBTUNNELRDP=NO \
-DENABLE_WEBTUNNELCLIENTLIB=YES \
-DOPENSSL_INCLUDE_DIR=`pwd`/../openssl_3.0.8_arm64-v8a/include \
-DOPENSSL_CRYPTO_LIBRARY=`pwd`/../openssl_3.0.8_arm64-v8a/lib/libcrypto.a \
-DOPENSSL_SSL_LIBRARY=`pwd`/../openssl_3.0.8_arm64-v8a/lib/libssl.a
$ cmake --build cmake-build-android-arm64-v8a && cmake --install cmake-build-android-arm64-v8a
Notes
- The above command only builds for a single target architecture (
arm64-v8a
). The commands need to be repeated for additional architectures (e.g.,x86_64
for the simulator), witharm64-v8a
replaced withx86_64
in the arguments. - The paths to the OpenSSL include directory and the
libssl
andlibcrypto
libraries are directly passed to CMake (-DOPENSSL_INCLUDE_DIR=...
,-DOPENSSL_CRYPTO_LIBRARY=...
,-DOPENSSL_SSL_LIBRARY=...
), using the paths from theopenssl_for_android
script. - All command-line tools are disabled in the build.
- Header files for the SDK are installed in
./cmake-install-android-arm64-v8a/include
, static libraries are in./cmake-install-android-arm64-v8a/lib
. You can of course changes these locations by modifying the respective CMake arguments (CMAKE_INSTALL_PREFIX
). - The resulting static libraries must be linked to your Android native application.
The libraries are
libWebTunnelClient.a
,libPocoWebTunnel.a
,libPocoNetSSL.a
,libPocoCrypto.a
,libPocoNet.a
,libPocoUtil.a
, andlibPocoFoundation.a
. Furthermore, the OpenSSL libraries (libcrypto.a
andlibssl.a
) must also be linked to the Android application. - See the CMake documentation on cross-compiling for Android for more information.
Building WebTunnelClientLib as a Standalone Shared Library
In some cases it may be useful to compile libWebTunnelClient
as a standalone shared
library, e.g. for use with JNI or .NET P/Invoke. This can be done by passing the following
additional CMake definitions:
-DWEBTUNNELCLIENTLIB_SHARED=YES
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
The resulting build commands therefore are:
$ git clone [email protected]:my-devices/sdk.git
$ cd sdk
$ cmake . -Bcmake-build-android-arm64-v8a -GNinja \
-DCMAKE_SYSTEM_NAME=Android \
-DCMAKE_SYSTEM_VERSION=21 \
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
-DCMAKE_INSTALL_PREFIX=`pwd`/cmake-install-android-arm64-v8a \
-DCMAKE_ANDROID_NDK=/path/to/android-ndk \
-DENABLE_WEBTUNNELAGENT=NO \
-DENABLE_WEBTUNNELCLIENT=NO \
-DENABLE_WEBTUNNELSSH=NO \
-DENABLE_WEBTUNNELSCP=NO \
-DENABLE_WEBTUNNELSFTP=NO \
-DENABLE_WEBTUNNELVNC=NO \
-DENABLE_WEBTUNNELRDP=NO \
-DENABLE_WEBTUNNELCLIENTLIB=YES \
-DWEBTUNNELCLIENTLIB_SHARED=YES \
-DOPENSSL_INCLUDE_DIR=`pwd`/../openssl_3.0.8_arm64-v8a/include \
-DOPENSSL_CRYPTO_LIBRARY=`pwd`/../openssl_3.0.8_arm64-v8a/lib/libcrypto.a \
-DOPENSSL_SSL_LIBRARY=`pwd`/../openssl_3.0.8_arm64-v8a/lib/libssl.a
$ cmake --build cmake-build-android-arm64-v8a && cmake --install cmake-build-android-arm64-v8a