一碉考、準備工作
注意:此編譯方式為我個人編譯方式,主要通過mnn庫編譯.a靜態(tài)庫挺身,然后通過我們c++項目編譯成.so也就是android端引用侯谁。
1.準備好Linux(Ubuntu)64位系統(tǒng),可使用虛擬機VMware Workstation Pro
為什么不在windows下?
此方式編譯ncnn庫的環(huán)境為Linux,所以需要準備好Linux系統(tǒng)或者使用虛擬機安裝Linux系統(tǒng)鏡像文件.
二章钾、編譯步驟
1. 下載MNN庫
https://github.com/alibaba/MNN
2. 下載Cmake
下載完畢需要對cmake進行配置墙贱,這里就不多描述了。
https://cmake.org/
3. 配置CmakeLists.txt文件(可選)
文件在MNN庫下的根目錄
這里關閉了動態(tài)庫編譯贱傀,也就是使用的是靜態(tài)庫編譯
option(MNN_BUILD_SHARED_LIBS "MNN build shared or static lib" OFF)
4. 編寫.sh執(zhí)行命令文件
在MNN根目錄創(chuàng)建build_android.sh文件(文件名稱自定)
如下為32位編譯例子惨撇、這里關閉了部分編譯配置。
#!/usr/bin/env bash
rm -r android_build_v7a
mkdir android_build_v7a
pushd android_build_v7a
cmake .. \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
# -DCMAKE_BUILD_TYPE=Release \ ##這里release關閉了府寒,如果使用會增大一倍體積
-DANDROID_ABI="armeabi-v7a" \
-DANDROID_STL=c++_static \ ##必須使用c++_static 魁衙,測試gnustl_static無法編譯成功mnn貌似不支持
-DMNN_USE_LOGCAT=false \
-DMNN_BUILD_BENCHMARK=OFF \
-DANDROID_NATIVE_API_LEVEL=android-21 \
-DMNN_BUILD_FOR_ANDROID_COMMAND=false \
-DMNN_OPENGL=false \
-DMNN_BUILD_TRAIN=false \
-DMNN_VULKAN=false \
-DMNN_SUPPORT_BF16=true \
-DMNN_OPENCL=false -DMNN_ARM82=true \
-DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=.
make -j16
printf "is over"
popd
5. 執(zhí)行.sh文件
在MNN根目錄打開終端
輸入./build_android.sh (我的.sh文件名為build_anroid报腔,可根據自身命名修改)
6. 提取.s或.so文件
找到MNN根目錄的build_anroid文件夾下的.so或.a文件(build_android文件夾也是在編寫.sh文件命令自定義的)
注意:.so靜態(tài)庫和.a動態(tài)庫使用方式不同,可根據自身需求配置
三纺棺、問題匯總
1. 目前編譯的64或者32位的.a與.so過大榄笙,為6m~8m左右(關閉了部分配置)邪狞,如果有些必須的配置需要添加可能達到13m+,這里暫時沒有找到相關量化的方法祷蝌。
2. 目前編譯完成,還沒有通過實際使用帆卓,由于本人的項目是要使用.a形式巨朦,配合我們的c++項目,進行二次編譯.so剑令,最終在android中使用糊啡。
初步為編譯部分后續(xù)會持續(xù)更新,僅供參數吁津,可能大家遇到的情況都不一致棚蓄,歡迎指出錯誤。