Native侧获取env具有线程限制,如何在C++子线程触发ArkTS侧回调

Native侧获取env具有线程限制,如何在C++子线程触发ArkTS侧回调

HarmonyOS
2024-03-19 16:17:18
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zdl2000

可以通过线程安全函数实现在C++子线程触发ArkTS侧回调。native主线程外的其他线程通常不能直接使用需要napi_env、napi_value的NAPI函数,线程安全函数可以在其他线程中被调用,并回到主线程中执行。参考代码如下:

在Native入口定义线程安全函数,计算两数合。

static napi_value AddTSFCallback(napi_env env, napi_callback_info info) { 
    // ...  
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
    auto contextData = new ContextData; 
    contextData->args = strBuff; 
    // 创建线程安全函数对象,注册绑定callback和call_js_cb回调 
    napi_create_threadsafe_function(env, args[2], nullptr, asyncName, MAX_MSG_QUEUE_SIZE, INITIAL_THREAD_COUNT, nullptr,nullptr, nullptr, CallJsFunction, &tsFun); 
    thread t(AddFunc, static_cast<void *>(contextData));   // 创建C++子线程,处理业务逻辑 
    t.detach(); 
    return nullptr; 
} 
 
static void AddFunc([[maybe_unused]] napi_env env, void *data) { 
    ContextData *contextData = static_cast<ContextData *>(data);       // 解析上下文,业务处理,两数相加 
    contextData->result = add(contextData->num1, contextData->num2);   // 将结果置入上下 
    napi_call_threadsafe_function(tsFun, data, napi_tsfn_blocking);    // 调用线程安全函数 
} 
 
static void CallJsFunction(napi_env env, napi_value callBack, [[maybe_unused]] void *context, void *data) { 
    ContextData *contextData = static_cast<ContextData *>(data); 
    // ...  
    napi_value callBackArgs = nullptr; 
    napi_create_double(env, contextData->result, &callBackArgs); 
    napi_value callBackResult = nullptr; 
    napi_call_function(env, undefined, callBack, 1, &callBackArgs, &callBackResult);    // 调用callback,反馈结果到ArkTS应用侧 
    DeleteContext(env, contextData); 
}

ArkTS侧调用接口。

import testNapi from 'libentry.so'; 
@Entry 
@Component 
struct Index { 
  // ... 
  .onClick(() => { 
    testNapi.addTSFCallback(2, 3, (nativeResult: number) => { 
      this.result = nativeResult; 
    }); 
  }) 
  // ... 
}

参考链接

使用Node-API接口进行线程安全开发

Node-API典型开发场景课程讲解

分享
微博
QQ
微信
回复
2024-03-19 23:50:40
相关问题
Native创建线程是否有限制
247浏览 • 1回复 待解决
如何在Native释放ArkTS对象
269浏览 • 1回复 待解决
如何在Native获取APP版本信息
231浏览 • 1回复 待解决
如何在Native构建一个ArkTS对象
215浏览 • 1回复 待解决
如何C++ 提供函数?
564浏览 • 1回复 待解决
ArkTSNative如何进行map数据交互
225浏览 • 1回复 待解决
NAPI执行上层时,如何获取env
204浏览 • 1回复 待解决
Native rdb写入是否有线程安全管理
230浏览 • 1回复 待解决
如何在C/C++ 创建ArkTS的对象
284浏览 • 1回复 待解决
TaskPool线程和主线程如何通信
150浏览 • 1回复 待解决
Native如何获取可操作的文件目录
173浏览 • 1回复 待解决
Native如何打印char指针
210浏览 • 1回复 待解决