HarmonyOS 鸿蒙Next napi中如何写回调给arkts层

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next napi中如何写回调给arkts层

目前在cpp中调用了c++ sdk提供的获取预约会议列表方法如下:
MeetingApi_GetAppointmentsInfo(MeetingAttendListParam* param, MeetingAppointmentsInfo *info, ApiAsyncCallback callback)

其中ApiAsyncCallback如下:
typedef void(*ApiAsyncCallback)(int type, int result);

该方法最后设置了异步回调方法api_result_callback。方法具体实现如下:

void api_result_callback(int type, int result) {
// 处理异步请求的数据
if (type == 1) {
// 处理预约列表结果
} else if (type == 2) {
// 处理其他请求结果
}
}

请教如何在api_result_callback方法内部实现将获取到的数据回调给arkts层。api_result_callback方法是接收所有c++ sdk所有接口的回调方法

2 回复

开发者你好,可以使用函数napi_create_object将C++中的结构体封装成Object传递给ArkTS侧调用,参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/napi-data-types-interfaces-V5#object相关

可以参考以下demo实现将结构体中的数据回调给 ArkTS中:

//创建类Struct用于接收C++侧结构体中的数据
export class Struct{
  age: number = 0;
  name: string = 'example';
};

export class tsClass{ public onCallBack1(age: number){ //对age进行操作 console.log(“testcallback1” + age) } public onCallBack2(name: string){ //对name进行操作 console.log(“testcallback2” + name) } public onCallBack3(cbStruct: Struct){ //对cbStruct进行操作 console.log("testcallback3 " + cbStruct.age + " " + cbStruct.name) } }

.d.ts文件:

export const transObject: (a: Object) => void;

cpp文件:

//定义一个结构体
struct Person{
int age;
std::string name;
};

static napi_value TransObject(napi_env env, napi_callback_info info){ napi_status status; size_t argc = 1; napi_value js_cb;

status = napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr);

// 获取TS 对象的函数 oncallback3 napi_value oncallback3, arg_object; status = napi_get_named_property(env, js_cb, “onCallBack3”, &oncallback3); // native 层创建对象arg_object status = napi_create_object(env, &arg_object); napi_value age, name, cbargc; Person person; person.name = “Alice”; person.age = 30; //给arg_object对象的属性age赋值 status = napi_create_int32(env, person.age, &age); status = napi_set_named_property(env, arg_object, “age”, age); //给arg_object对象的属性name赋值 const char* p1name = person.name.c_str(); status = napi_create_string_utf8(env, p1name, sizeof(person.name), &name); status = napi_set_named_property(env, arg_object, “name”, name);

// 调用TS 对象的方法 onCallBack3,并将上面创建的对象arg_object,作为函数参数传递
status = napi_call_function(env, js_cb, oncallback3, 1, &arg_object, nullptr);

return nullptr;

}

EXTERN_C_START static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor desc[] = { { “transObject”, nullptr, TransObject, nullptr, nullptr, nullptr, napi_default, nullptr} }; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; } EXTERN_C_END

在HarmonyOS鸿蒙系统中,通过NAPI(Native API)与ArkTS(ArkUI TypeScript)层进行交互时,回调函数的实现涉及到底层代码与UI层的桥接。具体步骤如下:

  1. 定义NAPI接口:首先,在NAPI层定义一个回调类型及相应的注册函数。此函数负责将回调函数指针传递给ArkTS层。确保使用适当的数据结构存储这些回调,以便后续调用。

  2. 实现回调机制:在NAPI层实现触发回调的逻辑。当特定事件发生时(如传感器数据更新、网络响应等),调用存储的回调函数指针,传递相关数据。

  3. ArkTS层接收回调:在ArkTS层,通过NAPI接口注册一个回调函数。该函数需设计为接收来自NAPI层的数据,并处理这些数据,例如更新UI。

  4. 跨语言数据传递:确保NAPI与ArkTS之间传递的数据结构兼容,并正确管理内存。可能需要进行数据格式的转换和内存管理(如使用智能指针或手动管理内存释放)。

通过上述步骤,NAPI层可以成功地将回调信息传递给ArkTS层,实现底层与UI层的通信。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部