HarmonyOS鸿蒙Next中Native线程调用ArkTS线程
HarmonyOS鸿蒙Next中Native线程调用ArkTS线程
4 回复
【背景知识】
许多涉及到跟设备交互的应用,都需要使用C++去跟设备交互,然后在C++中去创建子线程去接收设备返回来的信息,需要在C++子线程中调用ArkTS的方法,去把数据传到ArkTS中。
【解决方案】
在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%')
}
}
更多关于HarmonyOS鸿蒙Next中Native线程调用ArkTS线程的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,Native线程通过napi_call_function
调用ArkTS线程。首先,使用napi_get_global
获取全局对象,然后通过napi_get_property
获取ArkTS函数。最后,使用napi_call_function
执行该函数。Native线程与ArkTS线程的交互通过Node-API实现,确保线程安全。
在HarmonyOS Next中,Native线程(C++层)调用ArkTS线程(应用层)主要通过NAPI机制实现。以下是关键实现步骤:
- 使用NAPI接口创建异步工作:
napi_create_async_work(env, nullptr, resourceName,
ExecuteWork, CompleteWork, callbackData, &asyncWork);
napi_queue_async_work(env, asyncWork);
- 实现ExecuteWork(Native线程执行)和CompleteWork(主线程回调)函数:
void ExecuteWork(napi_env env, void* data) {
// Native线程执行的任务
}
void CompleteWork(napi_env env, napi_status status, void* data) {
// 回调到ArkTS线程
napi_call_function(env, /*...*/);
}
- ArkTS侧通过@ohos.napi模块注册回调函数:
import native from 'libnative.so';
native.registerCallback((result) => {
// 处理Native线程返回的结果
});
注意事项:
- 线程安全:确保跨线程数据访问的同步
- 生命周期管理:防止内存泄漏
- 性能考虑:避免频繁的线程切换
这种机制实现了Native层到应用层的线程间通信,是HarmonyOS混合开发的关键技术点。