HarmonyOS 鸿蒙Next C++创建的线程如何获取napi_env并通过napi_call_function调用JS对象的方法?

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next C++创建的线程如何获取napi_env并通过napi_call_function调用JS对象的方法?

HarmonyOS C++创建的线程如何获取napi_env并通过napi_call_function调用JS对象的方法?

2 回复

可以参考下面代码:

1、处理从TS层传下来的函数

// 从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);

2、其他线程中调用线程安全函数

// 其他线程中调用线程安全函数 
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();

3、线程安全函数回调函数

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); 
}

在HarmonyOS鸿蒙系统中,如果你在使用Next C++创建线程并希望在该线程中获取napi_env以调用JS对象的方法,可以通过以下步骤实现:

  1. 确保线程同步:由于napi_env是与特定线程关联的,你需要确保在创建线程之前,已经在一个已关联的线程(通常是主线程)中获取到napi_env

  2. 传递napi_env:通过线程参数将napi_env传递给新线程。但注意,napi_env的生命周期和线程安全性需要仔细管理,确保在新线程中使用时仍然有效。

  3. 使用napi_call_thread_safe_function:由于napi_env不是线程安全的,直接在非创建线程中使用可能导致未定义行为。建议使用napi_call_thread_safe_function进行跨线程调用,这个函数允许你将任务安全地从非主线程发送到主线程执行。

  4. 调用JS方法:在主线程中,通过napi_call_function执行JS对象的方法。

请注意,跨线程操作napi_env涉及到复杂的线程管理和同步问题,务必确保你的实现符合HarmonyOS的线程模型和安全要求。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部