Ubuntu16.04编译OpenCV for Android(更新版)
本文为https://blog.csdn.net/lj402159806/article/details/76762228的更新版
编译版本
-
OpenCV 3.4.5
-
OpenCV 4.1.0
-
ndk-r18
编译环境
首先需要安装sdk tools,然后通过sdkmanager安装cmake和ndk
mkdir sdk && cd sdk
#下载sdk tools
wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
#解压sdk tools
unzip sdk-tools-linux-4333796.zip
cd tools/bin
#查看sdk列表
./sdkmanager --list
#安装cmake和ndk
./sdkmanager "cmake;3.6.4111459" "ndk-bundle"
在官网下载指定版本的源码
http://opencv.org/releases.html
编译opencv
进入源码目录新建一个opencvAndroid.sh脚本文件,内容如下
#!/bin/sh
export BASE_PATH=${HOME}/Android
export SDK_PATH=${BASE_PATH}/sdk
export NDK_PATH=${SDK_PATH}/ndk-bundle
export cmake=${SDK_PATH}/cmake/3.6.4111459/bin/cmake
rm -rf android_build
mkdir android_build
cd android_build
${cmake} -DANDROID_SDK=${SDK_PATH} \
-DANDROID_NDK=${NDK_PATH} \
-DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
-DANDROID_PLATFORM=android-16 \
-DANDROID_STL=c++_static \
-DANDROID_ABI="armeabi-v7a with NEON" \
-DBUILD_ANDROID_PROJECTS=OFF \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_opencv_world=ON \
-DCMAKE_INSTALL_PREFIX=./android_install \
-DCMAKE_BUILD_TYPE=Release $@ ..
${cmake} --build . --config Release --target install -- -j16
然后执行该脚本./opencvAndroid.sh
完成后在android_build/android_install
目录下可以找到头文件和库文件
编译opencv指定模块
只想编译core
imgcodecs
imgproc
三个模块并且只需要支持JPEG
PNG
的话替换下面命令
${cmake} -DANDROID_SDK=${SDK_PATH} \
-DANDROID_NDK=${NDK_PATH} \
-DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
-DANDROID_PLATFORM=android-16 \
-DANDROID_STL=c++_static \
-DANDROID_ABI="armeabi-v7a with NEON" \
-DBUILD_ANDROID_PROJECTS=OFF \
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_opencv_calib3d=OFF \
-DBUILD_opencv_core=ON \
-DBUILD_opencv_imgcodecs=ON \
-DBUILD_opencv_imgproc=ON \
-DBUILD_opencv_dnn=OFF \
-DBUILD_opencv_features2d=OFF \
-DBUILD_opencv_flann=OFF \
-DBUILD_opencv_highgui=OFF \
-DBUILD_opencv_java_bindings_generator=OFF \
-DBUILD_opencv_ml=OFF \
-DBUILD_opencv_objdetect=OFF \
-DBUILD_opencv_photo=OFF \
-DBUILD_opencv_shape=OFF \
-DBUILD_opencv_stitching=OFF \
-DBUILD_opencv_superres=OFF \
-DBUILD_opencv_ts=OFF \
-DBUILD_opencv_video=OFF \
-DBUILD_opencv_videoio=OFF \
-DBUILD_opencv_videostab=OFF \
-DBUILD_opencv_world=OFF \
-DBUILD_ZLIB=ON \
-DBUILD_JPEG=ON \
-DWITH_JPEG=ON \
-DBUILD_JASPER=OFF \
-DWITH_JASPER=OFF \
-DBUILD_PNG=ON \
-DWITH_PNG=ON \
-DBUILD_WEBP=OFF \
-DWITH_WEBP=OFF \
-DBUILD_TIFF=OFF \
-DWITH_TIFF=OFF \
-DBUILD_OPENEXR=OFF \
-DWITH_OPENEXR=OFF \
-DWITH_IMGCODEC_HDR=OFF \
-DWITH_IMGCODEC_SUNRASTER=OFF \
-DWITH_IMGCODEC_PXM=OFF \
-DBUILD_PROTOBUF=OFF \
-DWITH_PROTOBUF=OFF \
-DCV_TRACE=OFF \
-DCMAKE_INSTALL_PREFIX=./android_install \
-DCMAKE_BUILD_TYPE=Release $@ ..
注意:
由于我们这里生成的是静态库,因此在链接时需要把core放在最后,否则编译时会报undefined reference to cv::softdouble::operator/
之类的问题
target_link_libraries(
libopencv_imgcodecs
libopencv_imgproc
libopencv_core // <--- Put core last
)