| <!-- HTML header for doxygen 1.8.17--> |
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml"> |
| <head> |
| <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> |
| <meta http-equiv="X-UA-Compatible" content="IE=9"/> |
| <meta name="generator" content="Doxygen 1.8.17"/> |
| <meta name="viewport" content="width=device-width, initial-scale=1"/> |
| <title>Arm NN: How to use the Android NDK to build Arm NN</title> |
| <link href="tabs.css" rel="stylesheet" type="text/css"/> |
| <script type="text/javascript" src="jquery.js"></script> |
| <script type="text/javascript" src="dynsections.js"></script> |
| <link href="navtree.css" rel="stylesheet" type="text/css"/> |
| <script type="text/javascript" src="resize.js"></script> |
| <script type="text/javascript" src="navtreedata.js"></script> |
| <script type="text/javascript" src="navtree.js"></script> |
| <link href="search/search.css" rel="stylesheet" type="text/css"/> |
| <script type="text/javascript" src="search/searchdata.js"></script> |
| <script type="text/javascript" src="search/search.js"></script> |
| <script type="text/x-mathjax-config"> |
| MathJax.Hub.Config({ |
| extensions: ["tex2jax.js"], |
| jax: ["input/TeX","output/HTML-CSS"], |
| }); |
| </script> |
| <script type="text/javascript" async="async" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script> |
| <link href="doxygen.css" rel="stylesheet" type="text/css" /> |
| <link href="customdoxygen.css" rel="stylesheet" type="text/css"/> |
| </head> |
| <body> |
| <div id="top"><!-- do not remove this div, it is closed by doxygen! --> |
| <div id="titlearea"> |
| <table cellspacing="0" cellpadding="0"> |
| <tbody> |
| <tr style="height: 56px;"> |
| <img alt="ArmNN" src="Arm_NN_horizontal_blue.png" style="max-width: 15rem; margin-top: .5rem; margin-left 13px"/> |
| <td id="projectalign" style="padding-left: 0.9em;"> |
| <div id="projectname"> |
|  <span id="projectnumber">24.02</span> |
| </div> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <!-- end header part --> |
| <!-- Generated by Doxygen 1.8.17 --> |
| <script type="text/javascript"> |
| /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ |
| var searchBox = new SearchBox("searchBox", "search",false,'Search'); |
| /* @license-end */ |
| </script> |
| <script type="text/javascript" src="menudata.js"></script> |
| <script type="text/javascript" src="menu.js"></script> |
| <script type="text/javascript"> |
| /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ |
| $(function() { |
| initMenu('',true,false,'search.php','Search'); |
| $(document).ready(function() { init_search(); }); |
| }); |
| /* @license-end */</script> |
| <div id="main-nav"></div> |
| </div><!-- top --> |
| <div id="side-nav" class="ui-resizable side-nav-resizable"> |
| <div id="nav-tree"> |
| <div id="nav-tree-contents"> |
| <div id="nav-sync" class="sync"></div> |
| </div> |
| </div> |
| <div id="splitbar" style="-moz-user-select:none;" |
| class="ui-resizable-handle"> |
| </div> |
| </div> |
| <script type="text/javascript"> |
| /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ |
| $(document).ready(function(){initNavTree('md__build_guide_android_n_d_k.html',''); initResizable(); }); |
| /* @license-end */ |
| </script> |
| <div id="doc-content"> |
| <!-- window showing the filter options --> |
| <div id="MSearchSelectWindow" |
| onmouseover="return searchBox.OnSearchSelectShow()" |
| onmouseout="return searchBox.OnSearchSelectHide()" |
| onkeydown="return searchBox.OnSearchSelectKey(event)"> |
| </div> |
| |
| <!-- iframe showing the search results (closed by default) --> |
| <div id="MSearchResultsWindow"> |
| <iframe src="javascript:void(0)" frameborder="0" |
| name="MSearchResults" id="MSearchResults"> |
| </iframe> |
| </div> |
| |
| <div class="PageDoc"><div class="header"> |
| <div class="headertitle"> |
| <div class="title">How to use the Android NDK to build Arm NN </div> </div> |
| </div><!--header--> |
| <div class="contents"> |
| <div class="textblock"><ul> |
| <li><a href="#introduction">Introduction</a></li> |
| <li><a href="#initial-setup">Initial Setup</a></li> |
| <li><a href="#download-the-android-ndk-and-make-a-standalone-toolchain">Download the Android NDK and make a standalone toolchain</a></li> |
| <li><a href="#install-cmake">Install Cmake</a></li> |
| <li><a href="#build-flatbuffers">Build Flatbuffers</a></li> |
| <li><a href="#download-arm-nn">Download Arm NN</a></li> |
| <li><a href="#get-and-build-tflite">Get And Build TFLite</a></li> |
| <li><a href="#build-arm-compute-library">Build Arm Compute Library</a></li> |
| <li><a href="#build-arm-nn">Build Arm NN</a></li> |
| <li><a href="#build-standalone-sample-dynamic-backend">Build Standalone Sample Dynamic Backend</a></li> |
| <li><a href="#run-the-arm-nn-unit-tests-on-an-android-device">Run the Arm NN unit tests on an Android device</a></li> |
| </ul> |
| <h1>Introduction</h1> |
| <p>These are step-by-step instructions for using the Android NDK to build Arm NN. They have been tested on a clean installation of Ubuntu 18.04 and 20.04, and should also work with other OS versions. The instructions show how to build the Arm NN core library and its dependencies.</p> |
| <p>For ease of use there is a shell script version of this guide located in the scripts directory called <a href="scripts/build_android_ndk_guide.sh">build_android_ndk_guide.sh</a>. Run the script with a -h flag to see the command line parameters.</p> |
| <p>The shell script version of this guide (build_android_ndk_guide.sh) also provides user the option to use the Arm NN and ComputeLibrary available in your BASE_DIR, instead of downloading a new version. BASE_DIR is path to the script file, which is armnn/scripts/.</p> |
| <h1>Initial Setup</h1> |
| <p>First, we need to specify the Android version and the directories you want to build Arm NN in and to install some applications required to build Arm NN and its dependencies.</p> |
| <div class="fragment"><div class="line">export ANDROID_API=30</div> |
| <div class="line">export WORKING_DIR=$HOME/armnn-devenv</div> |
| <div class="line">export NDK_DIR=$WORKING_DIR/android-ndk-r25</div> |
| <div class="line">export NDK_TOOLCHAIN_ROOT=$NDK_DIR/toolchains/llvm/prebuilt/linux-x86_64</div> |
| <div class="line">export PATH=$NDK_TOOLCHAIN_ROOT/bin/:$PATH</div> |
| </div><!-- fragment --><p>You may want to append the above export variables commands to your <code>~/.bashrc</code> (or <code>~/.bash_profile</code> in macOS).</p> |
| <p>The 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.</p> |
| <h2>Required Applications</h2> |
| <p>Git is required to obtain Arm NN. If this has not been already installed then install it using: </p><div class="fragment"><div class="line">sudo apt install git</div> |
| </div><!-- fragment --><p>Arm Compute Library requires SCons. If this has not been already installed then install it using: </p><div class="fragment"><div class="line">sudo apt install scons</div> |
| </div><!-- fragment --><p>CMake is required to build Arm NN and its dependencies. If this has not been already installed then install it using: </p><div class="fragment"><div class="line">sudo apt install cmake</div> |
| </div><!-- fragment --><h1>Download the Android NDK and make a standalone toolchain</h1> |
| <p>Download the Android NDK from <a href="https://developer.android.com/ndk/downloads/index.html">the official website</a>: </p><div class="fragment"><div class="line">mkdir -p $WORKING_DIR</div> |
| <div class="line">cd $WORKING_DIR</div> |
| <div class="line"># For Mac OS, change the NDK download link accordingly.</div> |
| <div class="line">wget https://dl.google.com/android/repository/android-ndk-r25-linux.zip</div> |
| <div class="line">unzip android-ndk-r25-linux.zip</div> |
| </div><!-- fragment --><p>With 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.</p> |
| <h1>Install Cmake</h1> |
| <p>Cmake 3.19rc3 or later is required to build Arm NN. If you are using Ubuntu 20.04 the command given in <a href="#initial-setup">Initial Setup</a> should install a usable version. If you're using Ubuntu 18.04 you may need to compile cmake yourself.</p> |
| <div class="fragment"><div class="line">cd $WORKING_DIR</div> |
| <div class="line">sudo apt-get install libssl-dev</div> |
| <div class="line">wget https://github.com/Kitware/CMake/releases/download/v3.19.0-rc3/cmake-3.19.0-rc3.tar.gz</div> |
| <div class="line">tar -zxvf cmake-3.19.0-rc3.tar.gz</div> |
| <div class="line">cd cmake-3.19.0-rc3</div> |
| <div class="line">./bootstrap --prefix=$WORKING_DIR/cmake/install</div> |
| <div class="line">make all install</div> |
| <div class="line">cd..</div> |
| </div><!-- fragment --><h1>Build Flatbuffers</h1> |
| <p>Download Flatbuffers: </p><div class="fragment"><div class="line">cd $WORKING_DIR</div> |
| <div class="line">wget https://github.com/google/flatbuffers/archive/v23.5.26.tar.gz</div> |
| <div class="line">tar xf v23.5.26.tar.gz</div> |
| </div><!-- fragment --><p>Build Flatbuffers for x86: </p><div class="fragment"><div class="line">cd $WORKING_DIR/flatbuffers-23.5.26</div> |
| <div class="line"> </div> |
| <div class="line">rm -f CMakeCache.txt</div> |
| <div class="line"> </div> |
| <div class="line">rm -rf build-x86</div> |
| <div class="line">mkdir build-x86</div> |
| <div class="line">cd build-x86</div> |
| <div class="line"> </div> |
| <div class="line">rm -rf $WORKING_DIR/flatbuffers-x86</div> |
| <div class="line">mkdir $WORKING_DIR/flatbuffers-x86</div> |
| <div class="line"> </div> |
| <div class="line">CXXFLAGS="-fPIC" $CMAKE .. \</div> |
| <div class="line"> -DFLATBUFFERS_BUILD_FLATC=1 \</div> |
| <div class="line"> -DCMAKE_INSTALL_PREFIX:PATH=$WORKING_DIR/flatbuffers-x86</div> |
| <div class="line"> </div> |
| <div class="line">make all install -j16</div> |
| </div><!-- fragment --><p>Note: -fPIC is added to allow users to use the libraries in shared objects.</p> |
| <p>Build Flatbuffers for Android: </p><div class="fragment"><div class="line">cd $WORKING_DIR/flatbuffers-23.5.26</div> |
| <div class="line"> </div> |
| <div class="line">rm -f CMakeCache.txt</div> |
| <div class="line"> </div> |
| <div class="line">rm -rf build-android</div> |
| <div class="line">mkdir build-android</div> |
| <div class="line">cd build-android</div> |
| <div class="line"> </div> |
| <div class="line">rm -rf $WORKING_DIR/flatbuffers-android</div> |
| <div class="line">mkdir $WORKING_DIR/flatbuffers-android</div> |
| <div class="line"> </div> |
| <div class="line">CC=/usr/bin/aarch64-linux-gnu-gcc CXX=/usr/bin/aarch64-linux-gnu-g++ \</div> |
| <div class="line">CXXFLAGS="-fPIC" \</div> |
| <div class="line">cmake .. \</div> |
| <div class="line"> -DCMAKE_ANDROID_NDK=$NDK_DIR \</div> |
| <div class="line"> -DCMAKE_SYSTEM_NAME=Android \</div> |
| <div class="line"> -DCMAKE_SYSTEM_VERSION=$ANDROID_API \</div> |
| <div class="line"> -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \</div> |
| <div class="line"> -DCMAKE_CXX_FLAGS=--std=c++14 \</div> |
| <div class="line"> -DFLATBUFFERS_BUILD_FLATC=OFF \</div> |
| <div class="line"> -DCMAKE_BUILD_TYPE=Release \</div> |
| <div class="line"> -DFLATBUFFERS_BUILD_TESTS=OFF \</div> |
| <div class="line"> -DCMAKE_INSTALL_PREFIX=$WORKING_DIR/flatbuffers-android</div> |
| <div class="line"> </div> |
| <div class="line">make all install -j16</div> |
| </div><!-- fragment --><h1>Download Arm NN</h1> |
| <p>Clone Arm NN:</p> |
| <div class="fragment"><div class="line">cd $WORKING_DIR</div> |
| <div class="line">git clone https://github.com/ARM-software/armnn.git</div> |
| </div><!-- fragment --><p>Checkout the Arm NN branch: </p><div class="fragment"><div class="line">cd armnn</div> |
| <div class="line">git checkout <branch_name></div> |
| <div class="line">git pull</div> |
| </div><!-- fragment --><p>For example, if you want to check out the 23.02 release branch: </p><div class="fragment"><div class="line">cd armnn</div> |
| <div class="line">git checkout branches/armnn_23_02</div> |
| <div class="line">git pull</div> |
| </div><!-- fragment --><h1>Get And Build TFLite</h1> |
| <p>This optional step is only required if you intend to build the TFLite delegate or parser for Arm NN.</p> |
| <p>First clone Tensorflow manually and check out the version Arm NN was tested with: </p><div class="fragment"><div class="line">cd $WORKING_DIR</div> |
| <div class="line">git clone https://github.com/tensorflow/tensorflow.git</div> |
| <div class="line">cd tensorflow</div> |
| <div class="line">git fetch && git checkout v2.15.0</div> |
| </div><!-- fragment --><p>Or use the script that Arm NN provides: </p><div class="fragment"><div class="line">git fetch && git checkout $(../armnn/scripts/get_tensorflow.sh -p)</div> |
| </div><!-- fragment --><p>Next, set variable TFLITE_ROOT_DIR and build Tensorflow Lite: </p><div class="fragment"><div class="line">export TFLITE_ROOT_DIR=$WORKING_DIR/tensorflow/tensorflow/lite</div> |
| <div class="line">cd $WORKING_DIR</div> |
| <div class="line">mkdir -p tflite-out/android</div> |
| <div class="line">cd tflite-out/android</div> |
| <div class="line"> </div> |
| <div class="line">CMARGS="-DTFLITE_ENABLE_XNNPACK=OFF \</div> |
| <div class="line"> -DFLATBUFFERS_BUILD_FLATC=OFF \</div> |
| <div class="line"> -DBUILD_SHARED_LIBS=OFF \</div> |
| <div class="line"> -DBUILD_TESTING=OFF"</div> |
| <div class="line"> </div> |
| <div class="line">CMARGS="$CMARGS -DCMAKE_TOOLCHAIN_FILE=$NDK_DIR/build/cmake/android.toolchain.cmake \</div> |
| <div class="line"> -DANDROID_ABI=arm64-v8a \</div> |
| <div class="line"> -DANDROID_PLATFORM=$ANDROID_API"</div> |
| <div class="line"> </div> |
| <div class="line">cmake $CMARGS $TFLITE_ROOT_DIR</div> |
| <div class="line"> </div> |
| <div class="line">cd $WORKING_DIR</div> |
| <div class="line">cmake --build tflite-out/android -j 16</div> |
| </div><!-- fragment --><p>Now generate the Tensorflow Lite Schema for the TFLite parser: </p><div class="fragment"><div class="line">cd $WORKING_DIR</div> |
| <div class="line">mkdir -p $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema</div> |
| <div class="line"> </div> |
| <div class="line">SCHEMA_LOCATION=$WORKING_DIR/tensorflow/tensorflow/lite/schema/schema.fbs</div> |
| <div class="line">cp $SCHEMA_LOCATION $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema</div> |
| <div class="line"> </div> |
| <div class="line">cd $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema</div> |
| <div class="line">$WORKING_DIR/flatbuffers-x86/bin/flatc -c --gen-object-api --reflect-types --reflect-names schema.fbs</div> |
| </div><!-- fragment --><h1>Build Arm Compute Library</h1> |
| <p>Clone Arm Compute Library:</p> |
| <div class="fragment"><div class="line">cd $WORKING_DIR</div> |
| <div class="line">git clone https://github.com/ARM-software/ComputeLibrary.git</div> |
| </div><!-- fragment --><p>Checkout Arm Compute Library release tag: </p><div class="fragment"><div class="line">cd ComputeLibrary</div> |
| <div class="line">git checkout <tag_name></div> |
| </div><!-- fragment --><p>For example, if you want to check out the 23.02 release tag: </p><div class="fragment"><div class="line">cd ComputeLibrary</div> |
| <div class="line">git checkout v23.02</div> |
| </div><!-- fragment --><p>Arm 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. Arm NN provides a script that downloads the version of Arm Compute Library that Arm NN was tested with: </p><div class="fragment"><div class="line">git checkout $(../armnn/scripts/get_compute_library.sh -p) </div> |
| </div><!-- fragment --><p>Build the Arm Compute Library: </p><div class="fragment"><div class="line">scons arch=arm64-v8a os=android toolchain_prefix=llvm- compiler_prefix=aarch64-linux-android$ANDROID_API- \</div> |
| <div class="line"> neon=1 opencl=1 embed_kernels=1 extra_cxx_flags="-fPIC" \</div> |
| <div class="line"> benchmark_tests=0 validation_tests=0 -j16</div> |
| </div><!-- fragment --><h1>Build Arm NN</h1> |
| <p>Build Arm NN:</p> |
| <div class="fragment"><div class="line">mkdir $WORKING_DIR/armnn/build</div> |
| <div class="line">cd $WORKING_DIR/armnn/build</div> |
| <div class="line">CXX=aarch64-linux-android$ANDROID_API-clang++ \</div> |
| <div class="line">CC=aarch64-linux-android$ANDROID_API-clang \</div> |
| <div class="line">CXX_FLAGS="-fPIE -fPIC" \</div> |
| <div class="line">cmake .. \</div> |
| <div class="line"> -DCMAKE_BUILD_TYPE=Release \</div> |
| <div class="line"> -DCMAKE_ANDROID_NDK=$NDK_DIR \</div> |
| <div class="line"> -DNDK_VERSION=r25 \</div> |
| <div class="line"> -DCMAKE_SYSTEM_NAME=Android \</div> |
| <div class="line"> -DCMAKE_SYSTEM_VERSION=$ANDROID_API \</div> |
| <div class="line"> -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \</div> |
| <div class="line"> -DCMAKE_SYSROOT=$WORKING_DIR/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/sysroot \</div> |
| <div class="line"> -DARMCOMPUTE_ROOT=$WORKING_DIR/ComputeLibrary \</div> |
| <div class="line"> -DARMCOMPUTE_BUILD_DIR=$WORKING_DIR/ComputeLibrary/build \</div> |
| <div class="line"> -DARMCOMPUTENEON=1 -DARMCOMPUTECL=1 -DARMNNREF=1 \</div> |
| <div class="line"> -DFLATBUFFERS_INCLUDE_PATH=$WORKING_DIR/flatbuffers-x86/include \</div> |
| <div class="line"> -DFLATBUFFERS_ROOT=$WORKING_DIR/flatbuffers-android \</div> |
| <div class="line"> -DFLATC_DIR=$WORKING_DIR/flatbuffers-x86 \</div> |
| <div class="line"> -DBUILD_UNIT_TESTS=1 \</div> |
| <div class="line"> -DBUILD_TESTS=1 \</div> |
| <div class="line"> -fexception \</div> |
| </div><!-- fragment --><p>To include the Arm NN TFLite delegate add these arguments to the above list:</p> |
| <div class="fragment"><div class="line">-DBUILD_ARMNN_TFLITE_DELEGATE=1 \</div> |
| <div class="line">-DTENSORFLOW_ROOT=$WORKING_DIR/tensorflow \</div> |
| <div class="line">-DTFLITE_LIB_ROOT=$WORKING_DIR/tflite-out/android \</div> |
| <div class="line">-DTFLITE_ROOT_DIR=$WORKING_DIR/tensorflow/tensorflow/lite \</div> |
| </div><!-- fragment --><p>To include the Arm NN TFLite Parser add these arguments to the above list:</p> |
| <div class="fragment"><div class="line">-DBUILD_TF_LITE_PARSER=1 \</div> |
| <div class="line">-DTF_LITE_GENERATED_PATH=$WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema \</div> |
| <div class="line">-DTENSORFLOW_ROOT=$WORKING_DIR/tensorflow \</div> |
| <div class="line">-DTFLITE_LIB_ROOT=$WORKING_DIR/tflite-out/android \</div> |
| </div><!-- fragment --><p>To include standalone sample dynamic backend tests, add these arguments to enable the tests and the dynamic backend path to the CMake command:</p> |
| <div class="fragment"><div class="line"> -DSAMPLE_DYNAMIC_BACKEND=1 \</div> |
| <div class="line"> -DDYNAMIC_BACKEND_PATHS=$SAMPLE_DYNAMIC_BACKEND_PATH</div> |
| <div class="line"># Where $SAMPLE_DYNAMIC_BACKEND_PATH is the path where libArm_SampleDynamic_backend.so library file is pushed</div> |
| </div><!-- fragment --><ul> |
| <li>Run the build <div class="fragment"><div class="line">make -j16</div> |
| </div><!-- fragment --></li> |
| </ul> |
| <h1>Build Standalone Sample Dynamic Backend</h1> |
| <p>This step is optional. The sample dynamic backend is located in armnn/src/dynamic/sample </p><div class="fragment"><div class="line">mkdir build</div> |
| <div class="line">cd build</div> |
| </div><!-- fragment --><ul> |
| <li>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: <div class="fragment"><div class="line">#!/bin/bash</div> |
| <div class="line">CXX=aarch64-linux-android$ANDROID_API-clang++ \</div> |
| <div class="line">CC=aarch64-linux-android$ANDROID_API-clang \</div> |
| <div class="line">CXX_FLAGS="-fPIE -fPIC" \</div> |
| <div class="line">cmake \</div> |
| <div class="line"> -DCMAKE_C_COMPILER_WORKS=TRUE \</div> |
| <div class="line"> -DCMAKE_CXX_COMPILER_WORKS=TRUE \</div> |
| <div class="line"> -DCMAKE_ANDROID_NDK=$NDK_DIR \</div> |
| <div class="line"> -DCMAKE_SYSTEM_NAME=Android \</div> |
| <div class="line"> -DCMAKE_SYSTEM_VERSION=$ANDROID_API \</div> |
| <div class="line"> -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \</div> |
| <div class="line"> -DCMAKE_SYSROOT=$WORKING_DIR/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/sysroot \</div> |
| <div class="line"> -DCMAKE_CXX_FLAGS=--std=c++14 \</div> |
| <div class="line"> -DCMAKE_EXE_LINKER_FLAGS="-pie -llog" \</div> |
| <div class="line"> -DCMAKE_MODULE_LINKER_FLAGS="-llog" \</div> |
| <div class="line"> -DARMNN_PATH=$WORKING_DIR/armnn/build/libarmnn.so ..</div> |
| </div><!-- fragment --></li> |
| <li>Run the build <div class="fragment"><div class="line">make</div> |
| </div><!-- fragment --></li> |
| </ul> |
| <h1>Run the Arm NN unit tests on an Android device</h1> |
| <ul> |
| <li>Push the build results to an Android device and make symbolic links for shared libraries: Currently adb version we have used for testing is 1.0.41. <div class="fragment"><div class="line">adb push libarmnn.so /data/local/tmp/</div> |
| <div class="line">adb push libtimelineDecoder.so /data/local/tmp/</div> |
| <div class="line">adb push libtimelineDecoderJson.so /data/local/tmp/</div> |
| <div class="line">adb push GatordMock /data/local/tmp/</div> |
| <div class="line">adb push libarmnnBasePipeServer.so /data/local/tmp/</div> |
| <div class="line">adb push libarmnnTestUtils.so /data/local/tmp/</div> |
| <div class="line">adb push UnitTests /data/local/tmp/</div> |
| <div class="line">adb push $NDK_DIR/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so /data/local/tmp/</div> |
| </div><!-- fragment --></li> |
| <li>Push the files needed for the unit tests (they are a mix of files, directories and symbolic links): <div class="fragment"><div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/testSharedObject</div> |
| <div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/testSharedObject/* /data/local/tmp/src/backends/backendsCommon/test/testSharedObject/</div> |
| <div class="line"> </div> |
| <div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/testDynamicBackend</div> |
| <div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/testDynamicBackend/* /data/local/tmp/src/backends/backendsCommon/test/testDynamicBackend/</div> |
| <div class="line"> </div> |
| <div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath1</div> |
| <div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath1/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath1/</div> |
| <div class="line"> </div> |
| <div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2</div> |
| <div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/</div> |
| <div class="line">adb shell ln -s Arm_CpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1</div> |
| <div class="line">adb shell ln -s Arm_CpuAcc_backend.so.1 /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1.2</div> |
| <div class="line">adb shell ln -s Arm_CpuAcc_backend.so.1.2 /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1.2.3</div> |
| <div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath2/Arm_GpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/</div> |
| <div class="line">adb shell ln -s nothing /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_no_backend.so</div> |
| <div class="line"> </div> |
| <div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath3</div> |
| <div class="line"> </div> |
| <div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath5</div> |
| <div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath5/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath5/</div> |
| <div class="line"> </div> |
| <div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath6</div> |
| <div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath6/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath6/</div> |
| <div class="line"> </div> |
| <div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath7</div> |
| <div class="line"> </div> |
| <div class="line">adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath9</div> |
| <div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/backendsCommon/test/backendsTestPath9/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath9/</div> |
| <div class="line"> </div> |
| <div class="line">adb shell mkdir -p /data/local/tmp/src/backends/dynamic/reference</div> |
| <div class="line">adb push -p $WORKING_DIR/armnn/build/src/backends/dynamic/reference/Arm_CpuRef_backend.so /data/local/tmp/src/backends/dynamic/reference/</div> |
| </div><!-- fragment --></li> |
| </ul> |
| <p>If 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. This is the example when $SAMPLE_DYNAMIC_BACKEND_PATH is specified as /data/local/tmp/dynamic/sample/:</p> |
| <div class="fragment"><div class="line">adb shell mkdir -p /data/local/tmp/dynamic/sample/</div> |
| <div class="line">adb push -p $WORKING_DIR/armnn/src/dynamic/sample/build/libArm_SampleDynamic_backend.so /data/local/tmp/dynamic/sample/</div> |
| </div><!-- fragment --><p>If the delegate was built, push the delegate unit tests too. </p><div class="fragment"><div class="line">adb push $WORKING_DIR/armnn/build/delegate/DelegateUnitTests /data/local/tmp/</div> |
| <div class="line">adb push $WORKING_DIR/armnn/build/delegate/libarmnnDelegate.so /data/local/tmp/</div> |
| </div><!-- fragment --><p>Run Arm NN unit tests: </p><div class="fragment"><div class="line">adb shell 'LD_LIBRARY_PATH=/data/local/tmp:/vendor/lib64:/vendor/lib64/egl /data/local/tmp/UnitTests'</div> |
| </div><!-- fragment --><p>If the delegate was built run Arm Delegate NN unit tests: </p><div class="fragment"><div class="line">adb shell 'LD_LIBRARY_PATH=/data/local/tmp:/vendor/lib64:/vendor/lib64/egl /data/local/tmp/DelegateUnitTests'</div> |
| </div><!-- fragment --><p>If libarmnnUtils.a is present in <code>$WORKING_DIR/armnn/build/</code> and the unit tests run without failure then the build was successful. </p> |
| </div></div><!-- contents --> |
| </div><!-- PageDoc --> |
| </div><!-- doc-content --> |
| <!-- start footer part --> |
| <div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> |
| <ul> |
| <li class="navelem"><a class="el" href="buildguides.html">Build Guides</a></li> |
| <li class="footer">Generated on Wed Feb 14 2024 16:36:20 for Arm NN by |
| <a href="http://www.doxygen.org/index.html"> |
| <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li> |
| </ul> |
| </div> |
| </body> |
| </html> |