HarmonyOS C++子线程调用ArkTS业务层接口方法

我们在native(C++)层创建了子线程,需要在子线程中回调数据到ArkTS业务层,但是napi_env是线程相关的,怎样才能在子线程中获取napi_env实例。或者有其他最佳方式达到这个目的。

HarmonyOS  C++子线程调用ArkTS业务层接口方法  -鸿蒙开发者社区

HarmonyOS
4天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

在ArkTS侧调用安全函数,里面传递了一个回调函数:

entry.threadsTest((value:number) => {
  value += 10
  this.cnt += 20
  hilog.info(0x0000, 'testTag', 'js callback value = ' + value + " , cnt = " + this.cnt);
  this.value = value;
  return value
})

在c++侧创建一个安全函数tsfn,并把ArkTS的回调函数和CallJS绑定:

// 定义线程数据结构体
struct ThreadSafeInfo {
  int sum;
};
// 实例化结构体
struct ThreadSafeInfo threadInfo = { 2 };
// 指向napi_value js_cb
napi_ref cbObj = nullptr;
// 线程安全函数
napi_threadsafe_function tsfn;
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([]() {
napi_acquire_threadsafe_function(tsfn);
struct ThreadSafeInfo *data = &threadInfo;
napi_call_threadsafe_function(tsfn, data, napi_tsfn_blocking);
//这里的data是回调函数的入参,从别的线程拿到的数据从这里传入,注意:跨线程数据 data 引用指向的实际地址,不能随着 other 线程结束而被销毁
});
  t.detach(); return NULL;
}
//处理回调函数的逻辑写在这里
static void CallJs(napi_env env, napi_value js_cb, void *context, void* data)
{

std::thread::id this_id = std::this_thread::get_id();
std::hash<std::thread::id> hash_fn;
OH_LOG_INFO(LOG_APP, "thread id 3 = %{public}d", static_cast<int>(hash_fn(this_id)));
// 获取引用值
napi_value js_cb2 = nullptr;
napi_get_reference_value(env, cbObj, &js_cb2);

// 创建一个ArkTS number作为ArkTS function的入参。
napi_value argv;
struct ThreadSafeInfo *arg = (struct ThreadSafeInfo *)data;
OH_LOG_INFO(LOG_APP, "x = %{public}d", arg->sum);
napi_create_int64(env, arg->sum, &argv);

napi_value result = nullptr;
napi_call_function(env, nullptr, js_cb2, 1, &argv, &result);//在这里调用Arkts侧的回调函数
napi_get_value_int32(env, result, &cValue);
}
分享
微博
QQ
微信
回复
4天前
相关问题
ArkTS通过接口访问C++对象
409浏览 • 1回复 待解决
c/c++主动调用ArkTS存在问题
486浏览 • 1回复 待解决
C++调用ArkTS 定义的方法
2124浏览 • 1回复 待解决
HarmonyOSC++触发通知到ArkTS
153浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
1133浏览 • 1回复 待解决
HarmonyOS C++如何同步调用JS函数 -
99浏览 • 0回复 待解决
HarmonyOS C++ 调用 ets 函数报错闪退
101浏览 • 1回复 待解决
ArkTSC++互相直接调用
2381浏览 • 1回复 待解决