【鴻蒙開發】建立第一個Feature
目錄:
原始碼裡是有Feature的示例的,但當自己寫一個自己的Feature時,卻遇到了各種問題,有些是示例程式碼和文件沒有說明的小坑,這裡記錄一下。因原始碼裡的startup目錄沒有任何程式碼,就選擇它來存放程式碼。
BUILD.gn檔案裡的source_set("startup")需要修改成 static_library("startup")。
source_set 應該是不會打包進去還是什麼,程式碼不會被執行,修改成static_library發現bin檔案也增大了一些。
使用SYSEX_FEATURE_INIT(Init);進行初始化即可,可不使用SYS_RUN()和CORE_INI()巨集。
直接使用SAMGR_GetInstance()->RegisterFeature(),並不能啟動Feature。Feature的啟動需要配全Service一塊使用,在使用SAMGR_GetInstance()->RegisterFeature()前需要先SAMGR_GetInstance()->RegisterService()註冊一個同命的Service才行。這點是最坑的地址,註冊Feature時引數是Service名稱字串,所以就很容易想到直接註冊就可以了,結束事實證明這樣是行不通的。
標頭檔案的順序,#include <ohos_init.h>要在#include "hctest.h"之前,否則SYSEX_FEATURE_INIT引用的是hos_init.h裡的宣告,而不是ohos_init.h檔案裡的宣告
下面看一下新增Feature的正確方式:
1. 建立Service變數
static const char *GetName(Service *service); static BOOL Initialize(Service *service, Identity identity); static BOOL MessageHandle(Service *service, Request *msg); static TaskConfig GetTaskConfig(Service *service); static Service g_exampleService={ .GetName=GetName, .Initialize=Initialize, .MessageHandle=MessageHandle, .GetTaskConfig=GetTaskConfig };
2. 建立Feature變數
這裡定義Feature沒有直接使用Feature進行定義,而是使用了原始碼示例中的另一種方式,即同類型定義。
typedef struct DemoApi{ INHERIT_IUNKNOWN; BOOL (*AsyncCall)(IUnknown *iUnknown, const char *buff); BOOL (*SyncCall)(IUnknown *iUnknown,struct Payload *payload); } DemoApi; typedef struct DemoFeature{ INHERIT_FEATURE; INHERIT_IUNKNOWNENTRY(DemoApi); Identity identity; } DemoFeature; static BOOL AsyncCall(IUnknown *iUnknown, const char *body); static BOOL SyncCall(IUnknown *iUnknown, struct Payload *payload); static const char* FEATURE_GetName(Feature *feature); static void FEATURE_OnInitialize(Feature *feature, Service* parent, Identity identity); static void FEATURE_OnStop(Feature *feature, Identity identity); static BOOL FEATURE_OnMessage(Feature *feature, Request *request);
3. 註冊Service&Feature
SAMGR_GetInstance()->RegisterService(&g_exampleService);
SAMGR_GetInstance()->RegisterFeature(EXAMPLE_SERVICE,(Feature*)&g_example);
SAMGR_GetInstance()->RegisterFeatureApi(EXAMPLE_SERVICE,EXAMPLE_FEATURE,GET_IUNKNOWN(g_example));
4. 新增初始化
SYSEX_FEATURE_INIT(Init);
做完以上步驟後編譯燒寫到wifi-iot開發板後就可以看到Feature能被正常初始化了。當然上面只是貼出了核心程式碼,宣告的方法還是需要再實現一下的,下面是完整的程式碼。
作者:mb5f8960971f61a
想了解更多內容,請訪問: 51CTO和華為官方戰略合作共建的鴻蒙技術社群https://harmonyos.51cto.com