Skip to content

build opencv3.4.1 android sdk contrib on windows

iPanda edited this page Mar 15, 2019 · 1 revision

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

准备阶段

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


我的不同架构的Cmake命令

只有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