HarmonyOS鸿蒙NEXT中如何实现Native线程调用ArkTS线程?

HarmonyOS鸿蒙NEXT中如何实现Native线程调用ArkTS线程?

3 回复

在C++侧创建ArkTS线程安全函数:

CallbackObj *callBack = new CallbackObj();

static napi_value NAPI_Global_setCallback(napi_env env, napi_callback_info info) {
  size_t argc = 1;
  napi_value args[1] = {nullptr};
  napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  
  CallbackObj *downLoadCallBack = new CallbackObj();
  napi_value workName;
  // 指向napi_value js_cb 的 napi_ref cbObj,js_cb为获取到的arkts回调方法
  napi_create_reference(env, args[0], 1, &callBack->cbObj);
  // 通过UTF8编码的C字符串数据创建work_name
  napi_create_string_utf8(env, "DownLoadCallBack Work", NAPI_AUTO_LENGTH, &workName);
  // 创建线程安全函数,存到tsfn中
  napi_create_threadsafe_function(env, args[0], NULL, workName, 0, 1, NULL, NULL, NULL, downLoadCallback, &callBack->tsfn);
  
  return nullptr;
}

void downLoadCallback(napi_env env, napi_value js_cb, void *context, void *data) {
  int connectState = *(int *)data;
  // 获取引用值
  OH_LOG_INFO(LOG_APP, "进入connectStateCallback");
  // 创建一个ArkTS number作为ArkTS function的入参。
  napi_value argv;
  napi_create_int32(env, connectState, &argv);
  
  // 调用回调函数
  int num;
  napi_value result = nullptr;
  napi_call_function(env, nullptr, js_cb, 1, &argv, &result);
  napi_get_value_int32(env, result, &num);
}

在C++的子线程中调用ArkTS方法:

在子线程中获取线程安全函数并执行:
napi_acquire_threadsafe_function(callBack->tsfn);
napi_call_threadsafe_function(callBack->tsfn, connectState, napi_tsfn_blocking);

在ArkTS中调用函数:

import nativeFun from 'libentry.so';
@Entry
@Component
struct Index {
  @State message: string = '';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .onClick(() => {
          nativeFun.nativeCallArkTS((a: number) => {
            a++;
            this.message = a.toString()
            return a });
          })
        }
      .width('100%')
      }
    .height('100%')
  }
}

更多关于HarmonyOS鸿蒙NEXT中如何实现Native线程调用ArkTS线程?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS NEXT中,通过Native API的napi_create_threadnapi_call_function实现Native线程调用ArkTS线程。具体步骤:1) Native层使用napi_get_uv_event_loop获取事件循环;2) 通过napi_create_function创建可调用ArkTS的Native函数;3) 使用uv_queue_work将任务投递到ArkTS线程。注意需处理线程安全,使用napi_acquire_threadsafe_functionnapi_release_threadsafe_function进行同步。

在HarmonyOS Next中实现Native线程调用ArkTS线程,可以通过Native API与ArkTS的交互机制来完成。主要步骤如下:

  1. 使用NAPI机制:通过Node-API(NAPI)建立Native与ArkTS的通信桥梁。在Native侧创建napi_env环境,通过napi_call_function调用ArkTS侧注册的回调函数。

  2. 线程安全处理:由于Native线程与ArkTS运行在不同线程环境,需要通过uv_queue_work将任务派发到ArkTS线程队列。示例代码片段:

napi_status status = napi_get_undefined(env, &result);
napi_value callback;
status = napi_get_reference_value(env, ts_callback_ref, &callback);
status = napi_call_function(env, global, callback, 0, NULL, &result);
  1. ArkTS侧准备:需要在ArkTS侧预先注册回调函数,并通过@Concurrent装饰器标记可跨线程调用的方法。示例:
[@Concurrent](/user/Concurrent)
function nativeCallback(): void {
  // 处理Native线程调用
}
  1. 线程同步:对于需要返回值的调用,使用napi_create_promise和napi_resolve_deferred实现异步结果返回。

注意:要确保Native线程调用ArkTS时的线程安全,避免直接跨线程访问共享数据。建议通过消息队列或序列化机制传递数据。

完整实现需要结合具体业务场景设计调用流程,以上提供的是核心实现思路和技术要点。

回到顶部