HarmonyOS在C++线程上调用napi_create_ark_runtime,如何调用到js层的对象

在C++ 线程上调用napi_create_ark_runtime。C++ 线程上做数据回调,需要用到主线程创建的ts对象。现在不知道怎么在c++ 线程拿到这个ts对象。https://gitee.com/openharmony/docs/blob/0bb3eaccb8760c5515bfa3ffa82711f9be6f1338/zh-cn/application-dev/napi/use-napi-ark-runtime.md

这个文档,只描述了怎么在C++ 调用ts层的静态方法,没写怎么调用对象的方法。

HarmonyOS
2024-09-11 11:58:12
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get

可参考以下实现:

// 子线程运行函数 
static void CallJs(napi_env env, napi_value js_cb, void *context, void *data) 
{ 
  // 获取引用值 
  napi_get_reference_value(env, cbObj, &js_cb); 
  // 创建一个ArkTS number作为ArkTS function的入参。 
  napi_value argv; 
  napi_create_int32(env, cValue, &argv); 
  napi_value result = nullptr; 
  napi_call_function(env, nullptr, js_cb, 1, &argv, &result); 
  napi_get_value_int32(env, result, &cValue); 
} 
// Native 主线程 
static napi_value ThreadsTest(napi_env env, napi_callback_info info) 
{ 
  // 从ArkTS侧获取的参数的数量 
  size_t argc = 1; 
  napi_value js_cb, work_name; 
  // 获取ArkTS参数 
  napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr); 
  // 指向napi_value js_cb 的 napi_ref cbObj 
  napi_create_reference(env, js_cb, 1, &cbObj); 
  // 通过UTF8编码的C字符串数据创建work_name 
  napi_create_string_utf8(env, “Work Item”, NAPI_AUTO_LENGTH, &work_name); 
  // 创建线程安全函数 
  napi_create_threadsafe_function(env, js_cb, NULL, work_name, 0, 1, NULL, NULL, NULL, CallJs, &tsfn); 
  // 其他线程中调用线程安全函数 
  std::thread t( { 
  // 可获取线程ID 
  std::thread::id this_id = std::this_thread::get_id(); 
  napi_acquire_threadsafe_function(tsfn); 
  napi_call_threadsafe_function(tsfn, NULL, napi_tsfn_blocking); 
}); 
  t.detach(); 
  return NULL; 
}
分享
微博
QQ
微信
回复
2024-09-11 15:17:30
相关问题
c/c++主动调用ArkTS存在问题
380浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
1037浏览 • 1回复 待解决
ArkTS通过接口访问C++对象
371浏览 • 1回复 待解决
HarmonyOS 如何调用标准C++
465浏览 • 1回复 待解决
NAPI线程调用TS线程函数
1253浏览 • 1回复 待解决
HarmonyOS nativejs代码调用
51浏览 • 1回复 待解决