HarmonyOS napi如何传递一个对象,然后C++侧调用这个对象内部的回调方法

HarmonyOS napi如何传递一个对象,然后C++侧调用这个对象内部的回调方法。

HarmonyOS
2024-09-11 11:59:48
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

参考代码:

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; 
} 
EXTERN_C_START 
static napi_value Init(napi_env env, napi_value exports) 
{ 
  napi_property_descriptor desc[] = { 
  { "CallbackToArkTs", nullptr, CallbackToArkTs, nullptr, nullptr, nullptr, napi_default, nullptr } 
}; 
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
return exports; 
} 
EXTERN_C_END 
export const CallbackToArkTs: (a: object) => Record<string, number>; 
.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)) 
})
分享
微博
QQ
微信
回复
2024-09-11 17:24:48
相关问题
如何实现ArkTS与C/C++对象传递
438浏览 • 1回复 待解决
ArkTS对象绑定C++对象如何回收?
749浏览 • 1回复 待解决
如何在Native构建一个ArkTS对象
1974浏览 • 1回复 待解决
如何C/C++ 创建ArkTS对象
2038浏览 • 1回复 待解决
如何C++ 提供函数?
2282浏览 • 1回复 待解决
c++可以直接调用tsstatic方法吗?
1881浏览 • 1回复 待解决
如何判断一个对象是否在对象数组中
2179浏览 • 1回复 待解决
PersistentStorage如何持久化一个对象?
2711浏览 • 1回复 待解决
如何定义一个未知类型对象
647浏览 • 2回复 待解决
C++调用ArkTS 定义方法
1657浏览 • 1回复 待解决
在Native释放ArkTS对象方法
311浏览 • 1回复 待解决