HarmonyOS 鸿蒙Next:如何从native层的子线程同步调用ArkTs方法,并获取返回值
HarmonyOS 鸿蒙Next:如何从native层的子线程同步调用ArkTs方法,并获取返回值 如题,我在napi的代码中创建了一个线程,希望调用arkts的方法,并能够同步获取ts方法的返回值,有什么办法吗
我现在有了解到napi_create_threadsafe_function,但这个似乎是异步的,无法同步获取返回值
参考这个:链接
-
调用线程安全函数时传promise
std::promise<int> promise; napi_call_threadsafe_function(tsfn, &promise, napi_tsfn_blocking); int result = future.get();
-
回调函数(CallJs)里面把结果赋值给promise
reinterpret_cast<std::promise<int>*>(data)->set_value(cValue);
-
子线程获取返回值后,继续处理后续业务。
static void ExecuteWork(napi_env env, void *data)
{
CallbackData *callbackData = reinterpret_cast<CallbackData*>(data);
std::promise<std::string> promise;
auto future = promise.get_future();
napi_call_threadsafe_function(callbackData->tsfn, &promise, napi_tsfn_nonblocking);
try {
auto result = future.get();
// OH_LOG_INFO(LOG_APP, "XXX, Result from JS %{public}s", result.c_str());
} catch (const std::exception &e) {
// OH_LOG_INFO(LOG_APP, "XXX, Result from JS %{public}s", e.what());
}
}
更多关于HarmonyOS 鸿蒙Next:如何从native层的子线程同步调用ArkTs方法,并获取返回值的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
基于这个方案解决了,非常感谢!!!
上面链接中是在ts和napi层同时使用promise,不过我后续发现,promise可以只在napi层实现,这样ts的代码就不用太复杂,不知道你们有用过类似的方案不,有没有什么隐患?
可以这样实现,ArkTS 层仅提供回调函数,所有的异步逻辑和 Promise 处理都在 NAPI 层完成。这样做注意如果NAPI 层处理的异步任务过多,可能会有性能瓶颈。
可以同步,但是最后返回的是一个promise
在HarmonyOS鸿蒙系统中,从native层的子线程同步调用ArkTS(Ark TypeScript)方法并获取返回值,可以通过以下步骤实现:
-
定义ArkTS接口: 在ArkTS代码中定义一个可以被调用的接口,该接口返回一个Promise对象,或者通过特定的机制(如回调)来返回结果。
-
JNI桥接: 在native层,通过JNI(Java Native Interface,虽然鸿蒙不完全基于Java,但此处的概念类似)的方式与ArkTS层进行交互。你需要创建一个native方法,该方法内部启动一个线程或任务来调用ArkTS接口。由于ArkTS是异步的,你可能需要利用某种同步机制(如条件变量)来等待结果。
-
结果传递: ArkTS接口执行完毕后,通过某种机制(如消息队列、回调、或全局变量加锁保护)将结果传递回native层。在native层,子线程等待这个结果,并在获取到结果后继续执行后续操作。
-
注意线程安全: 确保在native层和ArkTS层之间传递数据时,处理好线程安全问题,避免数据竞争或不一致。
请注意,上述步骤是一个高层次的描述,实际实现中可能涉及更多细节,如错误处理、内存管理等。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html