android hal层编译,Android Hal层接入Opencv(踩坑篇)
文章目录[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(踩坑篇)相关推荐
- 百度android 定位返回161,重拾百度定位之踩坑篇(下)
接上文 实现BDLocationListener接口 /***** * 定位结果回调,重写onReceiveLocation方法 * */ private BDLocationListener mLi ...
- vantUI 弹出层(轻提示)案例 - 踩坑篇
vantUI 弹出层(轻提示)- 踩坑篇 可自定义项: 显示时长 显示内容 显示何时消失 代码 · 实例: if(this.checkedAgreement == false){this.$toast
- Android 获取短信验证码并自动填充(踩坑小米、荣耀、OPPO、华为)
Android 获取短信验证码并自动填充(踩坑小米.荣耀.OPPO) 前言 最近弄了个短信自动填充功能,一开始觉得很简单,不就是动态注册个广播接收器去监听短信消息不就可以了吗?结果没这么简单,问题就出 ...
- phpcmsV9 QQ接入 - 线下phpsso应用管理 - 踩坑篇
phpcmsV9 QQ接入 - 线下phpsso应用管理 - 踩坑篇 对于"phpsso"–> "应用管理"–> 无法登录和设置. 发现1: 本地的 ...
- Konga面板接入LDAP踩坑实战
Konga面板接入LDAP踩坑实战 基于docker-compose构建konga面板,脚本内容如下: docker-compose.yml version: '3.7'services:konga: ...
- [Android Pro] ant 编译android工程
参考文章: http://blog.csdn.net/xyz_lmn/article/details/7268582?reload http://hubingforever.blog.163.com/ ...
- Android 使用Ant编译Android 工程
如何编译Android 工程? 关于如何编译Android 工程在这篇官方文档这里中解释的比较清楚, 太多的详细的解释我就不说了,RTFM. 我需要说的是我们既可以让IDE替你完成编译的编译工作,也可 ...
- android 关闭jack_编译Android时禁用Jack Server
编译Android时禁用Jack Server 2017-07-24 15:29:43 +08 字数:818 标签: Android 本文的代码与方法,基于Android O(8.0). 简介 ¶ J ...
- 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 ...
- android:自己动手编译Android源码(超详细)
自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 4330 阅读 86819评论 89喜欢 339赞赏 7 在Android Studio代码调试一文中 ...
最新文章
- 自从用完 Gradle 后,有点嫌弃 Maven 了!
- P6378-[PA2010]Riddle【2-SAT】
- Go 每日一库之 zap
- 如果使用Node.js不存在该如何创建目录?
- pthread_join pthread_exit 线程 Linux函数 线程退出 线程等待
- Oracle 存储过程、存储函数 与原生 JDBC 调用
- QEMU学习笔记——QOM(Qemu Object Model)
- 显示器刷新率测试软件144,【显示器】为什么“吃鸡”要选144Hz显示器?详解高刷新率显示器对FPS游戏的重要影响...
- javascript 验证 国际格式 电话号码
- 南京20年房价变迁史:别人在买房,你在干什么?
- HUSTOJ超级详细部署文档
- 修改Worldpress主题的Footer/Header部分
- 依赖背包dp NOIP2006 vijos 1313 金明的预算方案
- 使用 git add -p 整理 patch
- 4K显示器和防蓝光眼镜膜
- 青龙面板-快手极速版(每天3块脚本)
- 利用bat批处理做启动mongodb脚本
- 微软云计算产品详解 主打Windows
- 最新版YOLOv6训练自己的数据集(超详细完整版!)
- 建群网培PMP每日一练2020-7-29
热门文章
- 跑赢业务的同时如何实现技术成长? | 凌云时刻
- 数据湖生态联盟正式成立
- mysql实现了四种通信协议_MySQL 通信协议
- vscode主题_VScode霓虹发光主题SynthWave 84|透明主题
- 【图像融合】基于matlab GUI小波变换彩色图像融合(含评价指标)【含Matlab源码 1756期】
- 【单目标优化求解】基于matlab多阶段动态扰动和动态惯性权重布谷鸟算法求解单目标优化问题【含Matlab源码 1656期】
- 【水果识别】基于matalb GUI水果分类系统【含Matlab源码 174期】
- 【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】
- SPSS 简单线性回归(图文+数据集)【SPSS 025期】
- python中单词个数_python 统计单词个数