HarmonyOS鸿蒙Next中C++调用ArkTS方法进行通信
HarmonyOS鸿蒙Next中C++调用ArkTS方法进行通信
我有大量的场景需要通过c++调用ArkTS方法进行通信;之前我们通过AKI提供的方法进行实现的,即:将通信任务都扔到一个线程池里面执行,但这是无序的,我们想要这些任务是有序执行的,是否有保序的线程通信推荐写法?
可以使用napi_threadsafe_function系列的函数实现,这个是保序的。
使用Node-API接口进行线程安全开发-Node-API典型使用场景-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者
另外,这里也补充一下napi中常见的抛任务方法的差异
- napi_async_work系列接口:只能保证execute_cb执行在complete_cb之前,对于不同的async_work,时序无法保证
使用Node-API接口进行异步任务开发-Node-API典型使用场景-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者
- napi_threadsafe_function系列接口:接口内部维护了一个队列,保序的。
- napi_call_threadsafe_function:先入先出。
- napi_call_threadsafe_function_with_priority:根据自己指定的任务优先级执行
更多关于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_value
和napi_create_value
进行转换。确保在CMakeLists.txt
中正确配置Native模块依赖。
在HarmonyOS Next中实现C++有序调用ArkTS方法,可以采用以下方案:
- 使用Native API提供的序列化机制:
- 通过
napi_create_threadsafe_function
创建线程安全函数 - 配合
napi_call_threadsafe_function
时设置napi_tsfn_blocking
标志 - 在ArkTS侧使用
@Concurrent
装饰器处理有序回调
- 典型代码结构(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);
- ArkTS侧处理:
@Concurrent
function orderedCallback(data: string): void {
// 处理有序请求
}
这种方案通过限制工作线程数为1来保证任务顺序,同时利用线程安全函数的阻塞特性确保执行顺序。相比线程池方案,能严格保证调用顺序但吞吐量会有所降低。