战码先锋,PR征集令(以下简称“战码先锋”)第二期正如火如荼地进行中,涉及OpenAtom OpenHarmony(以下简称“OpenHarmony”)主干仓、SIG仓、三方库,共计1000+代码仓任君挑战。

在战码先锋活动中,我们注意到开发者对三方库移植有着浓厚的兴趣。三方库是基于标准Linux系统的C/C++开源库,例如OpenCV、LZMA压缩算法、ZXing-cpp图像处理库,三方库移植能为OpenHarmony项目补齐更多功能或组件,对繁荣生态非常重要。

三方库移植也为参与OpenHarmony贡献提供了另外一种思路,我们希望通过实战经验的分享鼓励更多感兴趣的开发者动手移植自己心仪的三方库。为此,我们邀请目前还是一名大三学生,也是战码先锋优秀贡献者,OpenHarmony啃论文俱乐部优秀学员——贾佳豪(社区网名:离北况归)进行分享,他在完成了一个三方库在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 line
do
if [ $cxx != "1" -o "$4" == "1" ];then
tmp=$line
else
tmp=`echo $line | sed "s/(.*$//g" | sed "s/^.*:://g"`
fi
res=`cat $2 |grep "$tmp" -F`
if [ "$res" != "" ];then
echo "$line" >> $3
fi
done < $1
}

  

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

https://gitee.com/openharmony-sig/contest/tree/master/2022_OpenHarmony_thirdparty/speexdsp

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

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

更多三方库移植方法请参考:《一文带你读懂如何移植三方库到OpenHarmony》

欢迎感兴趣的开发者朋友们一起参与战码先锋和OpenHarmony啃论文俱乐部活动!在Gitee的OpenHarmony代码仓提交PR参与活动,和全球的开发者一起共建OpenHarmony的繁荣生态!现在就打开Gitee,为OpenHarmony提PR,你的一小步,就是OpenHarmony开源的一大步。

大家也可以动起手来移植自己感兴趣的三方库到OpenHarmony,移植的三方库提交至仓库:https://gitee.com/openharmony-sig/contest/tree/master/2022_OpenHarmony_thirdparty。你对OpenHarmony社区的每一份贡献都会被永久地记录下来。

4步成功将三方库——speexdsp移植到OpenHarmony的更多相关文章

  1. iOS:iOS开发非常全的三方库、插件等等

    iOS开发非常全的三方库.插件等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自git ...

  2. iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)

    一.概念篇 什么是库? 库是程序代码的集合,是共享程序代码的一种方式 根据源代码的公开情况,库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking ...

  3. 网络请求三方库——OkHttp

    我们知道在Android开发中是可以直接使用现成的API进行网络请求的,就是使用 HttpClient 和 HttpURLConnention ,而Android 4.4 之后 HttpClient  ...

  4. 手把手图文并茂教你用Android Studio编译FFmpeg库并移植

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52661331 之前曾写过一篇&l ...

  5. 嵌入式Linux下MP4视频录制库MP4V2移植和简单介绍

    **************************************************************************************************** ...

  6. cocoapods集成三方库遇到的坑

    什么都不想说直接上图 这是最近在管理三方库时遇到头疼的问题,刚开始一直怀疑是cocoapods或者ruby的版本问题但是升级到最新版还是同样的错误,后来又怀疑是资源文件的问题但是在同一时间不同地点集成 ...

  7. 解决嵌入式linux系统下iconv库的移植问题

    一.解决问题    在arm开发板上使用framebuff,在汉字显示时,因为只有gb2312的16*16的汉字字库,而ubuntu16.04默认    的编码方式时utf-8,因此需要进行转码(ut ...

  8. ld: framework not found AGCommon 关于三方库到入 问题解决方案!!

    ld: framework  not found AGCommon clang:error:linker command failed with exit code 1 (use -v to see ...

  9. 使用python三方库xlrd解析excel数据

    excel是平常用的比较多的一种数据格式,而在自动化测试过程中,解析其数据以供脚本使用就是一个重要的工作,幸好已有现存的三方库供使用,而不必重新造轮子. 一.安装xlrd模块 到python官网下载h ...

  10. three.js是JavaScript编写的WebGL第 三方库

    three.js是JavaScript编写的WebGL第 三方库.提供了非常多的3D显示功能.Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质 ...

随机推荐

  1. 基于java的学生信息管理系统

    开发说明:使用数组集合存储临时数据,实现学生信息管理系统,实现的功能有管理员的注册.登陆.增加学生信息.删除学生信息.查询学生信息.修改学生信息.学生信息列表 登陆注册界面 系统首页界面 增加 删除 ...

  2. 第137篇:重学ES6模块化

    好家伙,   我原本以为学完模块化之后,就能非常顺利的完成我的项目分包, 然而并没有,这是非常重要的知识,而我没有学好 所以我决定重学一遍   本篇为<阮一峰 ECMAScript 6 (ES6 ...

  3. 数据库运维 | 携程分布式图数据库NebulaGraph运维治理实践

    作者简介:Patrick Yu,携程云原生研发专家,关注非关系型分布式数据存储及相关技术. 背景 随着互联网世界产生的数据越来越多,数据之间的联系越来越复杂层次越来越深,人们希望从这些纷乱复杂的数据中 ...

  4. C# 操作国产数据库之【 人大金仓 】之四大模式

    人大金仓优点 人大金仓是国产最主流ORM之一 具有和PgSql一样强悍的性能,同时人大金仓支持了四种数据库模式 : Oracle.PgSql.MySql和SqlServer ,假如你们系统有多种数据库 ...

  5. 1. Canal入门

    1. Canal简介 官方文档: https://github.com/alibaba/canal/wiki/简介 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.早期 ...

  6. 19 SWERC 2022-2023 - Online Mirror (Unrated, ICPC Rules, Teams Preferred)L. Controllers(数学公式+瞎搞)

    L. Controllers 思路: #include <bits/stdc++.h> #define int long long #define rep(i, a, b) for(int ...

  7. 各大OA调试账户默认账户口令

    1.今目标地址:http://web.jingoal.com/mgt/用户名:admin@8216261密码:1a2s3d4f5g2.IBOS博思协同地址:http://demo.ibos.com.c ...

  8. .NET 5 以后的 HttpClient 超时问题

    背景 起因是朋友在使用深信服的 Easy Connect 连接到内网之后,使用 HttpClient 访问对应内网的 API 站点均返回 System.Net.Sockets.SocketExcept ...

  9. 安卓开发基础适配器,SimpleAdapter 快速演示

    第一,主视图如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns: ...

  10. 新零售SaaS架构:什么是线上商城系统?

    零售商家为什么要建设线上商城 传统的实体门店服务范围有限,只能吸引周边500米内的消费者.因此,如何拓展服务范围,吸引更多消费者到店,成为了店家迫切需要解决的问题. 缺乏忠实顾客,客户基础不稳,往往是 ...