赞
踩
build.gn
使其加入了OpenHarmony编译体系(基于ninja和gn),Speexdsp在linux下是使用构建工具configure、makefile构建的。移植的难点并不在于.c和.h以及cflags、idflags的分析,而在于重新熟悉一套编译构建体系,而且当时可参考的资料并不太多。CMakeLists.txt
,使用OpenHarmony的NDK工具编译出来so动态库和可执行文件,并且成功在开发板上运行,现将经验分享如下:speexdsp移植完毕已提交至openhamrony sig仓库:https://gitee.com/openharmony-sig/contest/tree/master/2022_OpenHarmony_thirdparty/speexdsp
往期回顾:
移植speexdsp到OpenHarmony标准系统①
移植speexdsp到OpenHarmony标准系统②
移植speexdsp到OpenHarmony标准系统③
移植speexdsp到OpenHarmony标准系统④
移植speexdsp到OpenHarmony标准系统⑤
移植speexdsp到OpenHarmony标准系统⑥
OpenHarmony NDK工具①
(笔者也没想到会继续续写三方库方面的文章,学无止境,希望能够帮助更多人了解OpenHarmony,加入OpenHarmony生态)
1、编译环境不同,编译工具
2、so安装的地方不一样
3、编写CMakeLists.txt比编写build.gn更容易
创建Native C++工程参考:三方库移植之NAPI开发[3]通过IDE开发NAPI工程
1、打开IDE Deveco Studio,创建一个Native C++工程。
2、SDK选择API9,model选择Stage。新建的Native C++工程有一个默认的hello world教程
1、将speexdsp源码移动到Native C++工程entry\src\main\cpp目录,cpp目录专门用于存放C/C ++代码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UNHur2BT-1689922955639)(https://dl-harmonyos.51cto.com/images/202303/74214d948e4dace0d9a0341b067451e44363da.png?x-oss-process=image/resize,w_604,h_223)]
2、删除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
# CMake的最小版本要求 cmake_minimum_required(VERSION 3.4.1) # 脚本中set是将普通变量、缓存变量或者环境变量设置为指定的值。 # 从CMake v3.1开始,可以CMAKE_CXX_STANDARD变量设置C++标准 set(CMAKE_CXX_STANDARD 11) # 项目名称 project(speexdsp) # 添加cflags信息 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-implicit-function-declaration") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-pointer-sign") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c99-extensions") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-variable") # cflags信息 # 这个命令是针对所有类型编译器的,也就是说这里添加的选项会在所有的编译器中运用,比如-std=c++11是针对C++的编译器参数,也会被运用在C语言编译器中 # 通过在CMakeLists.txt文件中添加add_compile_options命令可以起到添加参数的作用 add_compile_options(-g -O2 -fvisibility=hidden -Wno-implicit-function-declaration -Wno-pointer-sign -Wno-c99-extensions -Wno-unused-variable) # 头文件 set(INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") # 设定编译宏 -D add_definitions(-DHAVE_CONFIG_H) ############################################################ # 创建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_LIBRARIES link_libraries(-lm) target_link_libraries(speexdsp PUBLIC m) # 使用add_subdirectory()将子目录添加到构建 add_subdirectory(libspeexdsp)
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)
在entry\src\main\cpp\CMakeLists.txt中主要做两件事情
# 添加子目录speexdsp
add_subdirectory(speexdsp)
# 添加链接libspeexdsp.so动态库
# 把动态库libentry.so链接到动态库libspeexdsp.so
target_link_libraries(entry PUBLIC libace_napi.z.so speexdsp)
1、在IDE上方工具栏选择编译hap
进行so和测试用例的编译
2、编译结果在entry\build\default\intermediates\cmake\default\obj目录下
├─arm64-v8a │ libc++_shared.so │ libentry.so │ libspeexdsp.so │ testdenoise │ testecho │ testjitter │ testresample │ testresample2 │ └─armeabi-v7a libc++_shared.so libentry.so libspeexdsp.so testdenoise testecho testjitter testresample testresample2
如何分辨开发板上OpenHarmony版本是64位还是32位?和linux的方式是一样。用
getconf WORD_BIT
和getconf LONG_BIT
获得word和long的位数。64位系统中分别得到32和64。32位系统中分别得到32和32。
1、笔者开发板上烧录的是32位的OpenHarmony Beta5版本
2、通过与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 < input.pcm > output.pcm
以该PR https://gitee.com/openharmony/applications_app_samples/pulls/759 学习将api8应用适配适配Arm64
1、修改build-profile.json5 ,将compileSdkVersion
和compatibleSdkVersion
属性由8改为9
compileSdkVersion
指定OpenHarmony应用/服务编译时的SDK版本compatibleSdkVersion
指定OpenHarmony应用/服务兼容的最低SDK版本2、修改entry/build-profile.json5,abi添加64位arm64-v8a
abiFilters
用于设置本机的ABI编译环境3、修改entry/src/main/config.json,设备类型改为默认
4、这个pr改动了XComponent/entry/src/main/cpp/common/plugin_common.h文件,plugin_common.h文件和hilog调试的功能有关。
以该issue https://gitee.com/openharmony/build/issues/I53E9I 来学习
电源服务子系统支持64位
https://gitee.com/openharmony/powermgr_power_manager/issues/I55094
graphic子系统适配64位编译
https://gitee.com/openharmony/graphic_graphic_2d/issues/I53720
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。