源码编译opencv的安卓Android库
因为项目需要,稍微改了opencv一点源码,这个时候就需要源码编译opencv的库了。我pc机器上面试了没有问题,但是我们项目是跑在移动设备安卓上面的,算法通过jni打包接口供上层java调用,opencv用的安卓版本的,这就坑爹了,没办法,我就编译安卓版本的opencv吧,这里面的坑真多。
参考链接:
https://www.jianshu.com/p/925614d6e9e0 OpenCV3.4源码交叉编译android库
https://blog.csdn.net/Martin_chen2/article/details/80463610
https://www.jianshu.com/p/288ca9327b32 源码编译Android openCV+openCV_contrib库
//下面这个链接很重要,生成libopencv_java.so。
https://blog.csdn.net/u010363893/article/details/54892448?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1
//下面这个链接我按照他的来的,没有成功,报错。报错warning: /bin/ld: skipping incompatible,然后是找不到opencv库什么的
https://www.cnblogs.com/gao-chun/p/4971126.html android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!
我的环境是Ubuntu16.04
首先是需要下载安装ndk
ndk:android-ndk-14b
cd /opt ###/opt为android-ndk-r14b所在的目录,根据你对应的目录改变
./android-ndk-r14b/build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.9 --platform=android-21 --install-dir=./android-toolchain-r14b/android-armv7 --arch=arm --force
上面这个路径随意。
当然我整的时候各种问题,还有cmake版本过低的问题。还下了一个android-ndk-r21的。
还有下面的指令,一开始明明加了参数ANDROID_ARCH_ABI=arm64-v8a,死活生成armeabi-v7a啊,然后去
opencv-3.2.0/platforms/android/android.toolchain.cmake改这个,直接强制SET(ANDROID_ABI "arm64-v8a")
#line638
# choose target ABI
__INIT_VARIABLE( ANDROID_ABI VALUES ${ANDROID_SUPPORTED_ABIS} )
#####################################################YHL ADD yhl 20200409###########################################################
SET(ANDROID_ABI "arm64-v8a")
//0410-arm64可以 但是没有so
export ANDROID_NDK=/data_2/everyday/down_load/android-ndk/14/android-ndk-r14b
cmake -DCMAKE_TOOLCHAIN_FILE=../platforms/android/android.toolchain.cmake -DCMAKE_ANDROID_NDK=/data_2/everyday/down_load/android-ndk/14/android-ndk-r14b -DANDROID_NATIVE_API_LEVEL=21 -DBUILD_ANDROID_PROJECTS=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Release -DBUILD_JAVA=ON -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -D WITH_CUDA=OFF -D WITH_MATLAB=OFF -D BUILD_DOCS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=/data_1/Yang/software/opencv-3.2.0/0myfile-android/install-now-1 ..
然后敲
make -j4
make install -j4
按照上面的这个命令,只有.a,没有libopencv_java3.so。因为一开始安卓用的只有libopencv_java3.so这个,官方下的库也是在OpenCV-android-sdk/sdk/native/libs/arm64-v8a文件夹下
而我的,
就是没有so
然后同事告诉我
//同事告诉我加 -DBUILD_SHARED_LIBS=ON
export ANDROID_NDK=/data_2/everyday/down_load/android-ndk/14/android-ndk-r14b
cmake -DCMAKE_TOOLCHAIN_FILE=../platforms/android/android.toolchain.cmake -DCMAKE_ANDROID_NDK=/data_2/everyday/down_load/android-ndk/14/android-ndk-r14b -DANDROID_NATIVE_API_LEVEL=21 -DBUILD_ANDROID_PROJECTS=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Release -DBUILD_JAVA=ON -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -D WITH_CUDA=OFF -D WITH_MATLAB=OFF -D BUILD_DOCS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=/data_1/Yang/software/opencv-3.2.0/0myfile-android/install-now-2 ..
变成都是so了。。。
但是总感觉这些已经能用了。然后无意间查资料发现,说
”PS:编译如果需要生成libopencv_java.so,需要安装ant工具,apt-get install ant 即可。通过修改CMakeCache.txt可以修改编译配置,里面有BUILD_OPENCV_JAVA,怎会产生libopencv_java.so。“
然后我敲了:
sudo apt-get install ant
再加上 -DBUILD_OPENCV_JAVA=ON
//0410-arm64可以 但是没有so -DBUILD_OPENCV_JAVA=ON
export ANDROID_NDK=/data_2/everyday/down_load/android-ndk/14/android-ndk-r14b
cmake -DCMAKE_TOOLCHAIN_FILE=../platforms/android/android.toolchain.cmake -DCMAKE_ANDROID_NDK=/data_2/everyday/down_load/android-ndk/14/android-ndk-r14b -DANDROID_NATIVE_API_LEVEL=21 -DBUILD_ANDROID_PROJECTS=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Release -DBUILD_JAVA=ON -DBUILD_OPENCV_JAVA=ON -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -D WITH_CUDA=OFF -D WITH_MATLAB=OFF -D BUILD_DOCS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=/data_1/Yang/software/opencv-3.2.0/0myfile-android/install-now-0413_0 ..
哈哈,终于有了libopencv_java3.so: