Android开发--Opencv for android cmake编译

一. 前期准备

不太推荐使用最新版本软件和包,它可能在版本更新当中做了大的改动,比如 android-ndk-r16 与-r15c ,在-r16 当中已经全部使用so库文件,在-rc15c之前版本中使用的还是源文件,所有在使用-rc16 编译opencv时会提示找不到include 文件。

1. Opencv (这里使用的是3.3.1,3.4.1rc版本始终没编译通过)

2.OpenCV_Contrib (这个要与opencv版本保持一致,3.3.1)

3.Android NDK (这里使用-r15c, -r6 版本改动较大编译没通过)

4.CMake (这里使用的是 3.8 版本)

5.python (2.7 版本)

6.JDK

7.MinGW  (这里使用的是MinGW,而非MinGW64,安装见下图),这里主要使用到以下三个工具                  mingw32-g++.exe  mingw32-gcc.exe   mingw32-make.exe  

8.Ant (这里使用的是1.8 版本,最新为1.10,它不需要安装解压后添加到PATH就可以了)

将 JDK python CMake MinGW安装并在环境变量 PATH 添加,(../bin  定位到这个目录) ,再将 opencv-3.3.1.zip opencv_contrib-3.3.1.zip  Android_NDK-r15c.zip 解压

Android开发--Opencv for android cmake编译_第1张图片

二、编译前设置

1.系统环境变量 根据自己的真实环境填写路径

在PATH 变量中添加: D:\Program Files\CMake\bin;D:\MinGW\bin;D:\Android\apache-ant-1.8.0\bin; D:\Android\android-ndk-r15c;C:\Python27;C:\Python27\Scripts;C:\java-8\jre\bin

设置完成之后最好重启一下系统,以免在后面的编译出现找不到文件之类的错误。

2.修改android.toolchain.cmake

在OpenCV-3.3.1 默认配置当中只支持到 -r10d,我这里使用的是-r15c

A. 在224行 中添加 -r15c

set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r15c -r10d

B.在247~252行 修改 NDK_API 支持版本,我这里使用的是19 和 26(根据自己的情况来修改)

# API level defaults

set( ANDROID_DEFAULT_NDK_API_LEVEL 19 )

set( ANDROID_DEFAULT_NDK_API_LEVEL_arm64 26 )

set( ANDROID_DEFAULT_NDK_API_LEVEL_x86 19 )

set( ANDROID_DEFAULT_NDK_API_LEVEL_x86_64 26 )

set( ANDROID_DEFAULT_NDK_API_LEVEL_mips 19 )

set( ANDROID_DEFAULT_NDK_API_LEVEL_mips64 26 )

3.运行cmake-gui.exe

Android开发--Opencv for android cmake编译_第2张图片

 1 -- 是opencv源文件目录

 2 -- 是编译后放置的目录,这个是自己建的文件夹

点击 Add Entry (5)添加 变量,

-------1

ABI CPU架构设置,由于cmake 一次只能编译一个cpu架构,多个需要多次修改此值来编译。

Name: ANDROID_ABI

Type: STRING

Value: x86    (其它值:x86_64 mips mips64 armeabi-v7a armeabi)

----------2

Name: ANDROID_NDK

Type: PATH

Value: D:\Android\android-ndk-r15c

----------3

Name: ANDROID_OPENCL_SDK

Type: PATH

Value: D:\Android\opencv_contrib-3.3.1

--------4

Name: ANDROID_NDK_HOST_X64

Type: BOOL

Value: 勾选

点击 configure 按钮开始加载配置

在第 7 选中 MinGW Makefiles (我们使用的是MinGW 工具包)

在第8 选择 Specify toolchain file for cross-compiling     点击Next后会选择配置文件android.toolchain.cmake,

我的文件目录是:D:\Android\opencv-3.3.1\platforms\android\android.toolchain.cmake

加载完文件之后它会显示加载配置内容,还会在输出窗口输出是否配置成功消息,配置成功后找到

OPENCV_EXTRA_MODULES_PATH      设置值:  D:\Android\opencv_contrib-3.3.1\modules

此时要检查一下ABI 架构 和 API版本是否对得上,是否有其它输出错误,根据提示修改,大多数错误出现在环境配置上,没问题会输出

Configuring done

没问题后点击 Generate 开始生成配置文件,生成成功后会在输出窗口输出配置成功

Configuring done

Generating done

三、开始编译

1. 从命令行 cmd 进入到opencv 编译输出目录,就是在第2 设置的目录

cd  D:\Android\opencv-3.3.1\platforms\android\build_android

mingw32-make             (这个过程大概需要40多分钟)

mingw32-make install

到此编译完成,生成的库文件在 

D:\Android\opencv-3.3.1\platforms\android\build_android\install\sdk\native\libs

native 整个目录就是我们需要的。

2.一些可能遇到的问题处理

   1.) 找不到 xxx.i 之类的文件,它的临时文件在.cache/xfeatures2d/boostdesc 目录下,将所有的xxx.i 文件复制到D:\Android\opencv_contrib-3.3.1\modules\xfeatures2d\src 并去掉前缀名

Android开发--Opencv for android cmake编译_第3张图片

再次 mingw32-make 如果还提示在  找不到xxx.i 用同样的方法把 .cache\xfeatures2d\vgg\xxx.i 复制文件去掉前缀名到 D:\Android\opencv_contrib-3.3.1\modules\xfeatures2d\src

四、引入到项目

1.所有编译不同ABI架构的文件合并在一起,

Android开发--Opencv for android cmake编译_第4张图片

2. 在项目 CMakeLists.txt 文件中开始引入库,添加如下:

#设置OpenCV-android-sdk路径

#set(OpenCV_DIR D:/Android/opencv-3.3.1-android-sdk/OpenCV-android-sdk/sdk/native/jni)

set(OpenCV_DIR D:/Android/opencv-3.3.1-sdk-api26/OpenCV-android-sdk/sdk/native/jni)

find_package(OpenCV REQUIRED)

if(OpenCV_FOUND)

include_directories(${OpenCV_INCLUDE_DIRS})

message(STATUS "OpenCV library status:")

message(STATUS "    version: ${OpenCV_VERSION}")

message(STATUS "    libraries: ${OpenCV_LIBS}")

message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

else(OpenCV_FOUND)

message(FATAL_ERROR "OpenCV library not found")

endif(OpenCV_FOUND)

在 target_link_libraries 节点添加依赖库

target_link_libraries( # Specifies the target library.

native-lib

${OpenCV_LIBS}

jnigraphics

# Links the target library to the log library

# included in the NDK.

${log-lib} )

其中 ${OpenCV_LIBS}   jnigraphics  是新添加的 jnigraphics库是JNI接口库

这里只使用到自动生成的 native-lib.cpp,所以没有添加新的 lib。如果有新 .cpp,需要在添加add_library 节点,find_library 节点 target_link_libraries 中添加,

在项目主函数类 要引入静态库(MainActivity.java)

// Used to load the 'native-lib' library on application startup.

static {

System.loadLibrary("native-lib");

// 有多个cpp 就要引入多个,或者其它静态库

// System.loadLibrary("libopencv_java3");

}

其它的可以参考 JNI 和 NDK 开发流程,有错误请指正,我修改,

我这里参考了如下作者的文章:

http://blog.csdn.net/Linux1s1s/article/details/77851924

https://incrustationblog.wordpress.com/2017/04/20/build-opencv4android-with-non-free-modules/

http://blog.csdn.net/martin20150405/article/details/53284442

http://blog.csdn.net/lj402159806/article/details/69049587

你可能感兴趣的:(Android开发--Opencv for android cmake编译)