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 解压

二、编译前设置

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容