1#!/bin/bash
2################################################################################
3#  THIS FILE IS 100% GENERATED BY ZPROJECT; DO NOT EDIT EXCEPT EXPERIMENTALLY  #
4#  Read the zproject/README.md for information about making permanent changes. #
5################################################################################
6#   Build JNI interface for Android
7#
8#   Requires these environment variables be set, e.g.:
9#
10#     ANDROID_NDK_ROOT=$HOME/android-ndk-r20
11#
12#   Exit if any step fails
13set -e
14
15# Set this to enable verbose profiling
16[ -n "${CI_TIME-}" ] || CI_TIME=""
17case "$CI_TIME" in
18    [Yy][Ee][Ss]|[Oo][Nn]|[Tt][Rr][Uu][Ee])
19        CI_TIME="time -p " ;;
20    [Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee])
21        CI_TIME="" ;;
22esac
23
24# Set this to enable verbose tracing
25[ -n "${CI_TRACE-}" ] || CI_TRACE="no"
26case "$CI_TRACE" in
27    [Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee])
28        set +x ;;
29    [Yy][Ee][Ss]|[Oo][Nn]|[Tt][Rr][Uu][Ee])
30        set -x
31        MAKE_OPTIONS=VERBOSE=1
32        ;;
33esac
34
35function usage {
36    echo "Usage ./build.sh [ arm | arm64 | x86 | x86_64 ]"
37}
38
39BUILD_ARCH=$1
40if [ -z $BUILD_ARCH ]; then
41    usage
42    exit 1
43fi
44
45source ../../../../builds/android/android_build_helper.sh
46
47export MIN_SDK_VERSION=21
48export ANDROID_BUILD_DIR=/tmp/android_build
49
50#   Build any dependent libraries
51#   Use a default value assuming that dependent libraries sits alongside this one
52
53#   Ensure we've built dependencies for Android
54echo "********  Building CZMQ Android native libraries"
55( cd ../../../../builds/android && ./build.sh $BUILD_ARCH )
56
57#   Ensure we've built JNI interface
58echo "********  Building CZMQ JNI interface & classes"
59( cd ../.. && TERM=dumb ./gradlew build jar -PbuildPrefix=$BUILD_PREFIX --info )
60
61echo "********  Building CZMQ JNI for Android"
62rm -rf build && mkdir build && cd build
63# Export android build's environment variables for cmake
64android_build_set_env $BUILD_ARCH
65cmake -v \
66    -DANDROID_ABI=$TOOLCHAIN_ABI \
67    -DANDROID_PLATFORM=$MIN_SDK_VERSION \
68    -DANDROID_STL=c++_shared \
69    -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake \
70    -DCMAKE_FIND_ROOT_PATH=$ANDROID_BUILD_PREFIX \
71    ..
72
73#   CMake wrongly searches current directory and then toolchain path instead
74#   of lib path for these files, so make them available temporarily
75ln -s $ANDROID_SYS_ROOT/usr/lib/crtend_so.o
76ln -s $ANDROID_SYS_ROOT/usr/lib/crtbegin_so.o
77
78make $MAKE_OPTIONS
79
80echo "********  Building jar for $TOOLCHAIN_ABI"
81#   Copy class files into org/zeromq/etc.
82find ../../build/libs/ -type f -name 'czmq-jni-*.jar' ! -name '*javadoc.jar' ! -name '*sources.jar' -exec unzip -q {} +
83
84#   Copy native libraries into lib/$TOOLCHAIN_ABI
85mkdir -p lib/$TOOLCHAIN_ABI
86cp libczmqjni.so lib/$TOOLCHAIN_ABI
87cp $ANDROID_BUILD_PREFIX/lib/*.so lib/$TOOLCHAIN_ABI
88cp $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++/libs/$TOOLCHAIN_ABI/libc++_shared.so lib/$TOOLCHAIN_ABI
89
90#   Build android jar
91zip -r -m ../czmq-android-$TOOLCHAIN_ABI-4.2.1.jar lib/ org/ META-INF/
92cd ..
93rm -rf build
94
95echo "********  Merging ABI jars"
96mkdir build && cd build
97#   Copy contents from all ABI jar - overwriting class files and manifest
98unzip -qo '../czmq-android-*4.2.1.jar'
99#   Build merged jar
100zip -r -m ../czmq-android-4.2.1.jar lib/ org/ META-INF/
101cd ..
102rm -rf build
103
104echo "********  Complete"
105