HarmonyOS鸿蒙Next中C++调用ArkTS方法进行通信

HarmonyOS鸿蒙Next中C++调用ArkTS方法进行通信

我有大量的场景需要通过c++调用ArkTS方法进行通信;之前我们通过AKI提供的方法进行实现的,即:将通信任务都扔到一个线程池里面执行,但这是无序的,我们想要这些任务是有序执行的,是否有保序的线程通信推荐写法?

4 回复

可以使用napi_threadsafe_function系列的函数实现,这个是保序的。

使用Node-API接口进行线程安全开发-Node-API典型使用场景-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

另外,这里也补充一下napi中常见的抛任务方法的差异

  1. napi_async_work系列接口:只能保证execute_cb执行在complete_cb之前,对于不同的async_work,时序无法保证

使用Node-API接口进行异步任务开发-Node-API典型使用场景-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

  1. napi_threadsafe_function系列接口:接口内部维护了一个队列,保序的。
  • napi_call_threadsafe_function:先入先出。
  • napi_call_threadsafe_function_with_priority:根据自己指定的任务优先级执行

使用Node-API接口从异步线程向ArkTS线程投递指定优先级和入队方式的任务-Node-API典型使用场景-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

更多关于HarmonyOS鸿蒙Next中C++调用ArkTS方法进行通信的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


保持关注。

在HarmonyOS鸿蒙Next中,C++调用ArkTS方法进行通信可以通过Native API实现。首先,使用napi_create_function在C++中创建Native方法,然后通过napi_call_function调用ArkTS中的方法。ArkTS方法可以通过@ohos.napi模块暴露给C++。C++与ArkTS之间的数据传递使用napi_value类型,通过napi_get_valuenapi_create_value进行转换。确保在CMakeLists.txt中正确配置Native模块依赖。

在HarmonyOS Next中实现C++有序调用ArkTS方法,可以采用以下方案:

  1. 使用Native API提供的序列化机制:
  • 通过napi_create_threadsafe_function创建线程安全函数
  • 配合napi_call_threadsafe_function时设置napi_tsfn_blocking标志
  • 在ArkTS侧使用@Concurrent装饰器处理有序回调
  1. 典型代码结构(C++侧):
napi_status status = napi_create_threadsafe_function(
    env, 
    func, 
    nullptr, 
    resource_name, 
    0, 
    1,  // 单线程保证有序
    nullptr, 
    nullptr, 
    nullptr, 
    call_js, 
    &tsfn);

// 调用时保证顺序
napi_call_threadsafe_function(tsfn, data, napi_tsfn_blocking);
  1. ArkTS侧处理:
@Concurrent
function orderedCallback(data: string): void {
    // 处理有序请求
}

这种方案通过限制工作线程数为1来保证任务顺序,同时利用线程安全函数的阻塞特性确保执行顺序。相比线程池方案,能严格保证调用顺序但吞吐量会有所降低。

回到顶部