-
Notifications
You must be signed in to change notification settings - Fork 11
build opencv3.4.1 android sdk contrib on windows
This article was written on 2018-04-02,may have been out of date ,just for reference.
- Windows10 x64
- Android Studio3.1
- opencv-3.4.1
- opencv_contrib-3.4.1
- 下载安装JDK,如果有了就不用,配置JAVA_HOME到环境变量
- JAVA_HOME: C:\Program Files\Java\jdk1.8.0_162
- 下载安装ANT,如果有就不用下载,配置ANT_HOME到环境变量
- http://ant.apache.org/bindownload.cgi
- ANT_HOME: D:\ProgramData\apache-ant-1.10.2
- 下载并解压OpenCV3.4.1 Android SDK
- 下载并解压OpenCV3.4.1匹配的扩展模块
- 下载并安装Cmake,环境变量应该自动配置了:
- https://cmake.org/download/
- Path: D:\Program Files\CMake\bin
- 下载并安装MinGW,并且把MinGW配置到环境变量中去。
- http://www.mingw.org/download/installer
- 此链接会下载mingw-get,是一个管理器,下载安装完成后把bin目录添加到环境变量
- Path: C:\MinGW\bin
mingw-get install mingw32-make
mingw-get install gcc
我们需要安装mingw32-make,等会我们需要用它来make。可以顺便安装gcc。
- 下载并安装Android Studio,最新版本的SDK与NDK,配置环境变量ANDROID_NDK为安装好的NDK路径.
- ANDROID_NDK: D:\ProgramData\Android\SDK\ndk-bundle
- ANDROID_HOME: D:\ProgramData\Android\SDK
- 另外编译需要执行android命令
- 在Android Studio官网的sdkmanager页面中,明确提到了在Android SDK Tools25.2.3及以后提供了sdkmanager command-line tools 以及舍弃android命令.
- 我们可以从AndroidStudio中文社区下载旧版的SDK Tools。比如 这里 下载24.2版本。 下载完成后解压,复制其中的tools目录,覆盖原来的tools目录即可。
- D:\ProgramData\下面建立opencv341-android-sdk-with-contrib文件夹
- 把下载好的opencv和opencv_contrib放在这个目录下,并改好名称,分别改成opencv和opencv_contrib
- 编译armeabi-v7a架构,cmd执行:
- cd /d D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\build
cmake -G"MinGW Makefiles"
-DCMAKE_TOOLCHAIN_FILE='D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources\platforms\android\android.toolchain.cmake'
-DOPENCV_EXTRA_MODULES_PATH='D:\ProgramData\opencv341-android-sdk-with-contrib\opencv_contrib\modules'
-DANDROID_ABI='armeabi-v7a'
-DANDROID_NATIVE_API_LEVEL='21'
-DANDROID_SDK_TARGET='23'
-DWITH_OPENCL='ON'
-DWITH_OPENCL_SVM='ON'
'D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources'
成功配置后会生成
D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\build\CMakeCache.txt
文件保存了编译的相关设置,可以在这个文件进行个性化修改。
然后
mingw32-make -j5
开启5个线程执行make命令
成功后
mingw32-make install
安装即可
编译完的SDK会安装在:
D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\build\install
上面三步可能会因为opencv版本,系统环境等等原因而爆出各种各样的错误。
所以如果没能成功编译,可以查看以下的文件,包含相关编译说明,命令参数等: D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources\platforms\android\android.toolchain.cmake
当然也可以通过运行D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources\platforms\android\build_sdk.py来编译,但是这个.py文件实际上也是通过产生cmake命令来编译的,而且建议在linux环境下去编译会比较方便,需要另外安装Ninja并配置环境。
python build_sdk.py
--ndk_path='D:\ProgramData\Android\SDK\ndk-bundle'
--sdk_path='D:\ProgramData\Android\SDK'
--extra_modules_path='D:\ProgramData\opencv341-android-sdk-with-contrib\opencv_contrib\modules'
'D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\build'
'D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources'
运行后产生
cmake -GNinja
-DOPENCV_EXTRA_MODULES_PATH='D:\ProgramData\opencv341-android-sdk-with-contrib\opencv_contrib\modules'
-DNDK_CCACHE=ccache
-DBUILD_TESTS=ON
-DINSTALL_TESTS=ON
-DCMAKE_TOOLCHAIN_FILE='D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\platforms\android\android.toolchain.cmake'
-DWITH_OPENCL='OFF'
-DWITH_CUDA='OFF'
-DWITH_IPP='OFF'
-DWITH_TBB='ON'
-DBUILD_EXAMPLES='OFF'
-DBUILD_TESTS='OFF'
-DBUILD_opencv_datasets='OFF'
-DBUILD_PERF_TESTS='OFF'
-DBUILD_DOCS='OFF'
-DBUILD_ANDROID_EXAMPLES='OFF'
-DINSTALL_ANDROID_EXAMPLES='OFF'
-DANDROID_STL='gnustl_static'
-DANDROID_ABI='armeabi-v7a'
-DANDROID_TOOLCHAIN_NAME='arm-linux-androideabi-4.9'
-DANDROID_PLATFORM_ID='2'
'D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources'
但是我们这边是在windows上编译也安装了MinGW,所以上面的-GNinja可以替换为-G"MinGW Makefiles"
cmake -G"MinGW Makefiles"
...
参数很多其实还是比较复杂的,配置虽然有时候能通过,但是make和install时未必会成功,不过因为有android.toolchain.cmake,很多参数项可以删除保持默认,只需指定必要的资源路径与命令即可,也就是我最开始的那个编译armeabi-v7a架构的命令。
有几个参数说明一下,如果默认参数编译不通过,可以看情况修改
-
ANDROID_NATIVE_API_LEVEL
api等级,使用哪个等级的api进行编译 -
ANDROID_SDK_TARGET='23'
目标SDK -
ANDROID_ABI='armeabi-v7a'
cpu架构,只能一个一个编译 -
BUILD_SHARED_LIBS=OFF
如果On则只编译so库 -
WITH_OPENCL=ON
Include OpenCL Runtime support 因为我们编译的是android sdk,所以建议添加移动端的并行架构支持 -
WITH_OPENCL_SVM=ON
建议开启共享虚拟内存 -
ANT_EXECUTABLE='D:/ProgramData/apache-ant-1.10.2/bin/ant.bat'
环境变量中识别到的ANT路径 -
BUILD_opencv_world=OFF
生成.so库libopencv_world.so,这是一个集合,不清楚和默认编译的libopencv_java3.so有什么区别,默认不开启,如果开启的话不会复制java层函数,也就是cmake的gui界面会显示Java wrappers: NO。
更多配置参数修改,查看:
build\CMakeCache.txt
如果只编译arm架构,最新的ndk就行,但是若要编译x86架构,可能需要旧版的ndk,例如android-ndk-r10e
编译x86时可能需要把ANDROID_NATIVE_API_LEVEL
设置高一些,例如9改为21
只有ANDROID_ABI参数是不同的
//armeabi-v7a
cmake -G"MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE='D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources\platforms\android\android.toolchain.cmake' -DOPENCV_EXTRA_MODULES_PATH='D:\ProgramData\opencv341-android-sdk-with-contrib\opencv_contrib\modules' -DANDROID_ABI='armeabi-v7a' -DWITH_OPENCL='ON' -DWITH_OPENCL_SVM='ON' -DANDROID_NATIVE_API_LEVEL='21' -DANDROID_SDK_TARGET='23' D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources
//x86
cmake -G"MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE='D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources\platforms\android\android.toolchain.cmake' -DOPENCV_EXTRA_MODULES_PATH='D:\ProgramData\opencv341-android-sdk-with-contrib\opencv_contrib\modules' -DANDROID_ABI='x86' -DWITH_OPENCL='ON' -DWITH_OPENCL_SVM='ON' -DANDROID_NATIVE_API_LEVEL='21' -DANDROID_SDK_TARGET='23' D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources
//arm64-v8a
cmake -G"MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE='D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources\platforms\android\android.toolchain.cmake' -DOPENCV_EXTRA_MODULES_PATH='D:\ProgramData\opencv341-android-sdk-with-contrib\opencv_contrib\modules' -DANDROID_ABI='arm64-v8a' -DWITH_OPENCL='ON' -DWITH_OPENCL_SVM='ON' -DANDROID_NATIVE_API_LEVEL='21' -DANDROID_SDK_TARGET='23' D:\ProgramData\opencv341-android-sdk-with-contrib\opencv\sources