GHOST系统之家 - Windows系统光盘下载网站!
当前位置:GHOST系统之家>系统教程 > 啃论文俱乐部——移植Speexdsp到OpenHarmony标准系统(四)

啃论文俱乐部——移植Speexdsp到OpenHarmony标准系统(四)

来源:Ghost系统之家浏览:时间:2023-04-14 14:32:44

啃论文俱乐部——移植Speexdsp到OpenHarmony标准系统(四)

作者:离北况归 2022-09-14 15:28:19系统 OpenHarmony 推荐增量编译出三方库的动态链接库和测试用例,不推荐的做法是把三方库加入Openharmony编译体系后全量编译出烧录Ohos用的固件。

​​想了解更多关于开源的内容,请访问:​​

​​51CTO开源基础软件社区​​

​​https://ost.51cto.com​​

大家好!我来自南京,在OpenHarmony成长计划啃论文俱乐部,与华为、软通动力、润和软件、拓维信息、深开鸿​等公司一起,学习和研究​操作系统技术从今年1月11日加入OpenHarmony俱乐部已经有接近8个月时间了。笔者一直在思考啃论文给我带来了些什么,通过啃论文能为OpenHarmony做些什么。笔者利用大二升大三暑假两个月时间移植了Speexdsp这个三方库到OpenHarmony标准系统,而关于前面的问题我似乎找到了答案,现将啃论文和三方库移植分享经验如下:

五、在OpenHarmony编译体系下增量编译Speexdsp

建议先增量编译生成三方库的动态链接库和可执行文件,验证是否成功把三方库加入OpenHarmonybian编译体系。

成功编译出so和可执行文件,即成功把三方库加入到ohos编译体系。之后还要验证三方库在ohos运行,功能是否正常。功能正常才能视为移植成功。

推荐增量编译出三方库的动态链接库和测试用例,不推荐的做法是把三方库加入openharmony编译体系后全量编译出烧录ohos用的固件。

第一是因为全量编译ohos对电脑的性能,特别是内存要求比较高(笔者的笔记本上的虚拟机内存给到了32G,对学生开发者来讲,编译ohos的硬件门槛还是有点高的。)增量编译对内存要求不是特别高。(笔者的8G内存二合一笔记本都可以编译出来,并且虚拟机内存只给到了4GB左右)第二是因为全量编译花费时间较多(笔者完整编译出一个固件需要3个小时左右。)增量编译需要的时间相对较少(笔者大概只需要花费9分钟左右)

全量编译和增量编译概念

全量编译是将所有文件重新编译,重新生成解决方案就是全量编译。增量编译只对改动的文件进行编译,执行生成解决方案就是增量编译。

在源码目录执行如下命令,进行增量编译:

./build.sh --product-name rk3568 --ccache --build-target=speexdsp --target-cpu arm64ohos3.2beta1新增特性,支持64位系统的编译,默认情况下编译的都是32位系统,在编译命令中添加​​--target-cpu arm64​​即可构建64位系统,编译so和可执行文件的执行语句更改为:

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

解决编译报错

(笔者理解移植过程肯定不会是一帆风顺的)。

执行编译命令后,有部分报错。

1.部分头文件缺失报错。

‘speexdsp_config_types.h’ file not found

编译找不到third_party/speexdsp/include/speex目录下的speexdsp_config_types.h文件。

../../third_party/speexdsp/include/speex/speexdsp_types.h:122:10: fatal error: 'speexdsp_config_types.h' file not found

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

解决办法:

speexdsp_types.h 是由linux下编译生成的,因此需要在Linux下编译整个Speexdsp源码,然后把在speexdsp原生库目录下build/include/speex目录生成的speexdsp_types.h文件拷贝到要ohos源码下的third_party/speexdsp/include/speex目录下。

2.json文件语法发生错误。

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

解决方法:

查看out/rk3568目录下build.log文件,检查源码/build/subsystem_config.json文件语法。

笔者出现这个问题的原因是json文件语法发生错误,在subsystem_config.json文件第一行的{没有匹配},添加上去就没问题。

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

编译成功

解决完编译报错后,再次执行编译命令。

./build.sh --product-name rk3568 --ccache --build-target=speexdsp --target-cpu arm64

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

编译成功,终端打印信息如下:

(下面只选取关键的一小部分,实际打印出来的信息有两千行左右。)

jiajiahao@ubuntu:~/Desktop/OpenHarmony/sources$ ./build.sh --product-name rk3568 --ccache --build-target=speexdsp --target-cpu arm64++++++++++++++++++++++++++++++++++++++++2022-09-07 22:03:47--product-name rk3568 --ccache --build-target=speexdsp --target-cpu arm64......······[OHOS INFO] [1595/1633] STAMP obj/third_party/speexdsp/speexdsp_share.inputdeps.stamp[OHOS INFO] [1596/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/unistd/soft_musl_src/ttyname_r.o[OHOS INFO] [1597/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/unistd/soft_musl_src/ualarm.o[OHOS INFO] [1598/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/unistd/soft_musl_src/unlink.o[OHOS INFO] [1599/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/unistd/soft_musl_src/unlinkat.o[OHOS INFO] [1600/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/unistd/soft_musl_src/usleep.o[OHOS INFO] [1601/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/unistd/soft_musl_src/write.o[OHOS INFO] [1602/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/unistd/soft_musl_src/writev.o[OHOS INFO] [1603/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/string/soft_musl_src_nossp/mempcpy.o[OHOS INFO] [1604/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/string/soft_musl_src_nossp/memset.o[OHOS INFO] [1605/1633] STAMP obj/third_party/musl/soft_musl_src.stamp[OHOS INFO] [1606/1633] CC obj/third_party/speexdsp/libspeexdsp/speexdsp_share/buffer.o[OHOS INFO] [1607/1633] CC obj/third_party/speexdsp/libspeexdsp/speexdsp_share/fftwrap.o[OHOS INFO] [1608/1633] CC obj/third_party/speexdsp/libspeexdsp/speexdsp_share/filterbank.o[OHOS INFO] [1609/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/env/soft_musl_src_nossp/__libc_start_main.o[OHOS INFO] [1610/1633] CC obj/third_party/speexdsp/libspeexdsp/speexdsp_share/scal.o[OHOS INFO] [1611/1633] ASM obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/thread/aarch64/soft_musl_src_nossp/__set_thread_area.o[OHOS INFO] [1612/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/env/soft_musl_src_nossp/__init_tls.o[OHOS INFO] [1613/1633] CC obj/out/rk3568/obj/third_party/musl/intermidiates/linux/musl_src_ported/src/env/soft_musl_src_nossp/__stack_chk_fail.o[OHOS INFO] [1614/1633] STAMP obj/third_party/musl/soft_musl_src_nossp.stamp[OHOS INFO] [1615/1633] CC obj/third_party/speexdsp/libspeexdsp/speexdsp_share/jitter.o[OHOS INFO] [1616/1633] CC obj/third_party/speexdsp/libspeexdsp/speexdsp_share/preprocess.o[OHOS INFO] [1617/1633] CC obj/third_party/speexdsp/libspeexdsp/speexdsp_share/resample.o[OHOS INFO] [1618/1633] CC obj/third_party/speexdsp/libspeexdsp/speexdsp_share/mdf.o[OHOS INFO] [1619/1633] SOLINK obj/third_party/musl/usr/lib/aarch64-linux-ohos/libc.so[OHOS INFO] [1620/1633] STAMP obj/third_party/musl/soft_shared_libs.stamp[OHOS INFO] [1621/1633] STAMP obj/build/config/common_deps.stamp[OHOS INFO] [1622/1633] STAMP obj/build/config/executable_deps.stamp[OHOS INFO] [1623/1633] STAMP obj/build/config/shared_library_deps.stamp[OHOS INFO] [1624/1633] CC obj/third_party/speexdsp/libspeexdsp/speexdsp_share/smallft.o[OHOS INFO] [1625/1633] SOLINK speexdsp/speexdsp/libspeexdsp_share.z.so[OHOS INFO] [1626/1633] LINK speexdsp/speexdsp/testdenoise[OHOS INFO] [1627/1633] LINK speexdsp/speexdsp/testecho[OHOS INFO] [1628/1633] LINK speexdsp/speexdsp/testjitter[OHOS INFO] [1629/1633] LINK speexdsp/speexdsp/testresample[OHOS INFO] [1630/1633] LINK speexdsp/speexdsp/testresample2[OHOS INFO] [1631/1633] STAMP obj/out/rk3568/build_configs/speexdsp/speexdsp/speexdsp_info.stamp[OHOS INFO] [1632/1633] ACTION //out/rk3568/build_configs/speexdsp/speexdsp:speexdsp(//build/toolchain/ohos:ohos_clang_arm64)[OHOS INFO] [1633/1633] STAMP obj/out/rk3568/build_configs/speexdsp/speexdsp/speexdsp.stamp[OHOS INFO] ---------------------------------------------[OHOS INFO] ccache summary:[OHOS INFO] cache hit (direct): 0[OHOS INFO] cache hit (preprocessed): 0[OHOS INFO] cache miss: 1340[OHOS INFO] hit rate:0.00% [OHOS INFO] mis rate: 100.00% [OHOS INFO] ---------------------------------------------[OHOS INFO] c targets overlap rate statistics[OHOS INFO] subsystem files NO. percentagebuilds NO.percentageoverlap rate[OHOS INFO] aafwk 250.9%250.9%1.00[OHOS INFO] arkui 110.4%110.4%1.00[OHOS INFO] bundlemanager 451.5%451.5%1.00[OHOS INFO] communication1976.7% 1976.7%1.00[OHOS INFO] hiviewdfx 321.1%321.1%1.00[OHOS INFO] securec 782.7%782.7%1.00[OHOS INFO] speexdsp140.5%140.5%1.00[OHOS INFO] startup 461.6%461.6%1.00[OHOS INFO] third_party 106536.3% 106536.3% 1.00[OHOS INFO] thirdparty106536.3% 106536.3% 1.00[OHOS INFO] utils 582.0%582.0%1.00[OHOS INFO] zxing-cpp-1.2.01174.0% 1174.0%1.00[OHOS INFO] [OHOS INFO] c overall build overlap rate: 1.00[OHOS INFO] [OHOS INFO] [OHOS INFO] rk3568 build success[OHOS INFO] cost time: 0:02:24=====buildsuccessful=====

验证编译结果

编译speexdsp生成的动态链接库和测试用的可执行程序,在openharmony源码目录的out/rk3568下。

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

out/rk3568/speexdsp目录结构如下:

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

├── libspeexdsp_share.z.so # 动态链接库├── testdenoise# 测试用例 ├── testecho # 测试用例 ├── testjitter # 测试用例 ├── testresample # 测试用例 └── testresample2# 测试用例

六、API接口导出

在源码third_party/speexdsp目录下新建export_api文件夹。

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

1、在export_api目录下新建allHeads.h文件

该头文件中包含所有库对外导出的头文件。speexdsp有5个测试程序testdenoise、testecho、testjitter、testresample、testresample2。

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

查看这五个测试程序的源文件testdenoise.c、testecho.c、testjitter.c、testresample.c、testresample2.c。

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

其用到的libspeexdsp_share.z.so的头文件如下:

#include "speex_preprocess.h"#include "speex_echo.h"#include "speex_jitter.h"#include "speex_resampler.h"

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

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

3、新增allTests目录,该目录下放置所有生成的测试文件:

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

4、新建自动化测试脚本export_interface.sh,如下所示:

其中cxx="0"表示根据.c文件进行导出,cxx="1"则表示根据.cpp文件进行导出(如果导出c++的三方库的api接口,使用该脚本就让cxx=1):

#!/bin/sh#C库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}remove_standard_api() {flag="0"while read linedotmp1=`echo $line |grep ".*#.*\/usr\/"`tmp2=`echo $line |grep ".*#.*[0-9].*\".*\""`if [ "$tmp1" != "" ];thenflag="0"elif [ "$tmp2" != "" ];thenflag="1"elif [ $flag == "1" ];thenecho "$line" >>$2fidone< $1}src1="allHeads.h"src2="allDySos"src3="allTests"if [ $cxx == "1" ];thenflags_D="-DC"flags_DU="-DCu"CC=g++elseflags_D="-D"flags_DU="-Du"CC=gccfiif [ ! -e $src1 ];thenecho "$src1 is not exist!"exit 1fiif [ ! -e $src2 ];thenecho "$src2 is not exist!"exit 1fiif [ ! -e $src3 ];thenecho "$src3 is not exist!"exit 1firm -rf $src1.i* $src2.txt $src3.txt export_api.txt tested_api.txt$CC -E $* $src1 -o $src1.iif [ "$?" != "0" ];thenexit 1firemove_standard_api $src1.i $src1.i.tmpnm $src2/* $flags_D | sort -u | grep " T " | sed "s/^.* T //g" >> $src2.txtnm $src3/* $flags_DU | sort -u | sed "s/^.* U //g" >> $src3.txtmixed_api $src2.txt $src1.i.tmp export_api.txt 0mixed_api export_api.txt $src3.txttested_api.txt 1rm -rf $src1.i* $src2.txt $src3.txt

执行脚本导出api接口

执行该脚本导出api接口时,需要给脚本传入编译头文件的参数。(运行此api接口导出脚本在PC端)。

例如./export_interface.sh -I 头文件所在路径 -D宏定义(编译所有动态库时,cflags/cflags_cc中的参数)。头文件所在路径为绝对路径。D宏定义指的是(编译所有动态库时,cflags/cflags_cc中的参数)。

笔者导出speexdsp API接口,在export_api文件夹下打开终端输入了如下命令:

chmod 777 export_interface.sh./export_interface.sh -I/home/jiajiahao/Desktop/OpenHarmony/sources/third_party/speexdsp/include/speex

结果是生成export_api.txt(导出so对外api接口)与testd_api.txt(导出测试程序所用到so对外导出api接口 )。

啃论文俱乐部——移植speexdsp到OpenHarmony标准系统④-开源基础软件社区

export_api.txt文件内容如下:

speex_preprocess_state_initspeex_preprocess_state_destroyspeex_preprocessspeex_preprocess_runspeex_preprocess_estimate_updatespeex_preprocess_ctljitter_buffer_initjitter_buffer_ctljitter_buffer_resetjitter_buffer_destroyjitter_buffer_putjitter_buffer_getjitter_buffer_get_anotherjitter_buffer_update_delayjitter_buffer_get_pointer_timestampjitter_buffer_tickjitter_buffer_remaining_spanspeex_echo_state_initspeex_echo_state_init_mcspeex_echo_state_resetspeex_echo_state_destroyspeex_echo_capturespeex_echo_cancellationspeex_echo_playbackspeex_echo_cancelspeex_echo_ctlspeex_resampler_initspeex_resampler_init_fracspeex_resampler_set_qualityspeex_resampler_set_rate_fracspeex_resampler_destroyspeex_resampler_process_floatspeex_resampler_process_intspeex_resampler_process_interleaved_floatspeex_resampler_process_interleaved_intspeex_resampler_set_ratespeex_resampler_get_ratespeex_resampler_get_ratiospeex_resampler_get_qualityspeex_resampler_set_input_stridespeex_resampler_get_input_stridespeex_resampler_set_output_stridespeex_resampler_get_output_stridespeex_resampler_get_input_latencyspeex_resampler_get_output_latencyspeex_resampler_skip_zerosspeex_resampler_reset_memspeex_resampler_strerrorspeex_decorrelate_newspeex_decorrelatespeex_decorrelate_destroy

tested_api.txt文件内容如下:

speex_preprocess_state_initspeex_preprocess_state_destroyspeex_preprocessspeex_preprocess_runspeex_preprocess_ctljitter_buffer_initjitter_buffer_resetjitter_buffer_putjitter_buffer_getjitter_buffer_tickspeex_echo_state_initspeex_echo_state_destroyspeex_echo_cancellationspeex_echo_cancelspeex_echo_ctlspeex_resampler_initspeex_resampler_destroyspeex_resampler_process_floatspeex_resampler_set_ratespeex_resampler_skip_zeros

​​想了解更多关于开源的内容,请访问:​​

​​51CTO开源基础软件社区​​

​​https://ost.51cto.com​​。

责任编辑:jianghua 来源:​​51CTO开源基础软件社区 操作系统鸿蒙

推荐系统

  • 微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    语言:中文版系统大小:5.13GB系统类型:Win11

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化  1、保留 Edge浏览器。  2、隐藏“操作中心”托盘图标。  3、保留常用组件(微软商店,计算器,图片查看器等)。  5、关闭天气资讯。 

  • Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    语言:中文版系统大小:4.75GB系统类型:Win11

    Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件

  • windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化

  • 微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载

  • 微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    语言:中文版系统大小:0MB系统类型:Win11

    微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为

  • 雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    语言:中文版系统大小:4.75GB系统类型:

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统

  • 雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    语言:中文版系统大小:5.91GB系统类型:Win7

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户

  • 番茄花园Ghost Win7 x64 SP1稳定装机版2022年7月(64位) 高速下载

    番茄花园Ghost Win7 x64 SP1稳定装机版2022年7月(64位) 高速下载

    语言:中文版系统大小:3.91GB系统类型:Win7

    欢迎使用 番茄花园 Ghost Win7 x64 SP1 2022.07 极速装机版 专业装机版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,集成最全面的硬件驱动,精心挑选的系统维护工具,加上独有人性化的设计。是电脑城、个人、公司快速装机之首选!拥有此系统