使用OpenHarmonyNDK移植三方库Speexdsp
使用OpenHarmonyNDK移植三方库Speexdsp
作者:离北况归 2023-03-22 09:09:21系统 OpenHarmony 笔者最近为Speexdsp编写了CMakeLists.txt,使用OpenHarmony的NDK工具编译出来so动态库和可执行文件,并且成功在开发板上运行,现将经验分享如下。想了解更多关于开源的内容,请访问:
51CTO开源基础软件社区
https://ost.51cto.com
NDK (原生开发套件) 是一套工具,使开发者能够在 OpenHarmony hap应用中使用 C/C++ 代码。它提供了一系列的工具可以帮助开发者快速的开发C/C++的动态库、静态库和可执行文件。
OpenHarmony 应用开发的Native C++开发方式就要依赖NDK。NDK被包含在OpenHarmony SDK中。可以在DevEco Studio使用 NDK 将 C/C ++ 代码编译到so库中,然后使用 DevEco Studio 的构建插件hvigor-ohos-plugin将so库打包到 Hap 中。ArkTS代码随后可以通过NAPI框架调用SO库中的函数。
深开鸿郭岳峰老师开发的OCRDemo就通过NAPI调用了C++的三方库Tesseract的能力,而这个库本身还依赖leptonica、libjpeg、libpng、libtiff等C/C ++ 等四方库。如果重新编写build.gn移植到OpenHarmony,工作量巨大。
Tesseract (Apache 2.0 License)是一个可以进行图像OCR识别的C ++ 库
OpenHarmony集成OCR三方库实现文字提取
一、编写build.gn与编写CMakeLists.txt移植到OpenHarmony两者的区别
1、编译环境不同,编译工具
编写build.gn方式,编译环境是在OpenHarmony源码中,编译时使用到的是源码中的编译工具。
编写CMakeLists.txt的移植方式实际上是Native C++应用开发方式的一种,并且NDK是SDK的一部分,编译so时候实际上使用的是NDK的编译工具。
2、so安装的地方不一样
编写build.gn方式,三方库编译出来的so和测试用例可以打包进入OpenHarmony固件中。
编写CMakeLists.txt方式,编译出来的实际上会被打包进入hap应用中,hap再安装到OpenHarmony操作系统上完成三方库so能力的调用。
3、编写CMakeLists.txt比编写build.gn更容易
build.gn总有各种各样的编译器标志要加入以消除编译报错,开发者学习成本比较高
CMakeLists.txt方式开发者则相对熟悉,对于原生库就是camke构建的三方库,只需要对原生库已有的CMakeLists.txt做少量修改,比如删除与其他操作系统有关的部分(笔者说的就是AOSP)。
二、使用OpenHarmony的NDK工具移植Speexdsp到Speexdsp
在windows端的IDE上调用NDK。
创建Native C++工程,但是先不写NAPI和ArkTS的部分,先为C/C ++的三方库编写CMakeLists.txt(如果三方库本身就是cmake构建的,但也要对CMakeLists.txt进行少量的修改,详细请参考该样例 https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/FA/OCRDemo)。 然后编译hap应用来调用SDK中的NDK工具。
三、创建Native C++工程使用SDK中的NDK工具
创建Native C++工程参考:三方库移植之NAPI开发[3]通过IDE开发NAPI工程
1、打开IDE Deveco Studio,创建一个Native C++工程。
2、SDK选择API9,model选择Stage。新建的Native C++工程有一个默认的hello world教程。
将Speexdsp加入Native C++工程,在库中编写顶层CMakeLists.txt生成动态库。
将speexdsp源码移动到Native C++工程entry\src\main\cpp目录,cpp目录专门用于存放C/C ++代码。
删除Speexdsp中无关的代码让代码结构简洁。Speexdsp中有一些无关的代码,例如和win32、macO上运行的有关代码,甚至还有塞班系统symbian上的代码。(不管了先删除,不知道Speexdsp的开源协议允不允许笔者这样做,但是看着乱乱的目录结构,笔者希望这样让自身的思路清晰一些。)
# 目录结构说明cpp├─include # .h文件├─libspeexdsp # .c文件│ └─CMakeLists.txt# 笔者编写的用来生成可执行文件库的CMakeLists.txt├─BUILD.gn# 笔者之前写的BUILD.gn,现在拿来参考写CMakeLists.txt├─CMakeLists.txt# 笔者编写的用来生成动态库的CMakeLists.txt├─config.h# Speexdsp原生库在linux下编译构建生成的配置文件├─speexdsp_api.txt# Speexdsp的api列表└─speedsp_tested_api.txt编写顶层在CMakeLists.txt生成动态库。
############################################# 创建so动态库# 源文件# CMAKE_CURRENT_SOURCE_DIR指的CMakeLists.txt当前所在的目录set(SHARED_LIB_SRC "${CMAKE_CURRENT_SOURCE_DIR}/libspeexdsp/preprocess.c" "${CMAKE_CURRENT_SOURCE_DIR}/libspeexdsp/jitter.c" "${CMAKE_CURRENT_SOURCE_DIR}/libspeexdsp/mdf.c" "${CMAKE_CURRENT_SOURCE_DIR}/libspeexdsp/fftwrap.c" "${CMAKE_CURRENT_SOURCE_DIR}/libspeexdsp/filterbank.c" "${CMAKE_CURRENT_SOURCE_DIR}/libspeexdsp/resample.c" "${CMAKE_CURRENT_SOURCE_DIR}/libspeexdsp/buffer.c" "${CMAKE_CURRENT_SOURCE_DIR}/libspeexdsp/scal.c" "${CMAKE_CURRENT_SOURCE_DIR}/libspeexdsp/smallft.c")add_library(speexdsp SHARED ${SHARED_LIB_SRC})target_include_directories(speexdsp PRIVATE ${INCLUDE_DIR})############################################################# 链接数学库-lm# 如果为所有target统一指定编译时要链接的库用LINK_LIBRARIES# 为每个target单独指定编译时要链接的库用TARGET_LINK_LIBRARIESlink_libraries(-lm)target_link_libraries(speexdsp PUBLIC m)# 使用add_subdirectory()将子目录添加到构建add_subdirectory(libspeexdsp)在库中编写底层CMakeLists.txt生成可执行文件,用来验证so库是否运行正常。
在.c源文件目录添加CMakeLists.txt用来编译出可执行文件,用来验证使用NDK移植三方库到OpenHarmony标准系统是否成功。如下:
cmake_minimum_required(VERSION 3.4.1)project(test)#生成执行二进制文件,生成testdenoise测试用例ADD_EXECUTABLE(testdenoise testdenoise.c)# 将二进制文件链接到生成的动态库TARGET_LINK_LIBRARIES(testdenoise PUBLIC speexdsp)# 将二进制文件链接的库文件link_libraries(-lm)# 添加编译器标志add_compile_options(-g -O2-fvisibility=hidden)# 生成testecho测试用例ADD_EXECUTABLE(testecho testecho.c)TARGET_LINK_LIBRARIES(testecho PUBLIC speexdsp)link_libraries(-lm)add_compile_options(-g -O2-fvisibility=hidden)# 生成testjitter测试用例ADD_EXECUTABLE(testjitter testjitter.c)TARGET_LINK_LIBRARIES(testjitter PUBLIC speexdsp)link_libraries(-lm)add_compile_options(-g -O2-fvisibility=hidden)# 生成testresample测试用例ADD_EXECUTABLE(testresample testresample.c)TARGET_LINK_LIBRARIES(testresample PUBLIC speexdsp)link_libraries(-lm)add_compile_options(-g -O2-fvisibility=hidden)# 生成testresample2测试用例ADD_EXECUTABLE(testresample2 testresample2.c)TARGET_LINK_LIBRARIES(testresample2 PUBLIC speexdsp)link_libraries(-lm)add_compile_options(-g -O2-fvisibility=hidden)在库外的CMakeLists.txt中添加代码使能speexdsp编译。
新建的Native C++工程是有一个默认的Hello World模板的,在entry\src\main\cpp目录下有一个CMakeLists.txt,需要在其中添加代码使能speexdsp编译。
在entry\src\main\cpp\CMakeLists.txt中主要做两件事情# 添加子目录speexdspadd_subdirectory(speexdsp)# 添加链接libspeexdsp.so动态库# 把动态库libentry.so链接到动态库libspeexdsp.sotarget_link_libraries(entry PUBLIC libace_napi.z.so speexdsp)如果不添加代码,则speexdsp的动态库和可执行用例编译不出来。
执行编译命令编译动态库和测试用例。
在IDE上方工具栏选择编译hap进行so和测试用例的编译。
编译结果在entry\build\default\intermediates\cmake\default\obj目录下。
├─arm64-v8a│libc++_shared.so│libentry.so│libspeexdsp.so│testdenoise│testecho│testjitter│testresample│testresample2│└─armeabi-v7alibc++_shared.solibentry.solibspeexdsp.sotestdenoisetestechotestjittertestresampletestresample2为什么会IDE中的NDK会编译出64位和32位的动态库和可执行文件呢?因为OpenHarmony操作系统有32位和64位,这样是为了hap能在不同位数的OpenHarmony版本上运行。
根据32位和64位的OpenHarmony版本推送相应的so和可执行文件到开发板上。
如何分辨开发板上OpenHarmony版本是64位还是32位?和linux的方式是一样。用getconf WORD_BIT和getconf LONG_BIT获得word和long的位数。64位系统中分别得到32和64。32位系统中分别得到32和32。
笔者开发板上烧录的是32位的OpenHarmony Beta5版本。
因此需要将Native C++工程目录下的entry\build\default\intermediates\cmake\default\obj\armeabi-v7a中的libspeexdsp.so和testdenoise、testecho、testjitter、testresample、testresample2推送到设备端的data目录。
通过与ohos版本匹配的hdc_std工具,将编译生成的库以及测试用的可执行文件推送到开发板的data目录。
hdc_std shell mount -o remount,rw /## 重新加载系统为可读写hdc_std file send testdenoise /data ## 推送可执行文件testdenoise到data目录hdc_std file send libspeexdsp /data ## 推送libspeexsdp.so到data目录执行testdenoise可执行文件(其它测试用例的执行请参考 移植speexdsp到OpenHarmony标准系统⑤)。
通过分析testdenoise.c源码,执行测试程序时需要指定一份输入的不为空的8000Hz的input.pcm音频,并且需要指定一份空的输出的output.pcm音频。rk3568上运行,执行语句如下:
./testdenoise< input.pcm >output.pcm测试结果:对比输入的input.pcm和输出的outpu.pcm的波形图和声谱图,噪声已经被消除。pc端和rk3568开发板运行testdenoise可执行程序效果一致。可执行文件运行成功,使用OpenHarmonyNDK移植三方库Speexdsp成功。
知识点附送
AIP8的应用如何更改为API9支持64位版本。
API8只支持32位,API9支持32位和64位。
以该PR https://gitee.com/openharmony/applications_app_samples/pulls/759 学习将api8应用适配适配Arm64。
修改build-profile.json5 ,将compileSdkVersion和compatibleSdkVersion属性由8改为9。
compileSdkVersion指定OpenHarmony应用/服务编译时的SDK版本。
compatibleSdkVersion指定OpenHarmony应用/服务兼容的最低SDK版本。
修改entry/build-profile.json5,abi添加64位arm64-v8a。
abiFilters用于设置本机的ABI编译环境。
修改entry/src/main/config.json,设备类型改为默认。
这个pr改动了XComponent/entry/src/main/cpp/common/plugin_common.h文件,plugin_common.h文件和hilog调试的功能有关。
编译构建子系统如何增加编译构建arm64选择。
以该issue https://gitee.com/openharmony/build/issues/I53E9I 来学习。
分别在hb工具和build.sh脚本添加–target-cpu选项。
电源服务子系统支持64位。
https://gitee.com/openharmony/powermgr_power_manager/issues/I55094。
graphic子系统适配64位编译。
https://gitee.com/openharmony/graphic_graphic_2d/issues/I53720。
想了解更多关于开源的内容,请访问:
51CTO开源基础软件社区
https://ost.51cto.com
责任编辑:jianghua 来源:51CTO 开源基础软件社区 鸿蒙Speexdsp推荐系统
微软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最新系统免激活下载
语言:中文版系统大小:4.75GB系统类型:Win11Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件
windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载
语言:中文版系统大小:5.31GB系统类型:Win11windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化
微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载
语言:中文版系统大小:5.31GB系统类型:Win11微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载
微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件
语言:中文版系统大小:0MB系统类型:Win11微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为
雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载
语言:中文版系统大小:4.75GB系统类型:雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统
雨林木风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位) 高速下载
语言:中文版系统大小:3.91GB系统类型:Win7欢迎使用 番茄花园 Ghost Win7 x64 SP1 2022.07 极速装机版 专业装机版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,集成最全面的硬件驱动,精心挑选的系统维护工具,加上独有人性化的设计。是电脑城、个人、公司快速装机之首选!拥有此系统
相关文章
- Win8系统桌面图标总是成双显示影响运用的处理办法
- win10系统想把编辑好的word文档进行格式清除的办法
- Win8如何设置无线热点?Win8设置无线热点图文详细教程
- 不限机型!腾讯“微信红包闹钟”运用攻略_微信
- win10鼠标不能拖动文件,本文教您win10鼠标无法拖动文件怎样处理
- QQ相册图片大局部下载的小妙招_腾讯QQ
- 怎么快速提取图片上的文字?
- 讲解电脑怎么重装系统xp
- win7系统图标异常怎么办
- 微信中怎么查看天数?微信中查看天数的方法
- win7旗舰版没有权限
- 怎样处理Win8安装Office2007遇到的Setup Error出错?
- Win10怎样防范UWP应用被静默安装?
- 安装win8系统原始iso镜像图文教程
- Win8系统删除管理员密码的办法
- Win8怎样设置边框颜色为透明?
- u盘安装系统后无法启动系统解决教程
- 原版win7镜像win7系统官方原版iosiso下载 7 光盘映像 ISO 文件
热门系统
- 1华硕笔记本&台式机专用系统 GhostWin7 32位正式旗舰版2018年8月(32位)ISO镜像下载
- 2深度技术 Windows 10 x86 企业版 电脑城装机版2018年10月(32位) ISO镜像免费下载
- 3电脑公司 装机专用系统Windows10 x86喜迎国庆 企业版2020年10月(32位) ISO镜像快速下载
- 4雨林木风 Ghost Win7 SP1 装机版 2020年4月(32位) 提供下载
- 5深度技术 Windows 10 x86 企业版 六一节 电脑城装机版 版本1903 2022年6月(32位) ISO镜像免费下载
- 6深度技术 Windows 10 x64 企业版 电脑城装机版2021年1月(64位) 高速下载
- 7新萝卜家园电脑城专用系统 Windows10 x64 企业版2019年10月(64位) ISO镜像免费下载
- 8新萝卜家园 GhostWin7 SP1 最新电脑城极速装机版2018年8月(32位)ISO镜像下载
- 9电脑公司Ghost Win8.1 x32 精选纯净版2022年5月(免激活) ISO镜像高速下载
- 10新萝卜家园Ghost Win8.1 X32 最新纯净版2018年05(自动激活) ISO镜像免费下载
热门文章
常用系统
- 1Win10 Enterprise LTSC 2022下载_Win10企业正式版LTSC 2022下载
- 2新萝卜家园Ghost Win10 独享装机版 v2023.03最新免费下载
- 3深度技术win10 64位 光速青春版 v2023.05免费下载
- 4电脑公司Ghost Win7 x64 Sp1装机万能版2022年4月(64位) ISO镜像免费下载
- 5深度技术 GHOST WIN7 SP1 X64 装机纯净版 V2015.06(64位) 下载
- 6笔记本系统Ghost Win8.1 (32位) 元旦特别 极速纯净版2022年1月(免激活) ISO镜像高速下载
- 7Win10最新版本22H2下载_Win10 22H2免激活专业纯净版下载
- 8Win10 21H2 19044.1415(KB5008212)官方正式版下载
- 9电脑公司Ghost Win7激活镜像免费下载_电脑公司Win7 64位极速稳定版下载V2023.10
- 10深度技术 GHOST XP SP3 电脑城装机专业版 V2017.11 下载