根據自己需要的模塊交叉編譯 Android OpenCV 庫,如下面的腳本只編譯了 opencv_core 、opencv_imgproc、opencv_video 三個模塊,如果需要裁剪自定製,可以修改 build_opencv_modules 函數,打開或關閉你需要的模塊。模塊所需要依賴的其他模塊可在 OptionArgs.txt 裏查找 xxx_LIB_DEPENDS,xxx 爲要編譯的模塊。比如,要編譯 opencv_video,可以在 OptionArgs.txt 裏搜索 opencv_video_LIB_DEPENDS 可以看到其依賴於 opencv_core 和 opencv_imgproc 模塊:
//Dependencies for the target
opencv_video_LIB_DEPENDS:STATIC=general;opencv_core;general;opencv_imgproc;general;dl;general;m;general;log;
下面腳本已放在 github
交叉編譯腳本如下(使用時記得將 NDK 改成自己的路徑):
#!/bin/bash
# Author: AlanWang
# Email: [email protected]
# Date: 2020-06-10
NDK_PATH="/Users/AlanWang/AndroidDev/android-ndk-r16b"
CMAKE_TOOLCHAIN_PATH="${NDK_PATH}/build/cmake/android.toolchain.cmake"
echo "build opencv for android"
function build_opencv_modules
{
ARCH_ABI=$1
API_LEVEL=$2
cmake \
-DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_PATH \
-DCMAKE_BUILD_TYPE=Release \
-DANDROID_NDK=$NDK_PATH \
-DCMAKE_CXX_FLAGS=-std=c++11 \
-DANDROID_ABI=$ARCH_ABI \
-DANDROID_STL=c++_static \
-DENABLE_CXX11=ON \
-DBUILD_ANDROID_PROJECTS=OFF \
-DBUILD_ANDROID_EXAMPLES=OFF \
-DBUILD_JAVA=OFF \
-DBUILD_CUDA_STUBS=OFF \
-DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_JASPER=OFF \
-DBUILD_JPEG=OFF \
-DBUILD_OPENEXR=OFF \
-DBUILD_PACKAGE=OFF \
-DBUILD_PERF_TESTS=OFF \
-DBUILD_PNG=OFF \
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_TBB=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_TIFF=OFF \
-DBUILD_WITH_DEBUG_INFO=OFF \
-DBUILD_WITH_DYNAMIC_IPP=OFF \
-DBUILD_ZLIB=OFF \
-DBUILD_opencv_apps=OFF \
-DBUILD_opencv_calib3d=OFF \
-DBUILD_opencv_core=ON \
-DBUILD_opencv_features2d=OFF \
-DBUILD_opencv_flann=OFF \
-DBUILD_opencv_highgui=OFF \
-DBUILD_opencv_imgcodecs=OFF \
-DBUILD_opencv_imgproc=ON \
-DBUILD_opencv_ml=OFF \
-DBUILD_opencv_objdetect=OFF \
-DBUILD_opencv_photo=OFF \
-DBUILD_opencv_python2=OFF \
-DBUILD_opencv_python3=OFF \
-DBUILD_opencv_shape=OFF \
-DBUILD_opencv_stitching=OFF \
-DBUILD_opencv_superres=OFF \
-DBUILD_opencv_ts=OFF \
-DBUILD_opencv_video=ON \
-DBUILD_opencv_videoio=OFF \
-DBUILD_opencv_videostab=OFF \
-DBUILD_opencv_world=OFF \
-DWITH_IPP=OFF \
-DWITH_FFMPEG=OFF \
-DWITH_CUDA=OFF \
-DWITH_CUFFT=OFF \
-DWITH_EIGEN=OFF \
-DWITH_JASPER=OFF \
-DWITH_JPEG=OFF \
-DWITH_PNG=OFF \
-DWITH_PTHREADS_PF=OFF \
-DWITH_OPENEXR=OFF \
-DWITH_MATLAB=OFF \
-DWITH_TBB=OFF \
-DWITH_TIFF=OFF \
-DWITH_WEBP=OFF \
-DANDROID_NATIVE_API_LEVEL=${API_LEVEL} ../../
make clean
make -j8
make install
}
function mv_dirs {
rm -rf $2
mkdir -p $2
mv $1/* $2/
}
function build_opencv {
rm -rf $1
mkdir $1
cd $1
build_opencv_modules $1 $2
OPENCV_LIBS_PATH="./install/sdk/native/libs/$1"
OUTPUT_LIBS_PATH="../opencv/$1"
mv_dirs ${OPENCV_LIBS_PATH} ${OUTPUT_LIBS_PATH}
OTHER_LIBS_PATH="./install/sdk/native/3rdparty/libs/$1"
OUTPUT_3RDPARTY_LIBS_PATH="../3rdparty/$1"
mv_dirs ${OTHER_LIBS_PATH} ${OUTPUT_3RDPARTY_LIBS_PATH}
INCLUDE_PATH="./install/sdk/native/jni/include"
OUTPUT_INCLUDE_PATH="../opencv/include"
mv_dirs ${INCLUDE_PATH} ${OUTPUT_INCLUDE_PATH}
cd ..
rm -rf $1
cur_path=$(pwd)
echo ${cur_path}
}
rm -rf build_android
mkdir build_android
cd build_android
mkdir opencv
mkdir 3rdparty
build_opencv armeabi-v7a 16
build_opencv arm64-v8a 21
操作步驟:
1、將其保存在 build_android.sh 並賦予執行權限
2、下載 OpenCV 源碼並解壓(我編譯的 opencv-3.1.0 版本,opencv 所有 release 版本)
3、將 build_android.sh 放入解壓後的目錄(如:opencv-3.1.0)
4、進入解壓目錄 opencv-3.1.0,執行 :
./build_android.sh
5、生成的編譯好的庫在 opencv-3.1.0 下的 build_android 目錄
6、使用時在 CMakeList 裏添加 opencv 依賴,注意:被依賴的庫要在下面,否則編譯連接的時候會提示 opencv 的某些函數未定義。
${OPENCV_LIB_PATH}/libopencv_video.a
${OPENCV_LIB_PATH}/libopencv_imgproc.a
${OPENCV_LIB_PATH}/libopencv_core.a
目錄結構如下:
github 地址:
https://github.com/alanwang4523/OpenCV_Build4Android