xref: /aosp_15_r20/external/armnn/BuildGuideAndroidNDK.md (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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