根据自己需要的模块交叉编译 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