【Android】Android 源码方式使用 opencv 库文件
使用方法
opencv 官方的 SDK 已经有编译好的 so 库,我们可以直接使用,因此我们只需要将平台架构对应的 so 库文件以及头文件提取出来,使用 Android.mk 进行预安装,然后在需要使用 opencv 程序中的 Android.mk 引用头文件和动态链接库即可。
具体步骤
一、下载 opencv sdk 并解压(我这里以 3.4.11 为例)
下载链接1:https://opencv.org/releases/
下载链接2:https://udomain.dl.sourceforge.net/project/opencvlibrary/3.4.11/opencv-3.4.11-android-sdk.zip

二、提取相应的文件放置在Android源码指定的路径中,并编写 Android.mk 文件
1. 在 Android 源码中的 external 目录下创建 opencv_3.4.11 文件夹,并在 opencv_3.4.11 文件再创建 library 文件夹。
2. 将 opencv-3.4.11-android-sdk\OpenCV-android-sdk\sdk\native\libs 下面的 armeabi、armeabi-v7a、arm64-v8a 拷贝到 external\opencv_3.4.11\library(可以只拷贝适合所使用CPU架构的文件夹)
3. 在该目录下创建 Android.mk 并写入以下内容:(根据所使用的平台来选择用哪一段)
LOCAL_PATH := $(call my-dir)
# 第5代、第6代的ARM处理器
#include $(CLEAR_VARS)
#LOCAL_MODULE := libopencv_java3
#LOCAL_SRC_FILES := library/armeabi/libopencv_java3.so
#LOCAL_MODULE_CLASS := SHARED_LIBRARIES
#LOCAL_MODULE_SUFFIX := .so
#include $(BUILD_PREBUILT)
# 第7代的32位ARM 处理器
include $(CLEAR_VARS)
LOCAL_MODULE := libopencv_java3
LOCAL_SRC_FILES := library/armeabi-v7a/libopencv_java3.so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
include $(BUILD_PREBUILT)
# 第8代的64位ARM处理器
#include $(CLEAR_VARS)
#LOCAL_MODULE := libopencv_java3
#LOCAL_SRC_FILES := library/arm64-v8a/libopencv_java3.so
#LOCAL_MODULE_CLASS := SHARED_LIBRARIES
#LOCAL_MODULE_SUFFIX := .so
#include $(BUILD_PREBUILT)
4. 使用 mm 命令编译即可(我这里就不贴出来了),目录结构如下:

三、编写测试应用程序进行测试
Android.mk
###################### 全局定义 ########################
LOCAL_PATH:= $(call my-dir)
COMMON_C_INCLUDES_FILES := bionic external/stlport/stlport
COMMON_SHARED_LIBRARIES := libc libstlport libutils liblog libcutils libskia libandroid_runtime
COMMON_LOCAL_CFLAGS := -fstack-protector-all -fomit-frame-pointer -Depl_LINUX
COMMON_LOCAL_CPPFLAGS := -std=c++11
OPENCV_SHARED_LIBRARIES := libopencv_java3
OPENCV_C_INCLUDES_FILES := external/opencv_3.4.11/include
###################### 编译 Exe ########################
include $(CLEAR_VARS)
# 引入公共库
LOCAL_C_INCLUDES := $(COMMON_C_INCLUDES_FILES) $(OPENCV_C_INCLUDES_FILES)
LOCAL_SHARED_LIBRARIES := $(COMMON_SHARED_LIBRARIES) $(OPENCV_SHARED_LIBRARIES)
LOCAL_CFLAGS := $(COMMON_LOCAL_CFLAGS)
#LOCAL_CPPFLAGS := $(COMMON_LOCAL_CPPFLAGS)
LOCAL_LDLIBS += -llog -lz -lm
LOCAL_SRC_FILES := bin/main.cpp
LOCAL_MODULE_TAGS := debug eng
LOCAL_MODULE := opencv_test
include $(BUILD_EXECUTABLE)
mian.cpp
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define CV_CXX_STD_ARRAY 0
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp" //OpenCV 图像处理头文件
using namespace cv; // 包含 cv 命名空间
using namespace std;
int main()
{
// 读取图片
Mat src = imread("/data/1.jpg", 1);
Mat dst;
// 彩色转为灰度图片
cvtColor(src,dst,CV_BGR2GRAY);
imwrite("/data/2.jpg",dst);
src.release();
dst.release();
return 0;
}
编译完成之后,记得要将 libopencv_java3.so 通过 adb push 到设备的 /system/lib/ 目录下,如果编译整个固件烧录就不需要了。
四、转换效果


过程问题
一、array头文件找不到问题:include/opencv2/core/cvdef.h:639:21: fatal error: array: No such file or directory


从编译错误信息和 cvdef.h 源码位置,是因为没有定义 CV_CXX_STD_ARRAY 宏,而包含了 <array> 头文件,由于 Android 源码对 C++ 标准库支持的不是很好,我也花了不少时间去寻找相关资料,暂时未能找到更好的办法,因此我这边的解决方案就是在应用程序包含 opencv 头文件前,先定义 CV_CXX_STD_ARRAY 宏,并设置该宏为 0,使之不走包含 array 头文件的路径。
......
#define CV_CXX_STD_ARRAY 0 // 解决编译时报找不到 array 头文件的错误
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
......
二、initializer_list 头文件找不到的问题:include/opencv2/core/matx.hpp:57:28: fatal error: initializer_list: No such file or directory


这个问题也是一样的,只需要将 Android.mk 中的 LOCAL_CPPFLAGS 变量取消掉 -std=c++11 即可。
###################### 全局定义 ########################
LOCAL_PATH:= $(call my-dir)
......
COMMON_LOCAL_CPPFLAGS := -std=c++11
......
###################### 编译 Exe ########################
include $(CLEAR_VARS)
......
# 注释或者删除下面这一句
#LOCAL_CPPFLAGS := $(COMMON_LOCAL_CPPFLAGS)
......
include $(BUILD_EXECUTABLE)
上面的编译报错的这两个问题,都应该与 opencv 本身没有关系,猜测应该是跟 Android 4.4 源码对 C++ 支持不够全的问题,很早之前我就发现 Android 源码去编译自己在 Linux 可以正常编译的 C++ 源代码,就会报很多和上述两个问题类似的缺失头文件错误。虽然源码中搜索能找到 array 头文件定义,但是却不能直接引用,苦寻不得其果,无奈暂且放下。若能解决的话,在 Android 不受限制的使用 C++ 写的源代码,还是非常爽的。
【Android】Android 源码方式使用 opencv 库文件的更多相关文章
- 源码方式安装 lrzsz库
源码方式安装 lrzsz库:https://www.cnblogs.com/cocoajin/p/11731787.html 我们都知道安装了lrzsz工具的linux系统环境,在shell里可以非常 ...
- 源码方式安装 lrzsz 库
我们都知道安装了lrzsz工具的linux系统环境: 在shell里可以非常方便的上传和下载linux里面的文件: 通常的安装方式: yum install lrzsz sudo apt-get in ...
- 树莓派学习笔记—— 源码方式安装opencv
0.前言 本文介绍怎样在树莓派中通过编译源码的方式安装opencv,并通过一个简单的样例说明怎样使用opencv. 很多其它内容请參考--[树莓派学习笔记--索引博文] 1.下载若干依 ...
- 树莓派学习:源码方式安装opencv
1:下载若干依赖项: 更新软件源:sudo apt-get update/upgrade; 依次安装一下依赖项: sudo apt-get install build-essential su ...
- 【转】编译Android系统源码和内核源码
原文网址:http://blog.csdn.net/jiangwei0910410003/article/details/37988637 好长时间没有写blog了,之所以没有写,主要还是工作上的事, ...
- FW 编译Android系统源码和内核源码
编译Android系统源码和内核源码 分类: Android2014-07-21 20:58 7287人阅读 评论(28) 收藏 举报 好长时间没有写blog了,之所以没有写,主要还是工作上的事,发现 ...
- 又来一波!Android精品源码分享
今天又汇总了几个不错的源码给大家!希望能帮到需要的小伙伴~话不多少,直接上源码! 1.Android精品源码:拖动条控件实现源码 此次分享的源码是一个不错的Android控件,建议大家可以细致的看下. ...
- 将Android系统源码导入Android studio的方法
Android源码目录结构如下: |-- Makefile|-- abi (applicationbinary interface,应用程序二进制接口,生成libgabi++.so相关库文件)|-- ...
- Android FrameWork 学习之Android 系统源码调试
这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...
- 编译Android系统源码和内核源码
[日期:2016-01-11] 来源:Linux社区 作者:jiangwei [字体:大 中 小] 把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...
随机推荐
- 配置jmeter环境变量
好记性不如烂笔头. 本文采用jmeter5.4.1版本. 1. Linux系统 1.1 将jmeter上传到安装目录并解压 jmeter5.4.1链接: https://pan.baidu.com/ ...
- Go语言核心36讲22
你好,我是郝林,今天我们继续来分享错误处理. 在上一篇文章中,我们主要讨论的是从使用者的角度看"怎样处理好错误值".那么,接下来我们需要关注的,就是站在建造者的角度,去关心&quo ...
- windows每日定时计划任务
若要计划安全脚本 ,Sec.vbs,每天在下午 5:00 到上午 7:59 之间每隔 100 分钟在本地计算机上运行一次,请键入: schtasks /create /tn Security Scri ...
- 【DL论文精读笔记】ResNet
Abstract 利用残差学习架构释放深度 152层深度是VGG的8倍,且复杂度更低 ImageNet上的错误率3.57% 在ILSVRC和2015COCO竞赛,在多项任务拿到第一 3.1 Intro ...
- 你认识的C# foreach语法糖,真的是全部吗?
本文的知识点其实由golang知名的for循环陷阱发散而来, 对应到我的主力语言C#, 其实牵涉到闭包.foreach.为了便于理解,我重新组织了语言,以倒叙结构行文. 先给大家提炼出一个C#题:观察 ...
- Android网络请求(终) 网络请求框架Retrofit
Android网络请求(终) 网络请求框架Retrofit Retrofit底层是由OkHttp封装的,Retrofit对于注解的使用十分频繁,所以不了解注解的同学们可以去查查资料什么的. 这里有一个 ...
- 更改grub2背景图片
在/etc/grub/default这里面修改东西然后update-grub来间接修改/boot/grub/grub.cfg中的内容 1.将png图片放进/boot/grub/目录下 2.update ...
- 解决"raise EnvironmentError("%s not found" % (_mysql_config_path,)) OSError: mysql_config not found"报错
redhat系(如centos) yum install mysql-devel debain系(如ubuntu) sudo apt-get install libmysqlclient-dev
- question(The hierarchy of the type MyServlet is inconsistent)——解决tomcat重新添加依赖
在保存代码时突然出现类似于tomcat不能正常使用的警告弹窗,在eclipse中删除tomcat依赖之后,按照以下步骤先在eclipse添加依赖 1.eclipse项目中添加tomcat依赖 wind ...
- 单一JVM同步锁实现
同步锁实现 一.背景 在并发场景下,需要单一线程或限定并发数操作某些逻辑,这时候就需要用到一个锁来保证线程安全. 二.思路 使用ConcurrentHashMap实现,但只支持同一个jvm下的线程(暂 ...