OpenHarmony—三方庫適配指南
獲取三方庫
使用之前要做好代碼溯源,確認可用的版本,開源許可和發(fā)布方式等。
通過正確的路徑獲取源碼,可以是官網(wǎng),或者指定托管的github或者gitee倉。
官網(wǎng):https://libmodbus.org/github:https://github.com/stephane/libmodbus
移植三方庫
三方庫移植主要需要以下四步。
linux編譯
編譯三方庫:
1、如果原三方庫根目錄存在CMakeLists.txt文件,新建build目錄,通過cmake生成makeflie然后make。
2、如果根目錄存在autogen.sh或configure.ac文件,使用Makefile.am構建,先執(zhí)行./autogen.sh,再執(zhí)行./configure命令生成Makefile,最后make和make install。
分析編譯過程:
提取編譯動態(tài)鏈接庫和測試用的可執(zhí)行文件所需要的源文件和頭文件、編譯添加的cflag和其他編譯器參數(shù),以及編譯需要的鏈接庫。
根據(jù)三方庫的編譯有兩種情況:
1、在cmake生成makefile的過程中,分析build.make(生成目標的源文件)、depend.make(需要依賴的其他C源文件)、flags.make(cflags相關標記)、link.txt(鏈接庫相關信息)等得出三方庫對應的依賴關系。
2、使用Makefile.am構建的三方庫,分析make.am內(nèi)容,分析編譯動態(tài)鏈接庫和測試用的可執(zhí)行文件需要的源文件,添加的編譯器參數(shù)。鏈接庫則通過分析makefile文件提取。
OpenHarmony適配
三方庫一般放置在third_party目錄下。
編譯之前要增加模塊配置,可以參考以下鏈接:
https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-module.md#新增并編譯模塊
部件名:modbus_part_name = “l(fā)ibmodbus”
子系統(tǒng)名:modbus_subsystem_name = “modbus”
新增子系統(tǒng)和部件名的方式:
1、在模塊目錄下配置BUILD.gn,根據(jù)模板類型選擇對應的gn模板
2、在新建的子系統(tǒng)目錄下每個部件對應的文件夾下創(chuàng)建bundle.json文件,定義部件信息。
3、修改build目錄下的subsystem_config.json文件。
4、在vendor/{product_company}/{product-name}目錄下的產(chǎn)品配置如product-name是hispark_taurus_standard時,在config.json中添加對應的部件,直接添加到原有部件后即可。
這幾步適配都需要根據(jù)三方庫的引用方式來確定,并不需要每步都配置。如果當前模塊是需要添加到已經(jīng)有的部件或子系統(tǒng),就只需要配置1和2步即可。
增量編譯
編譯動態(tài)鏈接庫和可執(zhí)行文件:
./build.sh --product-name rk3568 --ccache --build-target三方庫名稱 --target-cpu arm64
注:ohos到3.2版本之后,默認編譯的都是32位系統(tǒng),若要支持64位系統(tǒng),在編譯命令中添加–target-cpu arm64
例如:./build.sh --product-name rk3568 --ccache -T libmodbus
編譯過程可能出現(xiàn)報錯,根據(jù)報錯信息調(diào)整gn。消除編譯警告,例如:-Wimplicit-function-declaration改為-Wno-implicit-function-declaration加到gn的cflags信息里面。
編譯成功生成的動態(tài)鏈接庫和測試用的可執(zhí)行文件在out目錄下。
例如:out/ rk3568/modbus/libmodbus/libmodbus.z.so
驗證接口
將編譯好的動態(tài)庫和測試用例的可執(zhí)行文件推送到開發(fā)板上。然后驗證是否成功,保證測試用例都能在開發(fā)板上運行通過。
API接口是提供給北向調(diào)用的,實現(xiàn)指定的功能,使用者不需要了解其內(nèi)部具體實現(xiàn)。
按照業(yè)務需要提供native和js接口。
引用方式
靜態(tài)庫
在部件中需要使用的gn中配置deps項,然后在代碼中直接引用接口。
例如:
動態(tài)庫
先編譯動態(tài)庫,然后放在板子指定路徑,然后通過dlopen導入動態(tài)庫,最后在代碼中通過句柄調(diào)引用接口。例如: