一. 前期准备
不太推荐使用最新版本软件和包,它可能在版本更新当中做了大的改动,比如 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 解压
二、编译前设置
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
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 并去掉前缀名
再次 mingw32-make 如果还提示在 找不到xxx.i 用同样的方法把 .cache\xfeatures2d\vgg\xxx.i 复制文件去掉前缀名到 D:\Android\opencv_contrib-3.3.1\modules\xfeatures2d\src
四、引入到项目
1.所有编译不同ABI架构的文件合并在一起,
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