HarmonyOS NAPI返回自定义对象到ArkTS示例?

如题:HarmonyOS NAPI返回自定义对象到ArkTS示例?

阅读 460
1 个回答

ArkTS侧传递回调方法到NAPI侧,NAPI创建napi\_value指针类型的对象作为参数传递到回调方法,ArkTS调用回调方法获取NAPI侧传入的参数并做修改,NAPI侧获取修改后的参数并输出。

ets:

Button("CallbackToArkTs")
  .onClick(() => {
    let da: Record<string, number> = testNapi.CallbackToArkTs((value: object) => {
      let data: Record<string, number> = value as Record<string, number>;
      console.info("修改前type: " + data["type"].toString())
      console.info(JSON.stringify(value))
      data["type"] += 10
      return value;
    });
    console.info(JSON.stringify(da))
  })

C++:

static bool Napi_AddPropertyInt32(napi_env env, napi_value obj, const char *key, int32_t value) {
  napi_value key_napi = nullptr;
  napi_status status = napi_create_string_utf8(env, key, NAPI_AUTO_LENGTH, &key_napi);

  napi_value value_napi = nullptr;
  status = napi_create_int32(env, value, &value_napi);
  status = napi_set_property(env, obj, key_napi, value_napi);
  return true;
}

static napi_value CallbackToArkTs(napi_env env, napi_callback_info info) {
  // 获取ArkTS参数
  size_t argc = 1;
  napi_value js_cb = nullptr;
  napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr);
  // native回调到ts层的object
  napi_value argv = nullptr;
  napi_create_object(env, &argv);
  Napi_AddPropertyInt32(env, argv, "type", 1);
  Napi_AddPropertyInt32(env, argv, "index", 2);
  // native回调到ts层
  napi_value result = nullptr;
  napi_call_function(env, NULL, js_cb, 1, &argv, &result);
  napi_value typeNumber = nullptr;
  napi_get_named_property(env, result, "type", &typeNumber);
  int32_t number;
  napi_get_value_int32(env, typeNumber, &number);
  OH_LOG_INFO(LOG_APP, "修改后type: %{public}d", number);
  // 返回修改后的object
  return result;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进