Android15 Camera HAL Android.bp中引用Android.mk编译的libB.so

背景描述
Android15 Camera HAL使用Android.bp脚本来构建系统。假设Camera HAL中引用了另外一个HAL实现的so (例如VPU HAL), 恰巧被引用的这个VPU HAL so是用Android.mk构建的,那Camera HAL Android.bp在直接引用这个Android.mk编译出来的so时很可能会出现链接问题。
那么这时候有啥曲线救国方法能让Camera HAL Android.bp成功引用这个VPU HAL so吗?
先说第一个方案:
- VPU HAL so改Android.mk编译为Android.bp,然后生成lib/libvpu_pv.so和lib64/libvpu_pv.so。
- Camera HAL路径下建一个目录放要引用的so和头文件。
- Camera HAL Android.bp中添加vpu so的预编译目标。
- Camera HAL Android.bp中添加对vpu引用。
注意:VPU HAL Android.mk和Android.bp编译出来的so符号要避免冲突。
VPU HAL Android.bp构建so
cc_library_shared {name: "libarm_vpu_jpegenc_wr",vendor: true,srcs: [vpu_wrapper/encoder/jpeg_encoder_wrap/arm_jpeg_encoder.c",],include_dirs: ["vendor/qc/hardware/modules/vpu/libs/inc","vendor/qc/hardware/modules/vpu/wrapper/encoder/jpeg_enc",],static_libs: ["libh2enc",],header_libs: ["libhardware_headers","arm_gralloc_headers",],shared_libs: ["libcutils","libc","liblog","libcutils",],defaults: ["memory_allocator_defaults",],export_include_dirs: ["vendor/qc/hardware/modules/vpu/wrapper/encoder/jpeg_enc",],
}
这里将生成vendor/lib/libarm_vpu_jpegenc_wr.so和vendor/lib64/libarm_vpu_jpegenc_wr.so。
vpu so放到Camera HAL
这里如下放置:vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/ext_lib/lib/libarm_vpu_jpegenc_wr.so
vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/ext_lib/lib64/libarm_vpu_jpegenc_wr.so
vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/ext_inc/arm_vpu_jpegenc_wr.h
Camera HAL添加vpu预编译目标
cc_prebuilt_library_shared {name "libarm_vpu_jpegenc_wr",vendor: true,strip: { none: true },compile_multilib: "both",arch: {arm: {srcs: ["ext_lib/lib/libarm_vpu_jpegenc_wr.so"],relative_install_path: ".",},arm64: {srcs: ["ext_lib/lib64/libarm_vpu_jpegenc_wr.so"],relative_install_path: ".",},},shared_libs: ["libutils","liblog","libcutils","libdmabufheap",],
}
Camera HAL中添加对vpu的引用
//主要是两个内容:头文件路径和so应用
...
xx {...shared_libs: [..."libarm_vpu_jpegenc_wr",],include_dirs: [..."vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/ext_inc",],...
}
可能遇到的问题
out/soong/.intermediates/vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/libarm_vpu_jpegenc_wr/android_vendor.35_arm64_armv8-a_shared/libarm_vpu_jpegenc_wr.so: error: DT_NEEDED "libutils.so" is not specified in shared_libs.
问题原因
-
DT_NEEDED:
是 ELF 文件(共享库)中的一个字段,用于指定该库依赖的其他共享库。加载器会根据DT_NEEDED动态加载依赖库。 -
库文件
libarm_vpu_jpegenc_wr.so依赖libutils.so,但在Android.bp的shared_libs中未声明该依赖。
解决方法
在Android.bp中添加缺失的依赖,对于这里的例子,就是:
out/soong/.intermediates/vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/libarm_vpu_jpegenc_wr/android_vendor.35_arm_armv8-a_shared/libarm_vpu_jpegenc_wr.so: error: DT_SONAME "libarm_vpu_jpegenc.so" must be equal to the file name "libarm_vpu_jpegenc_wr.so".
问题的原因
-
DT_SONAME:
是 ELF 文件(共享库)中的一个字段,用于指定动态链接时的库名称。加载器会根据DT_SONAME查找库文件。 -
库文件
libarm_vpu_jpegenc_wr.so的DT_SONAME被设置为libarm_vpu_jpegenc.so,而 Android 构建系统要求DT_SONAME必须与库文件名一致。
Camera HAL Android.bp中cc_prebuilt_library_shared libarm_vpu_jpegenc_wr, 构建的src虽然是libarm_vpu_jpegenc_wr.so, 单这个so构建脚本(VPU HAL Android.bp)中cc_library_shared 是arm_vpu_jpegenc。 即DT_SONAME需要和库文件名不一致。
解决方法
修改VPU HAL Android.bp cc_library_shared目标名为libarm_vpu_jpegenc_wr。
相关文章:
Android15 Camera HAL Android.bp中引用Android.mk编译的libB.so
背景描述 Android15 Camera HAL使用Android.bp脚本来构建系统。假设Camera HAL中引用了另外一个HAL实现的so (例如VPU HAL), 恰巧被引用的这个VPU HAL so是用Android.mk构建的,那Camera HAL Android.bp在直接引用这个Android.mk编…...
P8720 [蓝桥杯 2020 省 B2] 平面切分--set、pair
P8720 [蓝桥杯 2020 省 B2] 平面切分--set、pair 题目 分析一、pair1.1pair与vector的区别1.2 两者使用场景两者组合使用 二、set2.1核心特点2.2set的基本操作2.3 set vs unordered_set示例:统计唯一单词数代码 题目 分析 大佬写的很明白,看这儿 我讲讲…...
postgresql源码学习(60)—— VFD的作用及机制
首先VFD是Virtual File Descriptor,即虚拟文件描述符,既然是虚拟的,一定先有物理的。 一、 物理文件描述符(File Descriptor, FD) 1. 什么是 FD 它是操作系统提供给用户程序访问和操作文件或其他 I/O 资源的抽象接口…...
【CSS—前端快速入门】CSS 选择器
CSS 1. CSS介绍 1.1 什么是CSS? CSS(Cascading Style Sheet),层叠样式表,用于控制页面的样式; CSS 能够对网页中元素位置的排版进行像素级精确控制,实现美化页面的效果;能够做到页面的样式和 结构分离; 1…...
Linux安装jdk,node,mysql,redis
准备工作: 1.安装VMware软件,下载CentOs7镜像文件,在VMware安装CentOs7 2.宿主机安装Xshell用来操作linux 3. .宿主机安装Xftp用来在宿主机和虚拟机的linux传输文件 案例1:在 /home/soft文件夹解压缩jdk17,并配置环…...
深度求索(DeepSeek)的AI革命:NLP、CV与智能应用的技术跃迁
Deepseek官网:DeepSeek 引言:AI技术浪潮中的深度求索 近年来,人工智能技术以指数级速度重塑全球产业格局。在这场技术革命中,深度求索(DeepSeek)凭借其前沿的算法研究、高效的工程化能力以及对垂直场景的…...
Minio搭建并在SpringBoot中使用完成用户头像的上传
Minio使用搭建并上传用户头像到服务器操作,学习笔记 Minio介绍 minio官网 MinIO是一个开源的分布式对象存储服务器,支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发,拥有轻量级、高性能、易部署等特点,并且可以自由…...
【鸿蒙Next】 测试包 签名、打包、安装 整体过程记录
签名打包记录: HarmonyOS应用签名、打Hap包、Hap调试包真机安装步骤 https://blog.csdn.net/qq_34462735/article/details/135226332 测试包真机安装方式二 DevEco Testing 鸿蒙应用示例:DevEco Testing 工具的常用功能及使用场景 https://blog.csd…...
阿里云 | 快速在网站上增加一个AI助手
创建智能体应用 如上所示,登录阿里云百炼人工智能业务控制台,创建智能体应用,智能体应用是一个agent,即提供个人或者企业的代理或中间件组件应用,对接阿里云大模型公共平台,为个人或者企业用户提供大模型应…...
Raspberry Pi边缘计算网关设计与LoRa通信实现
Raspberry Pi边缘计算网关设计与LoRa通信实现 摘要第一章 绪论1.1 研究背景1.2 研究现状1.3 论文结构 第二章 相关技术理论2.1 边缘计算体系架构2.2 LoRa通信技术2.3 Raspberry Pi硬件生态 第三章 系统架构设计3.1 硬件架构设计3.2 软件架构设计3.3 混合通信协议设计 第四章 硬…...
原型链与继承
#搞懂还是得自己动手# 原型链 function Person(name) { this.name name; } Person.prototype.sayName function() { console.log(this.name); };const p new Person("Alice"); 原型链关系图: 原型链:person->Person.prototype->O…...
动态规划 ─── 算法5
动态规划(Dynamic Programming,简称 DP)是一种用于解决复杂问题的算法设计技术,特别适用于具有重叠子问题和最优子结构性质的问题。动态规划通过将问题分解为更小的子问题,并存储子问题的解来避免重复计算,…...
博客系统--测试报告
博客系统--测试报告 项目背景项目功能功能测试①登录功能测试②发布博客功能测试③删除文章功能测试④功能测试总结: 自动化测试自动化脚本执行界面: 性能测试 本博文主要针对个人实现的项目《博客系统》去进行功能测试、自动化测试、性能测试࿰…...
【博资考4】网安学院-硕转博考试内容
【博资考4】硕转博考试内容 - 网络安全与基础理论 写在最前面一. **21年硕转博面试内容回顾**网络、逆向、操作系统、攻防、漏洞1. **网络安全常见攻击方式及其防范措施**1.1 **DDoS攻击(分布式拒绝服务)**1.2 **SQL注入攻击**1.3 **XSS攻击(…...
GPT-4.5 怎么样?如何升级使用ChatGPTPlus/Pro? GPT-4.5设计目标是成为一款非推理型模型的巅峰之作
GPT-4.5 怎么样?如何升级使用ChatGPTPlus/Pro? GPT-4.5设计目标是成为一款非推理型模型的巅峰之作 今天我们来说说上午发布的GPT-4.5,接下来我们说说GPT4.5到底如何,有哪些功能?有哪些性能提升?怎么快速使用到GPT-4.…...
git命令学习记录
1. git reset 参数说明 git reset 是用来回退版本的,它可以添加三个参数,常用的使用格式是这样的:git reset [--hard | --soft | --mixed] 版本号 一般使用git修改文件并提交需要三步,第一步在文本编辑器中编辑文件,也…...
【HTML学习笔记基础篇】
HTML学习笔记基础篇 一、HTML概述1.1 什么是HTML1.2 HTML文档的基本结构 二、HTML基础标签2.1 标题标签2.2 段落标签2.3 换行标签2.4 链接标签2.6 列表标签2.7 表格标签 三、HTML进阶知识3.1 行级元素与块级元素3.3 语义化标签 四、开发工具与技巧4.1 开发工具4.2 常用技巧 五、…...
DeepSeek 开源周:第五天 - Fire-Flyer 文件系统(3FS)
(下面文字主要由 Grok 3 协助生成) 概述 Deepseek 今天开源的 Fire-Flyer 文件系统(3FS)是一个高性能分布式文件系统,专门为 AI 训练和推理设计。研究表明,它解决了 AI 工作负载中处理海量数据的高效存储需…...
基于专利合作地址匹配的数据构建区域协同矩阵
文章目录 地区地址提取完成的处理代码 在专利合作申请表中,有多家公司合作申请。在专利权人地址中, 有多个公司的地址信息。故想利用这里多个地址。想用这里的地址来代表区域之间的专利合作情况代表区域之间的协同、协作情况。 下图是专利合作表的一部分…...
【AI+智造】在阿里云Ubuntu 24.04上部署DeepSeek R1 14B的完整方案
作者:Odoo技术开发/资深信息化负责人 日期:2025年2月28日 一、部署背景与目标 DeepSeek R1作为国产大语言模型的代表,凭借其强化学习驱动的推理能力,在复杂任务(如数学问题、编程逻辑)中表现优异。本地化部…...
0x02 js、Vue、Ajax
文章目录 js核心概念js脚本引入html的方式基础语法事件监听 Vuevue简介v-forv-bindv-if&v-showv-model&v-on Ajax js 核心概念 JavaScript:是一门跨平台、面向对象的脚本语言,用来控制网页行为实现交互效果,由ECMAScript、BOM、DOM…...
深入解析数据倾斜:原因、影响与优化方案
在分布式计算和大数据处理中,数据倾斜(Data Skew) 是一个常见且影响性能的难题。它可能导致某些计算节点负载过高,而其他节点资源浪费,从而影响整体吞吐量和任务执行时间。 在本文中,我们将深入分析 数据倾…...
Python Tornado 框架面试题及参考答案
目录 Tornado 框架的核心组件是什么?解释其作用。 Tornado 与其他 Python 框架(如 Django、Flask)的主要区别是什么? 为什么 Tornado 适合高并发场景?其设计哲学是什么? 解释 Tornado 的 Application 类和 RequestHandler 类的关系。 如何在 Tornado 中配置静态文件路…...
IDEA 使用codeGPT+deepseek
一、环境准备 1、IDEA 版本要求 安装之前确保 IDEA 处于 2023.x 及以上的较新版本。 2、Python 环境 安装 Python 3.8 或更高版本 为了确保 DeepSeek 助手能够顺利运行,您需要在操作系统中预先配置 Python 环境。具体来说,您需要安装 Python 3.8 或更高…...
Linux笔记---一切皆文件
1. 含义 “一切皆文件”是 Linux 对系统资源的高度抽象,通过文件接口屏蔽底层差异,提供了简洁、一致的操作方式。这种设计降低了系统复杂性,使得工具、脚本和应用程序能够以统一模式处理多样化资源,是 Linux 强大灵活性的重要基石…...
ubuntu22.04安装docker engine
在Ubuntu 22.04上安装Docker Engine可以通过以下步骤完成: 更新系统包索引: sudo apt update安装必要的依赖包: 这些包允许apt通过HTTPS使用仓库。 sudo apt install -y apt-transport-https ca-certificates curl software-properties-commo…...
DeepSeek开源周,第五弹再次来袭,3FS
Fire-Flyer 文件系统(3FS)总结: 一、核心特点 3FS 是一个专为 AI 训练和推理工作负载设计的高性能分布式文件系统,利用现代 SSD 和 RDMA 网络,提供共享存储层,简化分布式应用开发。其主要特点包括…...
RagFlow专题二、RagFlow 核心架构(数据检索、语义搜索与知识融合)
深入解析 RagFlow 核心架构:数据检索、语义搜索与知识融合 在前一篇文章中,我们对 RagFlow 的核心理念、与传统 RAG 的区别以及其适用场景进行了深入探讨。我们了解到,RagFlow 通过动态优化检索、增强生成质量以及实时知识管理,使得大模型在复杂任务中的表现更加稳定和高效…...
【音视频】VLC播放器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一、vlc是什么? VLC Media Player(简称VLC)是一款免费、开源、跨平台的多媒体播放器,由非营利组织VideoLAN开发,最…...
【软件测试】_使用selenium进行自动化测试示例
目录 1. 导入依赖 2. 使用selenium编写测试代码 3. 运行结果 4. 关于浏览器驱动管理及浏览器驱动配置 创建一个空项目用于进行selenium的自动化测试。 1. 导入依赖 <dependencies><!-- https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager…...
