HarmonyOS Node-API C++结构体的List如何进行数据类型转换后传回ArkTS?

如题:HarmonyOS Node-API C++结构体的List如何进行数据类型转换后传回ArkTS?

阅读 500
1 个回答

可以使用函数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

通过napi\_create\_object创建object,传这个object给ArkTS,传递的这个object里包含了每一个结构体object,通过napi\_set\_named\_property把每一个结构体的object添加进去。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进