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


HarmonyOS NEXT
2025-07-28 14:07:46
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
hm673c38daacc8a

​在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%')
  }
}

分享
微博
QQ
微信
回复
2025-07-30 13:08:36
相关问题
native如何ArkTS侧子线程通信
1002浏览 • 1回复 待解决
HarmonyOS native如何获取主线程
847浏览 • 1回复 待解决
ArkTs线程方案如何保证线程安全
4037浏览 • 2回复 待解决
NAPI跨线程调用TS线程函数
3005浏览 • 1回复 待解决
HarmonyOS 关于native线程问题
766浏览 • 1回复 待解决
线程执行延时如何实现
2217浏览 • 1回复 待解决
Native侧创建线程是否有限制
3132浏览 • 1回复 待解决