1. 编译环境
ubuntu18.04 Linux (虚拟机)
ndkVersion: 25.2.9519653
cmakeVersion: 3.25.1
NDK下载地址:
Home · android/ndk Wiki · GitHub
TNN 0.3.0 源码下载地址:
Release TNN v0.3.0 · Tencent/TNN · GitHub
2. 修改源码
需要需改上述文件 source/tnn/device/arm/acc/compute/gemm_function.cc
使用 以下git节点的源码修改上述文件
800ec4d3e8c0d89a1b9d747312927892ddf92bbe
更新日期为:Sep 30, 2022
3. 编译方法
3.1 切换到脚本目录
cd <path_to_tnn>/scripts
3.2 编辑build_android.sh修改配置选项
ABIA32="armeabi-v7a with NEON"
ABIA64="arm64-v8a"
STL="c++_static"
SHARED_LIB="ON" # ON表示编译动态库,OFF表示编译静态库
ARM="ON" # ON表示编译带有Arm CPU版本的库
OPENMP="ON" # ON表示打开OpenMP
OPENCL="ON" # ON表示编译带有Arm GPU版本的库
HUAWEI_NPU="ON" # ON表示编译带有Arm GPU NPU版本的库
SHARING_MEM_WITH_OPENGL=0 # 1表示OpenGL的Texture可以与OpenCL共享
华为NPU PS: 运行前需要下载DDK, 并放到指定文件夹。 或是用脚本直接下载具体请参考: FAQ如何创建华为NPU编译环境
3.3 执行编译脚本
设定NDK目录环境变量
export ANDROID_NDK=/home/lyy/android-ndk-r25c-linux/android-ndk-r25c/
./build_android.sh
编译完成后,在当前目录的release目录下生成对应的armeabi-v7a库,arm64-v8a库和include头文件。如果是编译成静态库,集成链接需添加-Wl,--whole-archive tnn -Wl,--no-whole-archive。
4. 编译选项
OPENCL="OFF" # 关闭GPU加速
OPENMP="OFF" # 关闭OMP
5. 参考
6. 附件
6.1 编译脚本 (build_android.sh)
#!/bin/bash
#ABIA32="armeabi-v7a with NEON"
ABIA32="armeabi-v7a"
ABIA64="arm64-v8a"
STL="c++_static"
#STL="gnustl_static"
SHARED_LIB="ON"
ARM="ON"
OPENMP="OFF"
OPENCL="OFF"
#HUAWEI_NPU="ON"
if [ -z "$HUAWEI_NPU" ]; then
HUAWEI_NPU="OFF"
fi
BENMARK_MODE="OFF"
DEBUG="OFF"
INCREMENTAL_COMPILE="OFF"
SHARING_MEM_WITH_OPENGL=0
ANDROID_API_LEVEL="android-14"
# check ANDROID_NDK whether set.
if [ ! -f "$ANDROID_NDK/build/cmake/android.toolchain.cmake" ]; then
echo -e "Not found: build/cmake/android.toolchain.cmake in ANDROID_NDK:$ANDROID_NDK"
echo -e "Please download android ndk and set ANDROID_NDK environment variable."
exit -1
fi
while [ "$1" != "" ]; do
case $1 in
-ic)
shift
INCREMENTAL_COMPILE="ON"
;;
*)
usage
exit 1
esac
done
TNN_BUILD_PATH=$PWD
if [ -z $TNN_ROOT_PATH ]
then
TNN_ROOT_PATH=$(cd `dirname $0`; pwd)/..
echo $TNN_ROOT_PATH
fi
echo ' '
echo '******************** step 2: start build rpn arm32 ********************'
cd $TNN_BUILD_PATH
if [ -x "build32" ];then
if [ "${INCREMENTAL_COMPILE}" = "OFF" ];then
echo 'remove build32'
rm -r build32
mkdir build32
fi
else
mkdir -p build32
fi
cd build32
echo $ABIA32
cmake ${TNN_ROOT_PATH} \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DDEBUG:BOOL=$DEBUG \
-DANDROID_ABI="${ABIA32}" \
-DANDROID_STL=${STL} \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API_LEVEL} \
-DANDROID_TOOLCHAIN=clang \
-DBUILD_FOR_ANDROID_COMMAND=true \
-DTNN_CPU_ENABLE:BOOL=ON \
-DTNN_ARM_ENABLE:BOOL=$ARM \
-DTNN_HUAWEI_NPU_ENABLE:BOOL=$HUAWEI_NPU \
-DTNN_OPENCL_ENABLE:BOOL=$OPENCL \
-DTNN_BENCHMARK_MODE:BOOL=$BENMARK_MODE \
-DTNN_TEST_ENABLE:BOOL=ON \
-DTNN_OPENMP_ENABLE:BOOL=$OPENMP \
-DSHARING_MEM_WITH_OPENGL=${SHARING_MEM_WITH_OPENGL} \
-DTNN_BUILD_SHARED:BOOL=$SHARED_LIB \
-Wl,-Bsymbolic
make -j32
echo ' '
echo '******************** step 3: start build rpn arm64 ********************'
cd $TNN_BUILD_PATH
if [ -x "build64" ];then
if [ "${INCREMENTAL_COMPILE}" = "OFF" ];then
echo 'remove build64'
rm -r build64
mkdir build64
fi
else
mkdir -p build64
fi
cd build64
echo $ABIA64
cmake ${TNN_ROOT_PATH} \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DDEBUG:BOOL=$DEBUG \
-DANDROID_ABI="${ABIA64}" \
-DANDROID_STL=${STL} \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_API_LEVEL} \
-DANDROID_TOOLCHAIN=clang \
-DBUILD_FOR_ANDROID_COMMAND=true \
-DTNN_CPU_ENABLE:BOOL=ON \
-DTNN_ARM_ENABLE:BOOL=$ARM \
-DTNN_HUAWEI_NPU_ENABLE:BOOL=$HUAWEI_NPU \
-DTNN_OPENCL_ENABLE:BOOL=$OPENCL \
-DTNN_TEST_ENABLE:BOOL=ON \
-DTNN_BENCHMARK_MODE:BOOL=$BENMARK_MODE \
-DTNN_OPENMP_ENABLE:BOOL=$OPENMP \
-DSHARING_MEM_WITH_OPENGL=${SHARING_MEM_WITH_OPENGL} \
-DTNN_BUILD_SHARED:BOOL=$SHARED_LIB \
-Wl,-Bsymbolic
make -j32