1、前提条件
linux系统,安装了cmake。
2、编译步骤
(1)下载ncnn项目
git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init
如果无法成功clone则可以选择去官方仓库下载对应版本的完整源码,链接为:https://github.com/Tencent/ncnn/releases
下载文件为:ncnn-full-source.zip
(2)安装安卓NDK
下载链接
NDK的版本需要和想要运行的最低安卓版本对应,有些较新的NDK版本不支持很低的android版本,需要查阅下NDK版本更新文档,实际应用中支持到android5即可,最新的NDK r26版本支持最低的版本为android5 ,对应API为21,建议使用满足支持版本的条件下的最新版本的NDK。下面以安装r26c为例:
下载后解压:
unzip android-ndk-r26c-linux-x86_64.zip
设置安卓NDK路径变量:
export ANDROID_NDK=<your-ndk-root-path>
(3)删除 Android NDK 中的硬编码调试标志(可选项)
如果ndk < r23 修改文件为:
$ANDROID_NDK/build/cmake/android.toolchain.cmake
如果ndk >= r23,则要修改文件为:
$ANDROID_NDK/build/cmake/android-legacy.toolchain.cmake
定位到此处:
list(APPEND ANDROID_COMPILER_FLAGS
-g
-DANDROID
然后将-g 这行删除后保存即可,这可以减小库的体积。
(4)编译 armv7/arm64-v8a 架构的库
下面为编译armv7架构的库的过程:
step1: 进入ncnn根目录,创建并进入编译结果生成目录:
cd <ncnn-root-dir>
mkdir -p build-android-armv7
cd build-android-armv7
cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" \
-DANDROID_ABI="armeabi-v7a" \
-DANDROID_ARM_NEON=ON \
-DANDROID_PLATFORM=android-21 \
-DNCNN_DISABLE_EXCEPTION=OFF \
-DNCNN_DISABLE_RTTI=OFF \
-DNCNN_SHARED_LIB=ON \
-DCMAKE_BUILD_TYPE=Release ..
-DNCNN_SHARED_LIB=ON是表示将编译为动态库,否则为静态库。如果要编译支持Vulkan,需要添加-DNCNN_VULKAN=ON指令,但是android API必须大于等于android-24版本才支持。以上示例中开启了对EXCEPTION和RTTI的支持,是因为项目中opencv库使用了官方的版本,opencv是支持以上两个功能,为了和opencv保持一致,ncnn也开启,因为当两个(或多个)库的rtti、exceptions编译选项设定不同时,会导致冲突,需要统一。
最后依次执行以下两条命令:
make -j$(nproc)
make install
在install目录中可找到编译后的库及头文件等相关文件。
对于arm64-v8a架构的编译,只需按照上面的步骤另外创建arm64-v8a的编译目录及将-DANDROID_ABI 参数指定为arm64-v8a即可。