可以通过线程安全函数实现在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典型开发场景课程讲解
可以通过线程安全函数实现在C++子线程触发ArkTS侧回调。native主线程外的其他线程通常不能直接使用需要napi_env、napi_value的NAPI函数,线程安全函数可以在其他线程中被调用,并回到主线程中执行。参考代码如下:
在Native入口定义线程安全函数,计算两数合。
ArkTS侧调用接口。
参考链接
使用Node-API接口进行线程安全开发
Node-API典型开发场景课程讲解