4步成功将三方库——speexdsp移植到OpenHarmony

四步实现三方库移植:

1、在Linux下编译要移植的三仓库,分析编译过程;
2、将要移植的三方库加入编译框架中以及产品引用;
3、增量编译出动态链接库和可执行文件推送到开发板上;
4、在开发板上验证移植是否成功、API接口导出。

第一步
三方库下载最新分支代码后在Linux下编译,分析编译过程。

观察原生库目录结构或者Readme可以知道该如何编译,一般有如下两种编译方式:

①在原生库根目录中,存在CMakeLists.txt文件。在原生库下新建build目录通过cmake或者cmake-gui生成makeflie然后make。

②在原生库目录中存在autogen.sh,configure.ac文件,原生库使用Makefile.am构建,./autogen.sh再./configure命令生成Makefile,最后make、make install。

在Linux下编译原生库要配置好编译环境,安装cmake、make、automake等工具。

分析编译过程:

提取编译出动态链接库和测试用的可执行文件需要的源文件和头文件、编译时添加的cflag、编译器参数以及编译需要链接的库。该过程分为如下两种情况:

①在cmake生成makefile的过程中分析build.make、depend.make、flags.make、link.txt等得出三方库对应的依赖关系。

②使用Makefile.am构建的三方库通过分析make.am内容可以直接分析编译动态链接库和测试用的可执行文件需要哪些源文件,而编译需要添加的编译器参数和需要链接的库则通过分析三方库父目录makefile文件提取。

第二步

根据第一步分析得到的结果把三方库加入OpenHarmony编译构建体系。

①定义子系统并加入编译框架。首先把三方库放置在OpenHarmony源码third_party目录下作为子系统目录。子系统目录下创建ohos.build文件,构建时会先读取该文件。

把子系统配置到build/subsystem_config.json.

②定义组件并加入子系统:在上述定义子系统时添加的ohos.build文件中,我们已经定义好了对应的组件。

module_list所定义的为该组件的目标,上述定义的目标为测试用的可执行文件。

③定义目标并加入组件:在编写gn文的时候,我们定义的动态库以及测试可执行程序都是我们的目标模块,在每个目标模块中添加对应的组件名后即将我们的目标模块加入该组件中。

④产品引用:把子系统及其组件加入产品定义中,以rk3568为例,产品定义文件存在vendor/hihope/rk3568/config.json,以下内容添加到config.json中:

第三步
增量编译出动态链接库和可执行文件,在OpenHarmony源码执行。

./build.sh --product-name rk3568 --ccache --build-target=移植的三方库名称 --target-cpu arm64(ohos更新到3.2版本后,支持64位系统的编译,默认情况下编译的都是32位系统,在编译命令中添加–target-cpu arm64即可构建64位系统)

第一次编译可能会报错,我们根据报错信息调整编写的gn文件。消除clang编译警告,例如-Wimplicit-function-declaration改为-Wno-implicit-function-declaration添加到gn文的cflags信息里面。不推荐直接全量编译出镜像烧录到开发板上。将耗费较多时间,也不便编译调试。编译成功生成的动态链接库和测试用的可执行文件在out目录下。

第四步
在开发板上验证移植是否成功、API接口导出。

利用hdc_std工具将编译出的so动态链接库和测试用的可执行文件放到开发板上,验证移植的三方库功能是否正常。

API是指应用程序编程接口,通过API接口可以实现指定的功能,而不需要了解其内部实现细节。API接口导出在pc端,需要编译生成的动态链接库和测试用的可执行文件。API接口导出思路如下:

①新建allHeads.h,该头文件中包含所有库对外导出的头文件

②新增allDySos目录,该目录下放置生成的动态库

③新增allTests目录,该目录下放置所有生成的测试用的可执行文件

④新建自动化测试脚本export_interface.sh,脚本如下,执行时需要给脚本传入编译头文件的参数例如./export_interface.sh -I头文件所在路径-D宏定义(编译所有动态库时,cflags/cflags_cc中的参数)

cxx="0":
mixed_api() {while read linedoif [ $cxx != "1" -o "$4" == "1" ];thentmp=$lineelsetmp=`echo $line | sed "s/(.*$//g" | sed "s/^.*:://g"`fires=`cat $2 |grep "$tmp" -F`if [ "$res" != "" ];thenecho "$line" >> $3fidone < $1
}

以上是部分代码展现,阅览全部代码请打开链接

再次总结四步要点:
1、在Linux下编译要移植的三仓库,分析编译过程;
2、将要移植的三方库加入编译框架中以及产品引用;
3、增量编译出动态链接库和可执行文件推送到开发板上。
4、在开发板上验证移植是否成功、API接口导出。

备注:三方库的移植需要搭建好OpenHarmony南向开发环境,也需要有开发板和掌握hdc_std工具的使用。另外,这样移植有一个前提,与平台无关(即库不涉及对os_api有依赖,不涉及opensl以及opengl,ohos上这两个库和业界的有一定差异,不涉及硬件,不涉及驱动)。

为了帮助到大家能够更有效的学习OpenHarmony 开发的内容,下面特别准备了一些相关的参考学习资料:

OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……

系统架构分析:https://qr18.cn/CgxrRy

  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy

在这里插入图片描述

OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

greendao实现增删改查

说明&#xff1a;最近碰到一个需求&#xff0c;在安卓上使用greendao框架&#xff0c;实现增删改查数据 效果图&#xff1a; step1: // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript {repositories {go…

Kubernetes——监听机制与调度约束

目录 前言 一、监听机制 1.Pod启动创建过程 2.调度过程 1.指定调度节点 1.1强制匹配 1.2强制约束 二、硬策略和软策略 1.键值运算关系 1.硬策略——requiredDuringSchedulingIgnoredDuringExecution 2.软策略——preferredDuringSchedulingIgnoredDuringExecution …

QTreeWidget 详解

QTreeWidget 详解 QTreeWidget 是 PyQt5 框架中的一个重要部件&#xff0c;它提供了树形结构的视图&#xff0c;可以用于显示层级数据。以下是 QTreeWidget 的详细讲解&#xff0c;包括基本用法、主要方法和属性以及如何与其他组件进行交互。 基本用法 导入模块 要使用 QTree…

基于单片机的自行车里程监测系统的设计

摘 要 &#xff1a;本设计是一种基于单片机的自行车里程监测系统&#xff0c;采用 STC89C52RC 单片机为核心处理芯片&#xff0c;液晶显示器使用 LCD1602 &#xff0c; 速度测量使用霍尔传感器&#xff0c;温度传感器使用 DS18B20 &#xff0c;时间由时钟芯片 DS1302 进行…

增强创作者能力:The Sandbox 首届 “创作者挑战” 回顾

首届 "创作者挑战" 为创作者在平台上赚取收入提供了难得机会。 我们发起 “创作者挑战” 的目的是支持创作者&#xff0c;赋予他们构建元宇宙的能力。我们提出三大行动号召&#xff1a;发布、参与和赚钱。新推出的「参与奖池」&#xff08;Engagement Pool&#xff0…

云计算-Amazon S3

亚马逊S3&#xff08;Amazon S3&#xff09; 亚马逊S3是一种云对象存储设施。我们将使用的对象将是您在个人计算机上常用的文件。亚马逊S3产品旨在可扩展到实际无限数量的对象和无限大小的对象&#xff0c;但我们在本实验室的练习中只会使用少量对象。当存储许多对象时&#xf…

OpenCV学习 基础图像操作(十四):直方图均衡化和直方图规定化

基础原理 直方图操作是基于像素统计的基础图像操作,被广泛运用于调整图像的对比度,并由此衍生出很多变种和该经的方式. 图像相直方图 直方图(Histogram)&#xff0c;又称质量分布图&#xff0c;是一种统计报告图&#xff0c;由一系列高度不等的纵向条纹或线段表示数据分布的…

【强训笔记】day24

NO.1 思路&#xff1a;递归。 代码实现&#xff1a; class Solution { public:bool IsBalanced_Solution(TreeNode* pRoot) {return dfs(pRoot)!-1;}int dfs(TreeNode* root){if(rootnullptr) return 0;int leftdfs(root->left);if(left-1) return -1;int rightdfs(root-…

Vulnhub - AI-WEB-1.0靶机教程

目录 站点信息收集 c段扫描 端口扫描 目录扫描 漏洞利用 使用 burp 抓包 查询数据库名 查询数据库下的表 查询表中的字段名 查询字段中的数据 --os-shell 上传一句话木马 下载地址&#xff1a;https://download.vulnhub.com/aiweb/AI-Web-1.0.7z 我们从站点信息收…

【哈希】闭散列的线性探测和开散列的哈希桶解决哈希冲突(C++两种方法模拟实现哈希表)(1)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 哈希函数与哈希 之 闭散列的线性探测解决哈希冲突 的相关内容。 如…

Echarts圆环图偏移后 中心文字居中对齐实现

像上图中这样圆环图并不在div的中间时&#xff0c;中心的文本需要居中展示 一开始用left百分比但数据一旦变长或变短就会偏移 像这样 实在是太不美观了 所以我们这里使用动态的left通过文本的长度来计算 /*** 计算文本宽度* param {String|Number} text* param {String} font*…

js之图片上传

话不多说&#xff0c;直接上干货&#xff0c;注释在代码里面 下面是效果图和代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

[算法][数字][leetcode]2769.找出最大的可达成数字

题目地址 https://leetcode.cn/problems/find-the-maximum-achievable-number/description/ 题目描述 实现代码 class Solution {public int theMaximumAchievableX(int num, int t) {return num2*t;} }

第97天:权限提升-Web 权限权限划分源码后台中间件第三方数据库等

前置知识 具体有哪些权限需要我们了解掌握的 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 以上常见权限获取方法简要归类说明 后台权限&#xff1a;SQL 注入,数据库备份泄露&#xff0c;默认或弱口…

Python | Leetcode Python题解之第104题二叉树的最大深度

题目&#xff1a; 题解&#xff1a; class Solution:def maxDepth(self, root: TreeNode) -> int:if not root: return 0queue, res [root], 0while queue:tmp []for node in queue:if node.left: tmp.append(node.left)if node.right: tmp.append(node.right)queue tmp…

Mybatis入门——其他查询操作和数据库连接池(4)

目录 一、多表查询 二、#{} 和 ${} 1、#{} 和 ${} 的使用 &#xff08;1&#xff09;Integer类型的参数 #{} 的使用 ${} 的使用 &#xff08;2&#xff09;使用String类型的参数 #{} 的使用 ${} 的使用 小结&#xff1a; 2、#{} 和 ${} 的区别 &#xff08;1&#…

太阳能语音监控杆(球机LED款)有什么用

传统监控设备依赖电力支持&#xff0c;在偏远地区和没有网络地区难以发挥其作用&#xff0c;而鼎跃安全的太阳能语音监控杆&#xff08;球机LED款&#xff09;在传统监控基础上&#xff0c;进行了全面优化&#xff0c;解决了无电无网区域使用受限的问题。 太阳能语音监控杆&am…

RSC英国皇家化学学会文献查找下载

英国皇家化学学会(Royal Society of Chemistry&#xff0c;简称RSC)是以促进全球化学领域研究发展与传播为宗旨的国际权威学术机构&#xff0c;是化学信息的一个重要宣传机关和出版商。RSC出版的期刊是化学领域的核心期刊&#xff0c;大部分被SCI和MEDLINE收录&#xff0c;如An…

腾讯云联络中心ivr调用自定义接口

1&#xff0c;java代码&#xff1a;http接口 RequestMapping(value "/getMsg5", method RequestMethod.POST) public Map<String, String> index(RequestBody Map<String, String> params) {String id params.get("id");HashMap<String…

渗透测试工具Cobalt strike-1.CS介绍与配置

Cobalt Strike是一款美国Red Team开发的渗透测试神器&#xff0c;常被业界人称为CS。最近这个工具大火&#xff0c;成为了渗透测试中不可缺少的利器。其拥有多种协议主机上线方式&#xff0c;集成了提权&#xff0c;凭据导出&#xff0c;端口转发&#xff0c;socket代理&#x…