<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用OpenHarmonyNDK移植三方庫Speexdsp

OpenHarmony開發經驗 ? 來源:OpenHarmony開發經驗 ? 作者:OpenHarmony開發經驗 ? 2023-05-16 10:18 ? 次閱讀
  • 大家好,我是一名即將本科畢業的OpenHarmony開發者,去年暑假利用了兩個月時間移植了一個語音處理的三方庫Speexdsp到OpenHarmony標準系統。主要為其編寫了build.gn使其加入了OpenHarmony編譯體系(基于ninja和gn),Speexdsp在linux下是使用構建工具configure、makefile構建的。移植的難點并不在于.c和.h以及cflags、idflags的分析,而在于重新熟悉一套編譯構建體系,而且當時可參考的資料并不太多。
  • 筆者最近為Speexdsp編寫了CMakeLists.txt,使用OpenHarmony的NDK工具編譯出來so動態庫和可執行文件,并且成功在開發板上運行,現將經驗分享如下:

speexdsp移植完畢已提交至openhamrony sig倉庫:https://gitee.com/openharmony-sig/contest/tree/master/2022_OpenHarmony_thirdparty/speexdsp

(筆者也沒想到會繼續續寫三方庫方面的文章,學無止境,希望能夠幫助更多人了解OpenHarmony,加入OpenHarmony生態)


  • NDK (原生開發套件) 是一套工具,使開發者能夠在 OpenHarmony hap應用中使用 C/C++ 代碼。它提供了一系列的工具可以幫助開發者快速的開發C/C++的動態庫、靜態庫和可執行文件。
  • OpenHarmony 應用開發的Native C++開發方式就要依賴NDK。NDK被包含在OpenHarmony SDK中??梢栽?a href="http://www.qd573.com/outside?redirect=https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/ohos-deveco-studio-overview-0000001263280421-V3?catalogVersion=V3" target="_blank">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,工作量巨大。

1. 編寫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)。

2. 使用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工具。

3. 創建Native C++工程使用SDK中的NDK工具

創建Native C++工程參考:三方庫移植之NAPI開發[3]通過IDE開發NAPI工程

  • 1、打開IDE Deveco Studio,創建一個Native C++工程。

    image.png

  • 2、SDK選擇API9,model選擇Stage。新建的Native C++工程有一個默認的hello world教程

    image.png

3.1 將Speexdsp加入Native C++工程,在庫中編寫頂層CMakeLists.txt生成動態庫

  • 1、將speexdsp源碼移動到Native C++工程entry\\src\\main\\cpp目錄,cpp目錄專門用于存放C/C ++代碼。

    image.png

  • 2、刪除Speexdsp中無關的代碼讓代碼結構簡潔。Speexdsp中有一些無關的代碼,例如和win32、macO上運行的有關代碼,甚至還有塞班系統symbian上的代碼。(不管了先刪除,不知道Speexdsp的開源協議允不允許筆者這樣做,但是看著亂亂的目錄結構,筆者希望這樣讓自身的思路清晰一些。)

    image.png

# 目錄結構說明
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
  • 3、編寫頂層在CMakeLists.txt生成動態庫

    image.png

# 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)

3.2 在庫中編寫底層CMakeLists.txt生成可執行文件,用來驗證so庫是否運行正常

  • 在.c源文件目錄添加CMakeLists.txt用來編譯出可執行文件,用來驗證使用NDK移植三方庫到OpenHarmony標準系統是否成功。如下:

屏幕截圖 20230316 220059.png

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)

3.3 在庫外的CMakeLists.txt中添加代碼使能speexdsp編譯

  • 1、 新建的Native C++工程是有一個默認的Hello World模板的,在entry\\src\\main\\cpp目錄下有一個CMakeLists.txt,需要在其中添加代碼使能speexdsp編譯

    屏幕截圖 20230317 104050.png

在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)
  • 2、如果不添加代碼,則speexdsp的動態庫和可執行用例編譯不出來

3.4 執行編譯命令編譯動態庫和測試用例

  • 1、在IDE上方工具欄選擇編譯hap進行so和測試用例的編譯

    image.png

  • 2、編譯結果在entry\\build\\default\\intermediates\\cmake\\default\\obj目錄下

    屏幕截圖 20230317 224016.png

├─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
  • 3、為什么會IDE中的NDK會編譯出64位和32位的動態庫和可執行文件呢?因為OpenHarmony操作系統有32位和64位,這樣是為了hap能在不同位數的OpenHarmony版本上運行。

3.5 根據32位和64位的OpenHarmony版本推送相應的so和可執行文件到開發板上

如何分辨開發板上OpenHarmony版本是64位還是32位?和linux的方式是一樣。用getconf WORD_BITgetconf LONG_BIT獲得word和long的位數。64位系統中分別得到32和64。32位系統中分別得到32和32。

  • 1、筆者開發板上燒錄的是32位的OpenHarmony Beta5版本

    image.png

    • 因此需要將Native C++工程目錄下的entry\\build\\default\\intermediates\\cmake\\default\\obj\\armeabi-v7a中的libspeexdsp.so和testdenoise、testecho、testjitter、testresample、testresample2推送到設備端的data目錄

      image.png

  • 2、通過與ohos版本匹配的hdc_std工具,將編譯生成的庫以及測試用的可執行文件推送到開發板的data目錄

    image.png

hdc_std shell mount -o remount,rw /	    ## 重新加載系統為可讀寫
hdc_std file send testdenoise /data         ## 推送可執行文件testdenoise到data目錄
hdc_std file send libspeexdsp /data         ## 推送libspeexsdp.so到data目錄
  • 3、執行testdenoise可執行文件(其它測試用例的執行請參考 移植speexdsp到OpenHarmony標準系統⑤
    • 通過分析testdenoise.c源碼,執行測試程序時需要指定一份輸入的不為空的8000Hz的input.pcm音頻,并且需要指定一份空的輸出的output.pcm音頻。rk3568上運行,執行語句如下:
./testdenoise < input.pcm > output.pcm

image.png

  • 4、測試結果:對比輸入的input.pcm和輸出的outpu.pcm的波形圖和聲譜圖,噪聲已經被消除。pc端和rk3568開發板運行testdenoise可執行程序效果一致??蓤绦形募\行成功,使用OpenHarmonyNDK移植三方庫Speexdsp成功

    image.png

知識點附送

1、AIP8的應用如何更改為API9支持64位版本

1.1 API8只支持32位,API9支持32位和64位。

  • 以該PR https://gitee.com/openharmony/applications_app_samples/pulls/759 學習將api8應用適配適配Arm64

  • 1、修改build-profile.json5 ,將compileSdkVersioncompatibleSdkVersion屬性由8改為9

    • compileSdkVersion指定OpenHarmony應用/服務編譯時的SDK版本

    • compatibleSdkVersion指定OpenHarmony應用/服務兼容的最低SDK版本

      image.png

  • 2、修改entry/build-profile.json5,abi添加64位arm64-v8a

    • abiFilters用于設置本機的ABI編譯環境

      image.png

  • 3、修改entry/src/main/config.json,設備類型改為默認

    image.png

  • 4、這個pr改動了XComponent/entry/src/main/cpp/common/plugin_common.h文件,plugin_common.h文件和hilog調試的功能有關。

2、編譯構建子系統如何增加編譯構建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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 移植
    +關注

    關注

    1

    文章

    367

    瀏覽量

    27854
  • 編譯
    +關注

    關注

    0

    文章

    615

    瀏覽量

    32392
  • OpenHarmony
    +關注

    關注

    23

    文章

    3284

    瀏覽量

    15159
收藏 人收藏

    評論

    相關推薦

    【潤和軟件DAYU200開發板體驗】移植speexdspOpenHarmony標準系統④

    看下去的耐心,分享將以連載的方式進行。 下期預告:speexdsp功能分析和功能測試 本期為 移植speexdspOpenHarmony標準系統 的第④期,主要內容如下: @ toc
    的頭像 發表于 10-12 10:11 ?1332次閱讀
    【潤和軟件DAYU200開發板體驗】<b class='flag-5'>移植</b><b class='flag-5'>speexdsp</b>到<b class='flag-5'>OpenHarmony</b>標準系統④

    ffmpeg第三方如何在harmony 3.0上編譯跑通?

    該如何編譯,目前是沒有config.h文件的。因為純新手很多基礎都不懂,之前看過連老師在openharmony 1.0 上的第三方移植,用的是hi3861,但是我嘗試了一下
    發表于 12-20 13:16

    快速移植OpenHarmony三方芯片平臺的方法

    移植概述本文面向希望將OpenHarmony移植三方芯片平臺硬件的開發者,介紹一種借助三方芯片平臺自帶Linux內核的現有能力,快速
    發表于 04-12 11:08

    【PIMF】OpenHarmony啃論文俱樂部—盤點開源鴻蒙三方【1】

    改進這個三方(提交代碼)筆者剛剛開始接觸三方時有一些問題:1.不清楚移植具體某個開源技術到OpenH
    發表于 06-17 19:48

    【PIMF】OpenHarmony啃論文俱樂部—盤點開源鴻蒙三方【2】

    OpenHarmony third_party三方三方(開源)是封裝的軟件功能,可以避免
    發表于 06-29 16:44

    4步成功將三方——speexdsp移植OpenHarmony

    4步成功將三方——speexdsp移植OpenHarmony戰碼先鋒,PR征集令(以下簡稱“戰碼先鋒”)第二期正如火如荼地進行中,涉及O
    發表于 09-27 12:02

    【潤和軟件DAYU200開發板體驗】移植speexdspOpenHarmony標準系統①

    三方主要是基于標準 Linux 系統的 c/c++ 開源,所以三方移植工作,首先是在標準
    發表于 10-06 22:45

    【潤和軟件DAYU200開發板體驗】移植speexdspOpenHarmony標準系統③

    /openharmony-sig/contest/tree/master/2022_OpenHarmony_thirdparty/speexdsp四、將三方
    發表于 10-06 22:51

    【潤和軟件DAYU200開發板體驗】移植speexdspOpenHarmony標準系統④

    /2022_OpenHarmony_thirdparty/speexdsp五、在OpenHarmony編譯體系下增量編譯Speexdsp建議先增量編譯生成
    發表于 10-06 22:53

    【潤和軟件DAYU200開發板體驗】移植speexdspOpenHarmony標準系統⑥

    export_api.txt測試過的api接口tested_api.txt功能測試文檔: 三方_test_function.md內容至少包含羅列出庫所有的功能,已測試過的功能,原生測試邏輯的分析原生
    發表于 10-06 22:56

    【潤和軟件DAYU200開發板體驗】移植speexdspOpenHarmony標準系統功能演示

    該視頻已經同步上傳至硬聲app,賬號名稱離北況歸移植speexdspOpenHarmony標準系統系列文章:【潤和軟件DAYU200開發板體驗】移植
    發表于 11-06 22:35

    OpenHarmony三方適配指南

    本文以OpenHarmony-3.2-Beta4上適配modbus編譯動態為例。獲取三方使用之前要做好代碼溯源,確認可用的版本,開源許可和發布方式等。通過正確的路徑獲取源碼,可以是
    發表于 04-07 09:12

    OpenAtom OpenHarmony 三方創建發布及安全隱私檢測

    OpenAtom OpenHarmony三方(以下簡稱“三方”或“包”),是經過驗證可在OpenHa
    發表于 11-13 17:27

    移植speexdspOpenHarmony標準系統②

    由于想要分享的內容較多,為避免讀者姥爺們失去看下去的耐心,分享將以連載的方式進行。 第一期請點擊查看《移植speexdspOpenHarmony標準系統① 》,本期為移植
    的頭像 發表于 11-30 09:10 ?612次閱讀

    移植speexdspOpenHarmony標準系統的第③

    由于想要分享的內容較多,為避免讀者姥爺們失去看下去的耐心,分享將以連載的方式進行。 前期回顧:《移植speexdspOpenHarmony標準系統② 》《移植
    的頭像 發表于 12-01 12:35 ?821次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>