HarmonyOS鸿蒙Next中Native线程调用ArkTS线程

HarmonyOS鸿蒙Next中Native线程调用ArkTS线程

4 回复

【背景知识】

许多涉及到跟设备交互的应用,都需要使用C++去跟设备交互,然后在C++中去创建子线程去接收设备返回来的信息,需要在C++子线程中调用ArkTS的方法,去把数据传到ArkTS中。

【解决方案】

在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线程通过napi_call_function调用ArkTS线程。首先,使用napi_get_global获取全局对象,然后通过napi_get_property获取ArkTS函数。最后,使用napi_call_function执行该函数。Native线程与ArkTS线程的交互通过Node-API实现,确保线程安全。

在HarmonyOS Next中,Native线程(C++层)调用ArkTS线程(应用层)主要通过NAPI机制实现。以下是关键实现步骤:

  1. 使用NAPI接口创建异步工作:
napi_create_async_work(env, nullptr, resourceName,
  ExecuteWork, CompleteWork, callbackData, &asyncWork);
napi_queue_async_work(env, asyncWork);
  1. 实现ExecuteWork(Native线程执行)和CompleteWork(主线程回调)函数:
void ExecuteWork(napi_env env, void* data) {
  // Native线程执行的任务
}

void CompleteWork(napi_env env, napi_status status, void* data) {
  // 回调到ArkTS线程
  napi_call_function(env, /*...*/);
}
  1. ArkTS侧通过@ohos.napi模块注册回调函数:
import native from 'libnative.so';

native.registerCallback((result) => {
  // 处理Native线程返回的结果
});

注意事项:

  • 线程安全:确保跨线程数据访问的同步
  • 生命周期管理:防止内存泄漏
  • 性能考虑:避免频繁的线程切换

这种机制实现了Native层到应用层的线程间通信,是HarmonyOS混合开发的关键技术点。

回到顶部