1*89c4ff92SAndroid Build Coastguard Worker# How to use the Android NDK to build Arm NN 2*89c4ff92SAndroid Build Coastguard Worker 3*89c4ff92SAndroid Build Coastguard Worker- [Introduction](#introduction) 4*89c4ff92SAndroid Build Coastguard Worker- [Initial Setup](#initial-setup) 5*89c4ff92SAndroid Build Coastguard Worker- [Download the Android NDK and make a standalone toolchain](#download-the-android-ndk-and-make-a-standalone-toolchain) 6*89c4ff92SAndroid Build Coastguard Worker- [Install Cmake](#install-cmake) 7*89c4ff92SAndroid Build Coastguard Worker- [Build Flatbuffers](#build-flatbuffers) 8*89c4ff92SAndroid Build Coastguard Worker- [Download Arm NN](#download-arm-nn) 9*89c4ff92SAndroid Build Coastguard Worker- [Get And Build TFLite](#get-and-build-tflite) 10*89c4ff92SAndroid Build Coastguard Worker- [Build Arm Compute Library](#build-arm-compute-library) 11*89c4ff92SAndroid Build Coastguard Worker- [Build Arm NN](#build-arm-nn) 12*89c4ff92SAndroid Build Coastguard Worker- [Build Standalone Sample Dynamic Backend](#build-standalone-sample-dynamic-backend) 13*89c4ff92SAndroid Build Coastguard Worker- [Run the Arm NN unit tests on an Android device](#run-the-arm-nn-unit-tests-on-an-android-device) 14*89c4ff92SAndroid Build Coastguard Worker 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker## Introduction 17*89c4ff92SAndroid Build Coastguard WorkerThese are step-by-step instructions for using the Android NDK to build Arm NN. 18*89c4ff92SAndroid Build Coastguard WorkerThey have been tested on a clean installation of Ubuntu 18.04 and 20.04, and should also work with other OS versions. 19*89c4ff92SAndroid Build Coastguard WorkerThe instructions show how to build the Arm NN core library and its dependencies. 20*89c4ff92SAndroid Build Coastguard Worker 21*89c4ff92SAndroid Build Coastguard WorkerFor ease of use there is a shell script version of this guide located in the scripts directory called [build_android_ndk_guide.sh](scripts/build_android_ndk_guide.sh). 22*89c4ff92SAndroid Build Coastguard WorkerRun the script with a -h flag to see the command line parameters. 23*89c4ff92SAndroid Build Coastguard Worker 24*89c4ff92SAndroid Build Coastguard Worker## Initial Setup 25*89c4ff92SAndroid Build Coastguard Worker 26*89c4ff92SAndroid Build Coastguard WorkerFirst, we need to specify the Android version and the directories you want to build armnn in and to install some applications required to build Arm NN and its dependencies. 27*89c4ff92SAndroid Build Coastguard Worker 28*89c4ff92SAndroid Build Coastguard Worker```bash 29*89c4ff92SAndroid Build Coastguard Workerexport ANDROID_API=30 30*89c4ff92SAndroid Build Coastguard Workerexport WORKING_DIR=$HOME/armnn-devenv 31*89c4ff92SAndroid Build Coastguard Workerexport NDK_DIR=$WORKING_DIR/android-ndk-r25 32*89c4ff92SAndroid Build Coastguard Workerexport NDK_TOOLCHAIN_ROOT=$NDK_DIR/toolchains/llvm/prebuilt/linux-x86_64 33*89c4ff92SAndroid Build Coastguard Workerexport PATH=$NDK_TOOLCHAIN_ROOT/bin/:$PATH 34*89c4ff92SAndroid Build Coastguard Worker``` 35*89c4ff92SAndroid Build Coastguard WorkerYou may want to append the above export variables commands to your `~/.bashrc` (or `~/.bash_profile` in macOS). 36*89c4ff92SAndroid Build Coastguard Worker 37*89c4ff92SAndroid Build Coastguard WorkerThe ANDROID_API variable should be set to the Android API version number you are using. For example, "30" for Android R. The WORKING_DIR can be any directory you have write permissions to. 38*89c4ff92SAndroid Build Coastguard Worker 39*89c4ff92SAndroid Build Coastguard Worker### Required Applications 40*89c4ff92SAndroid Build Coastguard WorkerGit is required to obtain Arm NN. If this has not been already installed then install it using: 41*89c4ff92SAndroid Build Coastguard Worker```bash 42*89c4ff92SAndroid Build Coastguard Workersudo apt install git 43*89c4ff92SAndroid Build Coastguard Worker``` 44*89c4ff92SAndroid Build Coastguard Worker 45*89c4ff92SAndroid Build Coastguard WorkerArm Compute Library requires SCons. If this has not been already installed then install it using: 46*89c4ff92SAndroid Build Coastguard Worker```bash 47*89c4ff92SAndroid Build Coastguard Workersudo apt install scons 48*89c4ff92SAndroid Build Coastguard Worker``` 49*89c4ff92SAndroid Build Coastguard Worker 50*89c4ff92SAndroid Build Coastguard WorkerCMake is required to build Arm NN and its dependencies. If this has not been already installed then install it using: 51*89c4ff92SAndroid Build Coastguard Worker```bash 52*89c4ff92SAndroid Build Coastguard Workersudo apt install cmake 53*89c4ff92SAndroid Build Coastguard Worker``` 54*89c4ff92SAndroid Build Coastguard Worker 55*89c4ff92SAndroid Build Coastguard Worker## Download the Android NDK and make a standalone toolchain 56*89c4ff92SAndroid Build Coastguard Worker 57*89c4ff92SAndroid Build Coastguard WorkerDownload the Android NDK from [the official website](https://developer.android.com/ndk/downloads/index.html): 58*89c4ff92SAndroid Build Coastguard Worker```bash 59*89c4ff92SAndroid Build Coastguard Workermkdir -p $WORKING_DIR 60*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR 61*89c4ff92SAndroid Build Coastguard Worker# For Mac OS, change the NDK download link accordingly. 62*89c4ff92SAndroid Build Coastguard Workerwget https://dl.google.com/android/repository/android-ndk-r25-linux.zip 63*89c4ff92SAndroid Build Coastguard Workerunzip android-ndk-r25-linux.zip 64*89c4ff92SAndroid Build Coastguard Worker``` 65*89c4ff92SAndroid Build Coastguard WorkerWith Android NDK-25, you no longer need to use the make_standalone_toolchain script to create a toolchain for a specific version of Android. Android's current preference is for you to just specify the architecture and operating system while setting the compiler and just use the ndk directory. 66*89c4ff92SAndroid Build Coastguard Worker 67*89c4ff92SAndroid Build Coastguard Worker## Install Cmake 68*89c4ff92SAndroid Build Coastguard WorkerCmake 3.19rc3 or later is required to build Arm NN. If you are using Ubuntu 20.04 the command given in [Initial Setup](#initial-setup) should install a usable version. If you're using Ubuntu 18.04 you may need to compile cmake yourself. 69*89c4ff92SAndroid Build Coastguard Worker 70*89c4ff92SAndroid Build Coastguard Worker```bash 71*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR 72*89c4ff92SAndroid Build Coastguard Workersudo apt-get install libssl-dev 73*89c4ff92SAndroid Build Coastguard Workerwget https://github.com/Kitware/CMake/releases/download/v3.19.0-rc3/cmake-3.19.0-rc3.tar.gz 74*89c4ff92SAndroid Build Coastguard Workertar -zxvf cmake-3.19.0-rc3.tar.gz 75*89c4ff92SAndroid Build Coastguard Workercd cmake-3.19.0-rc3 76*89c4ff92SAndroid Build Coastguard Worker./bootstrap --prefix=$WORKING_DIR/cmake/install 77*89c4ff92SAndroid Build Coastguard Workermake all install 78*89c4ff92SAndroid Build Coastguard Workercd.. 79*89c4ff92SAndroid Build Coastguard Worker``` 80*89c4ff92SAndroid Build Coastguard Worker 81*89c4ff92SAndroid Build Coastguard Worker## Build Flatbuffers 82*89c4ff92SAndroid Build Coastguard Worker 83*89c4ff92SAndroid Build Coastguard WorkerDownload Flatbuffers: 84*89c4ff92SAndroid Build Coastguard Worker```bash 85*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR 86*89c4ff92SAndroid Build Coastguard Workerwget https://github.com/google/flatbuffers/archive/v2.0.6.tar.gz 87*89c4ff92SAndroid Build Coastguard Workertar xf v2.0.6.tar.gz 88*89c4ff92SAndroid Build Coastguard Worker``` 89*89c4ff92SAndroid Build Coastguard Worker 90*89c4ff92SAndroid Build Coastguard WorkerBuild Flatbuffers for x86: 91*89c4ff92SAndroid Build Coastguard Worker```bash 92*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR/flatbuffers-2.0.6 93*89c4ff92SAndroid Build Coastguard Worker 94*89c4ff92SAndroid Build Coastguard Workerrm -f CMakeCache.txt 95*89c4ff92SAndroid Build Coastguard Worker 96*89c4ff92SAndroid Build Coastguard Workerrm -rf build-x86 97*89c4ff92SAndroid Build Coastguard Workermkdir build-x86 98*89c4ff92SAndroid Build Coastguard Workercd build-x86 99*89c4ff92SAndroid Build Coastguard Worker 100*89c4ff92SAndroid Build Coastguard Workerrm -rf $WORKING_DIR/flatbuffers-x86 101*89c4ff92SAndroid Build Coastguard Workermkdir $WORKING_DIR/flatbuffers-x86 102*89c4ff92SAndroid Build Coastguard Worker 103*89c4ff92SAndroid Build Coastguard WorkerCXXFLAGS="-fPIC" $CMAKE .. \ 104*89c4ff92SAndroid Build Coastguard Worker -DFLATBUFFERS_BUILD_FLATC=1 \ 105*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_INSTALL_PREFIX:PATH=$WORKING_DIR/flatbuffers-x86 106*89c4ff92SAndroid Build Coastguard Worker 107*89c4ff92SAndroid Build Coastguard Workermake all install -j16 108*89c4ff92SAndroid Build Coastguard Worker``` 109*89c4ff92SAndroid Build Coastguard WorkerNote: -fPIC is added to allow users to use the libraries in shared objects. 110*89c4ff92SAndroid Build Coastguard Worker 111*89c4ff92SAndroid Build Coastguard WorkerBuild Flatbuffers for Android: 112*89c4ff92SAndroid Build Coastguard Worker```bash 113*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR/flatbuffers-2.0.6 114*89c4ff92SAndroid Build Coastguard Worker 115*89c4ff92SAndroid Build Coastguard Workerrm -f CMakeCache.txt 116*89c4ff92SAndroid Build Coastguard Worker 117*89c4ff92SAndroid Build Coastguard Workerrm -rf build-android 118*89c4ff92SAndroid Build Coastguard Workermkdir build-android 119*89c4ff92SAndroid Build Coastguard Workercd build-android 120*89c4ff92SAndroid Build Coastguard Worker 121*89c4ff92SAndroid Build Coastguard Workerrm -rf $WORKING_DIR/flatbuffers-android 122*89c4ff92SAndroid Build Coastguard Workermkdir $WORKING_DIR/flatbuffers-android 123*89c4ff92SAndroid Build Coastguard Worker 124*89c4ff92SAndroid Build Coastguard WorkerCC=/usr/bin/aarch64-linux-gnu-gcc CXX=/usr/bin/aarch64-linux-gnu-g++ \ 125*89c4ff92SAndroid Build Coastguard WorkerCXXFLAGS="-fPIC" \ 126*89c4ff92SAndroid Build Coastguard Workercmake .. \ 127*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_ANDROID_NDK=$NDK_DIR \ 128*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_SYSTEM_NAME=Android \ 129*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_SYSTEM_VERSION=27 \ 130*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ 131*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_CXX_FLAGS=--std=c++14 \ 132*89c4ff92SAndroid Build Coastguard Worker -DFLATBUFFERS_BUILD_FLATC=OFF \ 133*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_BUILD_TYPE=Release \ 134*89c4ff92SAndroid Build Coastguard Worker -DFLATBUFFERS_BUILD_TESTS=OFF \ 135*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_INSTALL_PREFIX=$WORKING_DIR/flatbuffers-android 136*89c4ff92SAndroid Build Coastguard Worker 137*89c4ff92SAndroid Build Coastguard Workermake all install -j16 138*89c4ff92SAndroid Build Coastguard Worker``` 139*89c4ff92SAndroid Build Coastguard Worker 140*89c4ff92SAndroid Build Coastguard Worker## Download Arm NN 141*89c4ff92SAndroid Build Coastguard WorkerClone Arm NN: 142*89c4ff92SAndroid Build Coastguard Worker 143*89c4ff92SAndroid Build Coastguard Worker```bash 144*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR 145*89c4ff92SAndroid Build Coastguard Workergit clone https://github.com/ARM-software/armnn.git 146*89c4ff92SAndroid Build Coastguard Worker``` 147*89c4ff92SAndroid Build Coastguard Worker 148*89c4ff92SAndroid Build Coastguard WorkerCheckout the Arm NN branch: 149*89c4ff92SAndroid Build Coastguard Worker```bash 150*89c4ff92SAndroid Build Coastguard Workercd armnn 151*89c4ff92SAndroid Build Coastguard Workergit checkout <branch_name> 152*89c4ff92SAndroid Build Coastguard Workergit pull 153*89c4ff92SAndroid Build Coastguard Worker``` 154*89c4ff92SAndroid Build Coastguard Worker 155*89c4ff92SAndroid Build Coastguard WorkerFor example, if you want to check out the 23.02 release branch: 156*89c4ff92SAndroid Build Coastguard Worker```bash 157*89c4ff92SAndroid Build Coastguard Workercd armnn 158*89c4ff92SAndroid Build Coastguard Workergit checkout branches/armnn_23_02 159*89c4ff92SAndroid Build Coastguard Workergit pull 160*89c4ff92SAndroid Build Coastguard Worker``` 161*89c4ff92SAndroid Build Coastguard Worker 162*89c4ff92SAndroid Build Coastguard Worker## Get And Build TFLite 163*89c4ff92SAndroid Build Coastguard WorkerThis optional step is only required if you intend to build the TFLite delegate or parser for Arm NN. 164*89c4ff92SAndroid Build Coastguard Worker 165*89c4ff92SAndroid Build Coastguard WorkerFirst clone tensorflow: 166*89c4ff92SAndroid Build Coastguard Worker```bash 167*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR 168*89c4ff92SAndroid Build Coastguard Workergit clone https://github.com/tensorflow/tensorflow.git 169*89c4ff92SAndroid Build Coastguard Workercd tensorflow 170*89c4ff92SAndroid Build Coastguard Workergit fetch && git checkout "tags/v2.10.0" 171*89c4ff92SAndroid Build Coastguard Worker``` 172*89c4ff92SAndroid Build Coastguard WorkerArm NN provides a script that downloads the version of Tensorflow that Arm NN was tested with: 173*89c4ff92SAndroid Build Coastguard Worker```bash 174*89c4ff92SAndroid Build Coastguard Workergit fetch && git checkout $(../armnn/scripts/get_tensorflow.sh -p) 175*89c4ff92SAndroid Build Coastguard Worker``` 176*89c4ff92SAndroid Build Coastguard WorkerNext build Tensorflow Lite: 177*89c4ff92SAndroid Build Coastguard Worker```bash 178*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR 179*89c4ff92SAndroid Build Coastguard Workermkdir -p tflite-out/android 180*89c4ff92SAndroid Build Coastguard Workercd tflite-out/android 181*89c4ff92SAndroid Build Coastguard Worker 182*89c4ff92SAndroid Build Coastguard WorkerCMARGS="-DCMAKE_TOOLCHAIN_FILE=$NDK_DIR/build/cmake/android.toolchain.cmake \ 183*89c4ff92SAndroid Build Coastguard Worker -DANDROID_ABI=arm64-v8a \ 184*89c4ff92SAndroid Build Coastguard Worker -DANDROID_PLATFORM=$ANDROID_API" 185*89c4ff92SAndroid Build Coastguard Worker 186*89c4ff92SAndroid Build Coastguard Workercmake $CMARGS $WORKING_DIR/tensorflow/tensorflow/lite 187*89c4ff92SAndroid Build Coastguard Worker 188*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR 189*89c4ff92SAndroid Build Coastguard Workercmake --build tflite-out/android -j 16 190*89c4ff92SAndroid Build Coastguard Worker``` 191*89c4ff92SAndroid Build Coastguard WorkerNow generate the Tensorflow Lite Schema for the TFLite parser: 192*89c4ff92SAndroid Build Coastguard Worker```bash 193*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR 194*89c4ff92SAndroid Build Coastguard Workermkdir -p $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema 195*89c4ff92SAndroid Build Coastguard Worker 196*89c4ff92SAndroid Build Coastguard WorkerSCHEMA_LOCATION=$WORKING_DIR/tensorflow/tensorflow/lite/schema/schema.fbs 197*89c4ff92SAndroid Build Coastguard Workercp $SCHEMA_LOCATION $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema 198*89c4ff92SAndroid Build Coastguard Worker 199*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema 200*89c4ff92SAndroid Build Coastguard Worker$WORKING_DIR/flatbuffers-x86/bin/flatc -c --gen-object-api --reflect-types --reflect-names schema.fbs 201*89c4ff92SAndroid Build Coastguard Worker``` 202*89c4ff92SAndroid Build Coastguard Worker 203*89c4ff92SAndroid Build Coastguard Worker## Build Arm Compute Library 204*89c4ff92SAndroid Build Coastguard WorkerClone Arm Compute Library: 205*89c4ff92SAndroid Build Coastguard Worker 206*89c4ff92SAndroid Build Coastguard Worker```bash 207*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR 208*89c4ff92SAndroid Build Coastguard Workergit clone https://github.com/ARM-software/ComputeLibrary.git 209*89c4ff92SAndroid Build Coastguard Worker``` 210*89c4ff92SAndroid Build Coastguard WorkerCheckout Arm Compute Library release tag: 211*89c4ff92SAndroid Build Coastguard Worker```bash 212*89c4ff92SAndroid Build Coastguard Workercd ComputeLibrary 213*89c4ff92SAndroid Build Coastguard Workergit checkout <tag_name> 214*89c4ff92SAndroid Build Coastguard Worker``` 215*89c4ff92SAndroid Build Coastguard WorkerFor example, if you want to check out the 23.02 release tag: 216*89c4ff92SAndroid Build Coastguard Worker```bash 217*89c4ff92SAndroid Build Coastguard Workercd ComputeLibrary 218*89c4ff92SAndroid Build Coastguard Workergit checkout v23.02 219*89c4ff92SAndroid Build Coastguard Worker``` 220*89c4ff92SAndroid Build Coastguard Worker 221*89c4ff92SAndroid Build Coastguard WorkerArm NN and Arm Compute Library are developed closely together. To use a particular version of Arm NN you will need a compatible version of ACL. 222*89c4ff92SAndroid Build Coastguard WorkerArm NN provides a script that downloads the version of Arm Compute Library that Arm NN was tested with: 223*89c4ff92SAndroid Build Coastguard Worker```bash 224*89c4ff92SAndroid Build Coastguard Workergit checkout $(../armnn/scripts/get_compute_library.sh -p) 225*89c4ff92SAndroid Build Coastguard Worker``` 226*89c4ff92SAndroid Build Coastguard WorkerBuild the Arm Compute Library: 227*89c4ff92SAndroid Build Coastguard Worker```bash 228*89c4ff92SAndroid Build Coastguard Workerscons arch=arm64-v8a os=android toolchain_prefix=llvm- compiler_prefix=aarch64-linux-android$ANDROID_API- \ 229*89c4ff92SAndroid Build Coastguard Worker neon=1 opencl=1 embed_kernels=1 extra_cxx_flags="-fPIC" \ 230*89c4ff92SAndroid Build Coastguard Worker benchmark_tests=0 validation_tests=0 -j16 231*89c4ff92SAndroid Build Coastguard Worker``` 232*89c4ff92SAndroid Build Coastguard Worker 233*89c4ff92SAndroid Build Coastguard Worker## Build Arm NN 234*89c4ff92SAndroid Build Coastguard Worker 235*89c4ff92SAndroid Build Coastguard WorkerBuild Arm NN: 236*89c4ff92SAndroid Build Coastguard Worker 237*89c4ff92SAndroid Build Coastguard Worker```bash 238*89c4ff92SAndroid Build Coastguard Workermkdir $WORKING_DIR/armnn/build 239*89c4ff92SAndroid Build Coastguard Workercd $WORKING_DIR/armnn/build 240*89c4ff92SAndroid Build Coastguard WorkerCXX=aarch64-linux-android$ANDROID_API-clang++ \ 241*89c4ff92SAndroid Build Coastguard WorkerCC=aarch64-linux-android$ANDROID_API-clang \ 242*89c4ff92SAndroid Build Coastguard WorkerCXX_FLAGS="-fPIE -fPIC" \ 243*89c4ff92SAndroid Build Coastguard Workercmake .. \ 244*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_BUILD_TYPE=Release \ 245*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_ANDROID_NDK=$NDK_DIR \ 246*89c4ff92SAndroid Build Coastguard Worker -DNDK_VERSION=r25 \ 247*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_SYSTEM_NAME=Android \ 248*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_SYSTEM_VERSION=$ANDROID_API \ 249*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ 250*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_SYSROOT=$WORKING_DIR/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/sysroot \ 251*89c4ff92SAndroid Build Coastguard Worker -DARMCOMPUTE_ROOT=$WORKING_DIR/ComputeLibrary \ 252*89c4ff92SAndroid Build Coastguard Worker -DARMCOMPUTE_BUILD_DIR=$WORKING_DIR/ComputeLibrary/build \ 253*89c4ff92SAndroid Build Coastguard Worker -DARMCOMPUTENEON=1 -DARMCOMPUTECL=1 -DARMNNREF=1 \ 254*89c4ff92SAndroid Build Coastguard Worker -DFLATBUFFERS_INCLUDE_PATH=$WORKING_DIR/flatbuffers-x86/include \ 255*89c4ff92SAndroid Build Coastguard Worker -DFLATBUFFERS_ROOT=$WORKING_DIR/flatbuffers-android \ 256*89c4ff92SAndroid Build Coastguard Worker -DFLATC_DIR=$WORKING_DIR/flatbuffers-x86 \ 257*89c4ff92SAndroid Build Coastguard Worker -DBUILD_UNIT_TESTS=1 \ 258*89c4ff92SAndroid Build Coastguard Worker -DBUILD_TESTS=1 \ 259*89c4ff92SAndroid Build Coastguard Worker -fexception \ 260*89c4ff92SAndroid Build Coastguard Worker``` 261*89c4ff92SAndroid Build Coastguard Worker 262*89c4ff92SAndroid Build Coastguard WorkerTo include the Arm NN TFLite delegate add these arguments to the above list: 263*89c4ff92SAndroid Build Coastguard Worker 264*89c4ff92SAndroid Build Coastguard Worker```bash 265*89c4ff92SAndroid Build Coastguard Worker -DBUILD_ARMNN_TFLITE_DELEGATE=1 \ 266*89c4ff92SAndroid Build Coastguard Worker -DTENSORFLOW_ROOT=$WORKING_DIR/tensorflow \ 267*89c4ff92SAndroid Build Coastguard Worker -DTFLITE_LIB_ROOT=$WORKING_DIR/tflite-out/android \ 268*89c4ff92SAndroid Build Coastguard Worker -DTFLITE_ROOT_DIR=$WORKING_DIR/tensorflow/tensorflow/lite \ 269*89c4ff92SAndroid Build Coastguard Worker``` 270*89c4ff92SAndroid Build Coastguard Worker 271*89c4ff92SAndroid Build Coastguard WorkerTo include the Arm NN TFLite Parser add these arguments to the above list: 272*89c4ff92SAndroid Build Coastguard Worker 273*89c4ff92SAndroid Build Coastguard Worker```bash 274*89c4ff92SAndroid Build Coastguard Worker -DBUILD_TF_LITE_PARSER=1 \ 275*89c4ff92SAndroid Build Coastguard Worker -DTF_LITE_GENERATED_PATH=$WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema \ 276*89c4ff92SAndroid Build Coastguard Worker -DTENSORFLOW_ROOT=$WORKING_DIR/tensorflow \ 277*89c4ff92SAndroid Build Coastguard Worker -DTFLITE_LIB_ROOT=$WORKING_DIR/tflite-out/android \ 278*89c4ff92SAndroid Build Coastguard Worker``` 279*89c4ff92SAndroid Build Coastguard Worker 280*89c4ff92SAndroid Build Coastguard WorkerTo include standalone sample dynamic backend tests, add these arguments to enable the tests and the dynamic backend path to the CMake command: 281*89c4ff92SAndroid Build Coastguard Worker 282*89c4ff92SAndroid Build Coastguard Worker```bash 283*89c4ff92SAndroid Build Coastguard Worker -DSAMPLE_DYNAMIC_BACKEND=1 \ 284*89c4ff92SAndroid Build Coastguard Worker -DDYNAMIC_BACKEND_PATHS=$SAMPLE_DYNAMIC_BACKEND_PATH 285*89c4ff92SAndroid Build Coastguard Worker# Where $SAMPLE_DYNAMIC_BACKEND_PATH is the path where libArm_SampleDynamic_backend.so library file is pushed 286*89c4ff92SAndroid Build Coastguard Worker``` 287*89c4ff92SAndroid Build Coastguard Worker 288*89c4ff92SAndroid Build Coastguard Worker * Run the build 289*89c4ff92SAndroid Build Coastguard Worker```bash 290*89c4ff92SAndroid Build Coastguard Workermake -j16 291*89c4ff92SAndroid Build Coastguard Worker``` 292*89c4ff92SAndroid Build Coastguard Worker 293*89c4ff92SAndroid Build Coastguard Worker## Build Standalone Sample Dynamic Backend 294*89c4ff92SAndroid Build Coastguard WorkerThis step is optional. The sample dynamic backend is located in armnn/src/dynamic/sample 295*89c4ff92SAndroid Build Coastguard Worker```bash 296*89c4ff92SAndroid Build Coastguard Workermkdir build 297*89c4ff92SAndroid Build Coastguard Workercd build 298*89c4ff92SAndroid Build Coastguard Worker``` 299*89c4ff92SAndroid Build Coastguard Worker 300*89c4ff92SAndroid Build Coastguard Worker* Use CMake to configure the build environment, update the following script and run it from the armnn/src/dynamic/sample/build directory to set up the Arm NN build: 301*89c4ff92SAndroid Build Coastguard Worker```bash 302*89c4ff92SAndroid Build Coastguard Worker#!/bin/bash 303*89c4ff92SAndroid Build Coastguard WorkerCXX=aarch64-linux-android$ANDROID_API-clang++ \ 304*89c4ff92SAndroid Build Coastguard WorkerCC=aarch64-linux-android$ANDROID_API-clang \ 305*89c4ff92SAndroid Build Coastguard WorkerCXX_FLAGS="-fPIE -fPIC" \ 306*89c4ff92SAndroid Build Coastguard Workercmake \ 307*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_C_COMPILER_WORKS=TRUE \ 308*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_CXX_COMPILER_WORKS=TRUE \ 309*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_ANDROID_NDK=$NDK_DIR \ 310*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_SYSTEM_NAME=Android \ 311*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_SYSTEM_VERSION=$ANDROID_API \ 312*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ 313*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_SYSROOT=$WORKING_DIR/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/sysroot \ 314*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_CXX_FLAGS=--std=c++14 \ 315*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_EXE_LINKER_FLAGS="-pie -llog" \ 316*89c4ff92SAndroid Build Coastguard Worker -DCMAKE_MODULE_LINKER_FLAGS="-llog" \ 317*89c4ff92SAndroid Build Coastguard Worker -DARMNN_PATH=$WORKING_DIR/armnn/build/libarmnn.so .. 318*89c4ff92SAndroid Build Coastguard Worker``` 319*89c4ff92SAndroid Build Coastguard Worker 320*89c4ff92SAndroid Build Coastguard Worker* Run the build 321*89c4ff92SAndroid Build Coastguard Worker```bash 322*89c4ff92SAndroid Build Coastguard Workermake 323*89c4ff92SAndroid Build Coastguard Worker``` 324*89c4ff92SAndroid Build Coastguard Worker 325*89c4ff92SAndroid Build Coastguard Worker## Run the Arm NN unit tests on an Android device 326*89c4ff92SAndroid Build Coastguard Worker 327*89c4ff92SAndroid Build Coastguard Worker 328*89c4ff92SAndroid Build Coastguard Worker* Push the build results to an Android device and make symbolic links for shared libraries: 329*89c4ff92SAndroid Build Coastguard Worker Currently adb version we have used for testing is 1.0.41. 330*89c4ff92SAndroid Build Coastguard Worker```bash 331*89c4ff92SAndroid Build Coastguard Workeradb push libarmnn.so /data/local/tmp/ 332*89c4ff92SAndroid Build Coastguard Worker adb push libtimelineDecoder.so /data/local/tmp/ 333*89c4ff92SAndroid Build Coastguard Workeradb push UnitTests /data/local/tmp/ 334*89c4ff92SAndroid Build Coastguard Workeradb push $NDK_DIR/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so /data/local/tmp/ 335*89c4ff92SAndroid Build Coastguard Worker``` 336*89c4ff92SAndroid Build Coastguard Worker 337*89c4ff92SAndroid Build Coastguard Worker* Push the files needed for the unit tests (they are a mix of files, directories and symbolic links): 338*89c4ff92SAndroid Build Coastguard Worker```bash 339*89c4ff92SAndroid Build Coastguard Workeradb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/testSharedObject 340*89c4ff92SAndroid Build Coastguard Workeradb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/testSharedObject/* /data/local/tmp/src/backends/backendsCommon/test/testSharedObject/ 341*89c4ff92SAndroid Build Coastguard Worker 342*89c4ff92SAndroid Build Coastguard Workeradb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/testDynamicBackend 343*89c4ff92SAndroid Build Coastguard Workeradb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/testDynamicBackend/* /data/local/tmp/src/backends/backendsCommon/test/testDynamicBackend/ 344*89c4ff92SAndroid Build Coastguard Worker 345*89c4ff92SAndroid Build Coastguard Workeradb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath1 346*89c4ff92SAndroid Build Coastguard Workeradb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath1/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath1/ 347*89c4ff92SAndroid Build Coastguard Worker 348*89c4ff92SAndroid Build Coastguard Workeradb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2 349*89c4ff92SAndroid Build Coastguard Workeradb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/ 350*89c4ff92SAndroid Build Coastguard Workeradb shell ln -s Arm_CpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1 351*89c4ff92SAndroid Build Coastguard Workeradb shell ln -s Arm_CpuAcc_backend.so.1 /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1.2 352*89c4ff92SAndroid Build Coastguard Workeradb shell ln -s Arm_CpuAcc_backend.so.1.2 /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1.2.3 353*89c4ff92SAndroid Build Coastguard Workeradb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath2/Arm_GpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/ 354*89c4ff92SAndroid Build Coastguard Workeradb shell ln -s nothing /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_no_backend.so 355*89c4ff92SAndroid Build Coastguard Worker 356*89c4ff92SAndroid Build Coastguard Workeradb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath3 357*89c4ff92SAndroid Build Coastguard Worker 358*89c4ff92SAndroid Build Coastguard Workeradb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath5 359*89c4ff92SAndroid Build Coastguard Workeradb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath5/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath5/ 360*89c4ff92SAndroid Build Coastguard Worker 361*89c4ff92SAndroid Build Coastguard Workeradb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath6 362*89c4ff92SAndroid Build Coastguard Workeradb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath6/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath6/ 363*89c4ff92SAndroid Build Coastguard Worker 364*89c4ff92SAndroid Build Coastguard Workeradb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath7 365*89c4ff92SAndroid Build Coastguard Worker 366*89c4ff92SAndroid Build Coastguard Workeradb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath9 367*89c4ff92SAndroid Build Coastguard Workeradb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath9/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath9/ 368*89c4ff92SAndroid Build Coastguard Worker 369*89c4ff92SAndroid Build Coastguard Workeradb shell mkdir -p /data/local/tmp/src/backends/dynamic/reference 370*89c4ff92SAndroid Build Coastguard Workeradb push -p $WORKING_DIR/armnn/build/src/backends/dynamic/reference/Arm_CpuRef_backend.so /data/local/tmp/src/backends/dynamic/reference/ 371*89c4ff92SAndroid Build Coastguard Worker``` 372*89c4ff92SAndroid Build Coastguard Worker 373*89c4ff92SAndroid Build Coastguard WorkerIf the standalone sample dynamic tests are enabled, also push libArm_SampleDynamic_backend.so library file to the folder specified as $SAMPLE_DYNAMIC_BACKEND_PATH when Arm NN is built. 374*89c4ff92SAndroid Build Coastguard WorkerThis is the example when $SAMPLE_DYNAMIC_BACKEND_PATH is specified as /data/local/tmp/dynamic/sample/: 375*89c4ff92SAndroid Build Coastguard Worker 376*89c4ff92SAndroid Build Coastguard Worker```bash 377*89c4ff92SAndroid Build Coastguard Workeradb shell mkdir -p /data/local/tmp/dynamic/sample/ 378*89c4ff92SAndroid Build Coastguard Workeradb push -p $WORKING_DIR/armnn/src/dynamic/sample/build/libArm_SampleDynamic_backend.so /data/local/tmp/dynamic/sample/ 379*89c4ff92SAndroid Build Coastguard Worker``` 380*89c4ff92SAndroid Build Coastguard WorkerIf the delegate was built, push the delegate unit tests too. 381*89c4ff92SAndroid Build Coastguard Worker```bash 382*89c4ff92SAndroid Build Coastguard Workeradb push $WORKING_DIR/armnn/build/delegate/DelegateUnitTests /data/local/tmp/ 383*89c4ff92SAndroid Build Coastguard Workeradb push $WORKING_DIR/armnn/build/delegate/libarmnnDelegate.so /data/local/tmp/ 384*89c4ff92SAndroid Build Coastguard Worker``` 385*89c4ff92SAndroid Build Coastguard WorkerRun Arm NN unit tests: 386*89c4ff92SAndroid Build Coastguard Worker```bash 387*89c4ff92SAndroid Build Coastguard Workeradb shell 'LD_LIBRARY_PATH=/data/local/tmp:/vendor/lib64:/vendor/lib64/egl /data/local/tmp/UnitTests' 388*89c4ff92SAndroid Build Coastguard Worker``` 389*89c4ff92SAndroid Build Coastguard WorkerIf the delegate was built run Arm Delegate NN unit tests: 390*89c4ff92SAndroid Build Coastguard Worker```bash 391*89c4ff92SAndroid Build Coastguard Workeradb shell 'LD_LIBRARY_PATH=/data/local/tmp:/vendor/lib64:/vendor/lib64/egl /data/local/tmp/DelegateUnitTests' 392*89c4ff92SAndroid Build Coastguard Worker``` 393*89c4ff92SAndroid Build Coastguard WorkerIf libarmnnUtils.a is present in `$WORKING_DIR/armnn/build/` and the unit tests run without failure then the build was successful. 394