写点什么

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

  • 2022 年 9 月 27 日
    上海
  • 本文字数:2658 字

    阅读完需:约 9 分钟

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

战码先锋,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 上这两个库和业界的有一定差异,不涉及硬件,不涉及驱动)。


更多三方库移植方法请参考:https://mp.weixin.qq.com/s?__biz=MzkzNTIyNTY3Mg==&mid=2247496334&idx=2&sn=6720d1ca9c618c026962050b06d51219&scene=21#wechat_redirect


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


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



用户头像

OpenHarmony开发者官方账号 2021.12.15 加入

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展

评论

发布
暂无评论
4步成功将三方库——speexdsp移植到OpenHarmony_OpenHarmony_OpenHarmony开发者社区_InfoQ写作社区