HarmonyOS鸿蒙Next中NAPI如何在子线程中调用arkts的api

HarmonyOS鸿蒙Next中NAPI如何在子线程中调用arkts的api 应用主要业务逻辑是c++代码,因为很多系统api未提供napi的接口,故需要调用arkts的api,所以怎么在napi中调用arkts的api接口?

3 回复

跨线程调用可通过napi_create_thread_safe_function

// 指向napi_value js_cb

napi_ref cbObj = nullptr;

// 线程安全函数

napi_threadsafe_function tsfn;

// Native侧Value值

static int cValue;

// 子线程运行函数

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

static napi_value SetValue(napi_env env, napi_callback_info info)
{
  // 从ArkTS侧获取的参数的数量
  size_t argc = 1;
  napi_value jsValue;
  // 获取ArkTS参数
  napi_get_cb_info(env, info, &argc, &jsValue, nullptr, nullptr);
  napi_get_value_int32(env, jsValue, &cValue);
  return nullptr;
}

static napi_value GetValue(napi_env env, napi_callback_info info)
{
  napi_value jsValue;
  napi_create_int32(env, cValue, &jsValue);
  return jsValue;
}

跨线程调用可通过napi_create_thread_safe_function

EXTERN_C_START

static napi_value Init(napi_env env, napi_value exports)
{
  napi_property_descriptor desc[] = {
  {"threadsTest", nullptr, ThreadsTest, nullptr}};
}

更多关于HarmonyOS鸿蒙Next中NAPI如何在子线程中调用arkts的api的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,NAPI(Native API)允许在子线程中调用ArkTS的API。实现这一功能的关键是通过napi_create_threadsafe_function创建一个线程安全的函数,然后在子线程中调用该函数来执行ArkTS的API。

首先,使用napi_create_threadsafe_function创建一个线程安全的函数,该函数可以在子线程中被调用。然后,在子线程中通过napi_call_threadsafe_function来调用该函数,从而间接调用ArkTS的API。

具体步骤如下:

  1. 创建线程安全函数:在主线程中使用napi_create_threadsafe_function创建一个线程安全的函数,并指定回调函数。回调函数将在子线程中被调用。

  2. 调用线程安全函数:在子线程中通过napi_call_threadsafe_function来调用之前创建的线程安全函数,从而触发回调函数的执行。

  3. 执行ArkTS API:在回调函数中执行ArkTS的API。

  4. 释放资源:在不需要时,使用napi_release_threadsafe_function释放线程安全函数的资源。

通过这种方式,可以在子线程中安全地调用ArkTS的API,避免直接在主线程中执行耗时操作,从而提高应用的性能和响应速度。

在HarmonyOS鸿蒙Next中,NAPI(Native API)允许在子线程中调用ArkTS的API。具体步骤如下:

  1. 创建子线程:使用pthread_createuv_thread_create等函数创建子线程。

  2. 初始化NAPI环境:在子线程中调用napi_create_async_work初始化NAPI环境。

  3. 调用ArkTS API:通过napi_call_functionnapi_get_property等函数调用ArkTS的API。

  4. 处理异步操作:使用napi_queue_async_work将任务加入队列,确保异步操作正确执行。

  5. 清理资源:任务完成后,调用napi_delete_async_work释放资源。

注意:确保线程安全和正确的生命周期管理,避免内存泄漏和竞态条件。

回到顶部