戰(zhàn)碼先鋒,PR征集令(以下簡稱“戰(zhàn)碼先鋒”)第二期正如火如荼地進行中,涉及OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)主干倉、SIG倉、三方庫,共計1000+代碼倉任君挑戰(zhàn)。
在戰(zhàn)碼先鋒活動中,我們注意到開發(fā)者對三方庫移植有著濃厚的興趣。三方庫是基于標準Linux系統(tǒng)的C/C++開源庫,例如OpenCV、LZMA壓縮算法、ZXing-cpp圖像處理庫,三方庫移植能為OpenHarmony項目補齊更多功能或組件,對繁榮生態(tài)非常重要。
三方庫移植也為參與OpenHarmony貢獻提供了另外一種思路,我們希望通過實戰(zhàn)經(jīng)驗的分享鼓勵更多感興趣的開發(fā)者動手移植自己心儀的三方庫。為此,我們邀請目前還是一名大三學(xué)生,也是戰(zhàn)碼先鋒優(yōu)秀貢獻者,OpenHarmony啃論文俱樂部優(yōu)秀學(xué)員——賈佳豪(社區(qū)網(wǎng)名:離北況歸)進行分享,他在完成了一個三方庫在OpenHarmony標準系統(tǒng)上的移植工作后,總結(jié)了以下經(jīng)驗。
四步實現(xiàn)三方庫移植:1、在Linux下編譯要移植的三倉庫,分析編譯過程;2、將要移植的三方庫加入編譯框架中以及產(chǎn)品引用;3、增量編譯出動態(tài)鏈接庫和可執(zhí)行文件推送到開發(fā)板上;4、在開發(fā)板上驗證移植是否成功、API接口導(dǎo)出。
第一步
三方庫下載最新分支代碼后在Linux下編譯,分析編譯過程。 觀察原生庫目錄結(jié)構(gòu)或者Readme可以知道該如何編譯,一般有如下兩種編譯方式: ①在原生庫根目錄中,存在CMakeLists.txt文件。在原生庫下新建build目錄通過cmake或者cmake-gui生成makeflie然后make。 ②在原生庫目錄中存在autogen.sh,configure.ac文件,原生庫使用Makefile.am構(gòu)建,./autogen.sh再./configure命令生成Makefile,最后make、make install。
在Linux下編譯原生庫要配置好編譯環(huán)境,安裝cmake、make、automake等工具。
分析編譯過程:
提取編譯出動態(tài)鏈接庫和測試用的可執(zhí)行文件需要的源文件和頭文件、編譯時添加的cflag、編譯器參數(shù)以及編譯需要鏈接的庫。該過程分為如下兩種情況:
①在cmake生成makefile的過程中分析build.make、depend.make、flags.make、link.txt等得出三方庫對應(yīng)的依賴關(guān)系。
②使用Makefile.am構(gòu)建的三方庫通過分析make.am內(nèi)容可以直接分析編譯動態(tài)鏈接庫和測試用的可執(zhí)行文件需要哪些源文件,而編譯需要添加的編譯器參數(shù)和需要鏈接的庫則通過分析三方庫父目錄makefile文件提取。
第二步
根據(jù)第一步分析得到的結(jié)果把三方庫加入OpenHarmony編譯構(gòu)建體系。 ①定義子系統(tǒng)并加入編譯框架。首先把三方庫放置在OpenHarmony源碼third_party目錄下作為子系統(tǒng)目錄。子系統(tǒng)目錄下創(chuàng)建ohos.build文件,構(gòu)建時會先讀取該文件。
把子系統(tǒng)配置到build/subsystem_config.json.
②定義組件并加入子系統(tǒng):在上述定義子系統(tǒng)時添加的ohos.build文件中,我們已經(jīng)定義好了對應(yīng)的組件。
module_list所定義的為該組件的目標,上述定義的目標為測試用的可執(zhí)行文件。
③定義目標并加入組件:在編寫gn文的時候,我們定義的動態(tài)庫以及測試可執(zhí)行程序都是我們的目標模塊,在每個目標模塊中添加對應(yīng)的組件名后即將我們的目標模塊加入該組件中。
④產(chǎn)品引用:把子系統(tǒng)及其組件加入產(chǎn)品定義中,以rk3568為例,產(chǎn)品定義文件存在vendor/hihope/rk3568/config.json,以下內(nèi)容添加到config.json中:
第三步
增量編譯出動態(tài)鏈接庫和可執(zhí)行文件,在OpenHarmony源碼執(zhí)行。
./build.sh --product-name rk3568 --ccache --build-target=移植的三方庫名稱 --target-cpu arm64
(ohos更新到3.2版本后,支持64位系統(tǒng)的編譯,默認情況下編譯的都是32位系統(tǒng),在編譯命令中添加--target-cpu arm64即可構(gòu)建64位系統(tǒng))
第一次編譯可能會報錯,我們根據(jù)報錯信息調(diào)整編寫的gn文件。消除clang編譯警告,例如-Wimplicit-function-declaration改為-Wno-implicit-function-declaration添加到gn文的cflags信息里面。不推薦直接全量編譯出鏡像燒錄到開發(fā)板上。將耗費較多時間,也不便編譯調(diào)試。編譯成功生成的動態(tài)鏈接庫和測試用的可執(zhí)行文件在out目錄下。
第四步
在開發(fā)板上驗證移植是否成功、API接口導(dǎo)出。
利用hdc_std工具將編譯出的so動態(tài)鏈接庫和測試用的可執(zhí)行文件放到開發(fā)板上,驗證移植的三方庫功能是否正常。
API是指應(yīng)用程序編程接口,通過API接口可以實現(xiàn)指定的功能,而不需要了解其內(nèi)部實現(xiàn)細節(jié)。API接口導(dǎo)出在pc端,需要編譯生成的動態(tài)鏈接庫和測試用的可執(zhí)行文件。API接口導(dǎo)出思路如下:
①新建allHeads.h,該頭文件中包含所有庫對外導(dǎo)出的頭文件
②新增allDySos目錄,該目錄下放置生成的動態(tài)庫
③新增allTests目錄,該目錄下放置所有生成的測試用的可執(zhí)行文件
④新建自動化測試腳本export_interface.sh,腳本如下,執(zhí)行時需要給腳本傳入編譯頭文件的參數(shù)例如./export_interface.sh -I頭文件所在路徑-D宏定義(編譯所有動態(tài)庫時,cflags/cflags_cc中的參數(shù))
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}
以上是部分代碼展現(xiàn),閱覽全部代碼請打開鏈接
https://gitee.com/openharmony-sig/contest/tree/master/2022_OpenHarmony_thirdparty/speexdsp
再次總結(jié)四步要點:1、在Linux下編譯要移植的三倉庫,分析編譯過程;2、將要移植的三方庫加入編譯框架中以及產(chǎn)品引用;3、增量編譯出動態(tài)鏈接庫和可執(zhí)行文件推送到開發(fā)板上。4、在開發(fā)板上驗證移植是否成功、API接口導(dǎo)出。
備注:三方庫的移植需要搭建好OpenHarmony南向開發(fā)環(huán)境,也需要有開發(fā)板和掌握hdc_std工具的使用。另外,這樣移植有一個前提,與平臺無關(guān)(即庫不涉及對os_api有依賴,不涉及opensl以及opengl,ohos上這兩個庫和業(yè)界的有一定差異,不涉及硬件,不涉及驅(qū)動)。
-
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
593瀏覽量
27392 -
編譯
+關(guān)注
關(guān)注
0文章
657瀏覽量
32852 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3713瀏覽量
16254
原文標題:4步成功將三方庫——speexdsp移植到OpenHarmony
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論