文章目录[x]

1:尝试接入Opencv Android SDK

2:寻找问题

3:解决方法

为了在AOSP的Hal层相机添加图片处理的一些功能。我尝试接入OpenCV 4.5.1来实现该功能,本文将介绍接入过程中所遇到的坑和对应的解决方法。

尝试接入Opencv Android SDK

首先,我尝试接入4.5.1版本的Android SDK版本,需要将SDK包下的arm32位动态库和arm64位动态库添加到AOSP的模块中。首先在vendor目录下对应厂商的目录下创建libs目录,并在libs目录下定义libopencv_java4模块,具体目录结构如下:

- vendor

- mediatek (联发科)

- libs

- libopencv_java4

- Android.mk

- arm32

- libopencv_java4.so

- arm64

- libopencv_java4.so

Android.mk的定义如下:

LOCAL_PATH := $(my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE = libopencv_java4.so

LOCAL_MODULE_CLASS = SHARED_LIBRARIES

LOCAL_MODULE_OWNER = mtk

LOCAL_MODULE_SUFFIX = .so

LOCAL_MODULE_TAGS = optional

LOCAL_MULTILIB = 64

LOCAL_SRC_FILES_64 = arm64/$(LOCAL_MODULE).so

LOCAL_MODULE_PATH_64 = $(TARGET_OUT_VENDOR)/lib64

include $(BUILD_PREBUILT)

include $(CLEAR_VARS)

LOCAL_MODULE = libopencv_java4.so

LOCAL_MODULE_CLASS = SHARED_LIBRARIES

LOCAL_MODULE_OWNER = mtk

LOCAL_MODULE_SUFFIX = .so

LOCAL_MODULE_TAGS = optional

LOCAL_MULTILIB = 32

LOCAL_SRC_FILES_32 = arm32/$(LOCAL_MODULE).so

LOCAL_MODULE_PATH_32 = $(TARGET_OUT_VENDOR)/lib

include $(BUILD_PREBUILT)

然后在对应厂商的device.mk下添加如下代码来将该模块包含到产品里:

#在打包vendor.img前将32位动态库和64位动态库拷贝到 vendor/lib目录和vendor/lib64目录下

PRODUCT_COPY_FILES += vendor/mediatek/libs/libopencv_java4/arm32/libopencv_java4.so:$(TARGET_COPY_OUT_VENDOR)/lib/libopencv_java4.so:mtk

PRODUCT_COPY_FILES += vendor/mediatek/libs/libopencv_java4/arm64/libopencv_java4.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libopencv_java4.so:mtk

#把该模块添加到产品中

PRODUCT_PACKAGES += libopencv_java4

在需要使用的模块下,导入opencv的头文件和libopencv_java4动态库模块,然后在cpp文件中使用opencv的库函数:

#将头文件放入include文件夹下

LOCAL_C_INCLUDES += include

#添加动态库依赖

LOCAL_SHARED_LIBRARIES += libopencv_java4

当以为一切完美无缺并在mm编译该模块时,出现了如下错误信息:

undefined reference to 'cv::imwrite(std::__1::basic_string, std::__1::allocator > const&, cv::_InputArray const&, std::__1::vector > const&)'

寻找问题

在上面提到的编译问题中,可以看到在链接opencv的动态库时不能在动态库中寻找到指定的函数。可以知道,AOSP在编译时是用的是libc++的标准库,而libc++的标志库字符串的命名空间是std::__1::basic_string开头的,当用nm命令查看opencv库中记录的符号名称却如下:

nm -D libopencv_java4.so | c++filt | grep imwrite

00000000001f108c T Java_org_opencv_imgcodecs_Imgcodecs_imwrite_10

00000000001f12c0 T Java_org_opencv_imgcodecs_Imgcodecs_imwrite_11

00000000001f14ec T Java_org_opencv_imgcodecs_Imgcodecs_imwritemulti_10

00000000001f17bc T Java_org_opencv_imgcodecs_Imgcodecs_imwritemulti_11

000000000080429c T cv::imwrite(std::__ndk1::basic_string, std::__ndk1::allocator > const&, cv::_InputArray const&, std::__ndk1::vector > const&)

可以看到,opencv的动态库的符号却是std::__ndk1::basic_string开头,因为符号不一致,这肯定链接不上。既然opencv和AOSP模块都是用的libc++去编译的,为什么两者都不一致呢。

将google官网下载的ndk解压后(在AOSP的prebuilts/ndk中也可以找到),在r13/sources/cxx-stl/llvm-libc++/include/__config下可以找到如下代码:

#define _LIBCPP_ABI_VERSION 1

...

#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__ndk,_LIBCPP_ABI_VERSION)

标准的llvm-libc++的__config定义如下:

#define _LIBCPP_ABI_VERSION 1

...

#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION)

从上面的对比,可以看出,谷歌在ndk中集成libc++时对其部分代码进行了修改。而opencv交叉编译出的so库是用的ndk中的libc++,所以其命名空间是std::__ndk1::basic_string。

解决方法

既然找出了问题,就需要找出解决办法,我们可以在opencv 的release页面下下载对应版本的源码,然后编写Android.mk放到AOSP中和用到的模块一起进行编译。不了解opencv的源码?谷歌官方已经集成了opencv 3.00的版本,你只需要将其目录下的Android.mk中每个模块的LOCAL_NDK_STL_VARIANT和LOCAL_SDK_VERSION注释掉(因为是c++编写,所以也需要把libopencv_java模块去掉),然后mm就可以用标准的llvm-libc++编译出动态库。然后将各个模块添加到device.mk中,然后在使用的模块中引入该模块就行了。

android hal层编译,Android Hal层接入Opencv(踩坑篇)相关推荐

  1. 百度android 定位返回161,重拾百度定位之踩坑篇(下)

    接上文 实现BDLocationListener接口 /***** * 定位结果回调,重写onReceiveLocation方法 * */ private BDLocationListener mLi ...

  2. vantUI 弹出层(轻提示)案例 - 踩坑篇

    vantUI 弹出层(轻提示)- 踩坑篇 可自定义项: 显示时长 显示内容 显示何时消失 代码 · 实例: if(this.checkedAgreement == false){this.$toast

  3. Android 获取短信验证码并自动填充(踩坑小米、荣耀、OPPO、华为)

    Android 获取短信验证码并自动填充(踩坑小米.荣耀.OPPO) 前言 最近弄了个短信自动填充功能,一开始觉得很简单,不就是动态注册个广播接收器去监听短信消息不就可以了吗?结果没这么简单,问题就出 ...

  4. phpcmsV9 QQ接入 - 线下phpsso应用管理 - 踩坑篇

    phpcmsV9 QQ接入 - 线下phpsso应用管理 - 踩坑篇 对于"phpsso"–> "应用管理"–> 无法登录和设置. 发现1: 本地的 ...

  5. Konga面板接入LDAP踩坑实战

    Konga面板接入LDAP踩坑实战 基于docker-compose构建konga面板,脚本内容如下: docker-compose.yml version: '3.7'services:konga: ...

  6. [Android Pro] ant 编译android工程

    参考文章: http://blog.csdn.net/xyz_lmn/article/details/7268582?reload http://hubingforever.blog.163.com/ ...

  7. Android 使用Ant编译Android 工程

    如何编译Android 工程? 关于如何编译Android 工程在这篇官方文档这里中解释的比较清楚, 太多的详细的解释我就不说了,RTFM. 我需要说的是我们既可以让IDE替你完成编译的编译工作,也可 ...

  8. android 关闭jack_编译Android时禁用Jack Server

    编译Android时禁用Jack Server 2017-07-24 15:29:43 +08 字数:818 标签: Android 本文的代码与方法,基于Android O(8.0). 简介 ¶ J ...

  9. android studio ant编译,Android Studio编译cocos2dx项目

    一.所需工具 1.Android studio2.3 2.cocos2dx3.10 3.jdk1.8 4.ndkr9d 5.sdk 6.ant 7.python2.7.14 二.配置环境变量 1.sd ...

  10. android:自己动手编译Android源码(超详细)

    自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 4330 阅读 86819评论 89喜欢 339赞赏 7 在Android Studio代码调试一文中 ...

最新文章

  1. 自从用完 Gradle 后,有点嫌弃 Maven 了!
  2. P6378-[PA2010]Riddle【2-SAT】
  3. Go 每日一库之 zap
  4. 如果使用Node.js不存在该如何创建目录?
  5. pthread_join pthread_exit 线程 Linux函数 线程退出 线程等待
  6. Oracle 存储过程、存储函数 与原生 JDBC 调用
  7. QEMU学习笔记——QOM(Qemu Object Model)
  8. 显示器刷新率测试软件144,【显示器】为什么“吃鸡”要选144Hz显示器?详解高刷新率显示器对FPS游戏的重要影响...
  9. javascript 验证 国际格式 电话号码
  10. 南京20年房价变迁史:别人在买房,你在干什么?
  11. HUSTOJ超级详细部署文档
  12. 修改Worldpress主题的Footer/Header部分
  13. 依赖背包dp NOIP2006 vijos 1313 金明的预算方案
  14. 使用 git add -p 整理 patch
  15. 4K显示器和防蓝光眼镜膜
  16. 青龙面板-快手极速版(每天3块脚本)
  17. 利用bat批处理做启动mongodb脚本
  18. 微软云计算产品详解 主打Windows
  19. 最新版YOLOv6训练自己的数据集(超详细完整版!)
  20. 建群网培PMP每日一练2020-7-29

热门文章

  1. 跑赢业务的同时如何实现技术成长? | 凌云时刻
  2. 数据湖生态联盟正式成立
  3. mysql实现了四种通信协议_MySQL 通信协议
  4. vscode主题_VScode霓虹发光主题SynthWave 84|透明主题
  5. 【图像融合】基于matlab GUI小波变换彩色图像融合(含评价指标)【含Matlab源码 1756期】
  6. 【单目标优化求解】基于matlab多阶段动态扰动和动态惯性权重布谷鸟算法求解单目标优化问题【含Matlab源码 1656期】
  7. 【水果识别】基于matalb GUI水果分类系统【含Matlab源码 174期】
  8. 【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】
  9. SPSS 简单线性回归(图文+数据集)【SPSS 025期】
  10. python中单词个数_python 统计单词个数