如何实现ArkTS与C/C++的对象传递

如何实现ArkTS与C/C++的对象传递

HarmonyOS
2024-07-21 19:13:52
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
e_lion

ArkTS类对象传递至NAPI侧;

NAPI获取对象属性并输出;

NAPI调用对象方法。

// Animals类 
class Animals { 
  name: string 
  age: number 
 
  constructor(name: string, age: number) { 
    this.name = name; 
    this.age = age; 
  } 
 
  add(a: number, b: number): number { 
    return a + b; 
  } 
}
// ArkTS传递对象中 
Button("TestObject") 
  .onClick(() => { 
    let ani:Animals = new Animals('Bob',5) 
    testNapi.TestObject(ani) 
  })
// NAPI接受对象并处理 
static napi_value TestObject(napi_env env, napi_callback_info info) { 
  size_t argc = 1; 
  napi_value args[1] = {nullptr}; 
  napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
 
  napi_value name, age; 
  napi_get_named_property(env, args[0], "name", &name); 
  napi_get_named_property(env, args[0], "age", &age); 
 
  size_t itemLength; 
  napi_get_value_string_utf8(env, name, nullptr, 0, &itemLength); 
  char *str = new char[itemLength + 1]; 
  napi_get_value_string_utf8(env, name, &str[0], itemLength + 1, &itemLength); 
  OH_LOG_INFO(LOG_APP, "name is %{public}s", str); 
  uint32_t num; 
  napi_get_value_uint32(env, age, &num); 
  OH_LOG_INFO(LOG_APP, "age is %{public}d", num); 
 
  napi_value add; 
  napi_get_named_property(env, args[0], "add", &add); 
 
  // 创建参数数组 
  napi_value arr[2]; 
  napi_create_int32(env, 10, &arr[0]); 
  napi_create_int32(env, 5, &arr[1]); 
 
  napi_value result; 
  uint32_t res; 
  napi_call_function(env, args[0], add, 2, arr, &result); 
  napi_get_value_uint32(env, result, &res); 
  OH_LOG_INFO(LOG_APP, "res is %{public}d", res); 
 
  return nullptr; 
}

ArkTS侧传递回调方法到NAPI侧;

NAPI创建napi_value指针类型的对象作为参数传递到回调方法;

ArkTS调用回调方法获取NAPI侧传入的参数并做修改;

NAPI侧获取修改后的参数并输出。

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)) 
  })
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); 
 
  // 获取ts修改后的object 
  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; 
}
分享
微博
QQ
微信
回复
2024-07-22 11:18:05
提问
该提问已有0人参与 ,帮助了0人