相关问题
#鸿蒙通关秘籍#鸿蒙系统中如何在C++线程上调用ArkTS能力?
421浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何通过Node-API进行多个C++线程的数据共享?
251浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙中通过napi_wrap绑定ArkTS对象与C++对象?
276浏览 • 1回复 待解决
如何在C/C++ 创建ArkTS的对象
2481浏览 • 1回复 待解决
#鸿蒙通关秘籍#在ArkTS中如何实现SharedArrayBuffer对象的跨线程共享?
338浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在不同线程中操作鸿蒙共享模块中的对象?
283浏览 • 1回复 待解决
#鸿蒙通关秘籍#ArkTS 如何在不同的线程间切换?
251浏览 • 0回复 待解决
#鸿蒙通关秘籍#如何在C/C++与ArkTS之间进行错误对象的跨语言传递?
269浏览 • 1回复 待解决
如何在C++子线程调用ArkTS方法?(线程安全)
1660浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS中实现页面间共享组件实例?
334浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在页面间共享组件实例?
199浏览 • 1回复 待解决
ArkTS对象绑定的C++对象如何回收?
1085浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何实现ArkTS线程间数据共享?
273浏览 • 1回复 待解决
#鸿蒙通关秘籍#在鸿蒙系统中如何通过Node-API进行ArkTS和C++间的函数调用?
340浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙的ArkTS中创建自定义Sendable类?
280浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中通过Native C/C++创建子进程?
272浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中通过C/C++实现数据持久化?
262浏览 • 1回复 待解决
HarmonyOS C++自创线程如何回调到ArkTS应用中?
368浏览 • 1回复 待解决
#鸿蒙通关秘籍# 如何在多个设备上共享任务数据?
334浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在非ArkTS线程中回调ArkTS接口?
390浏览 • 1回复 待解决
ArkTS 中的 HashMap 对象传给 C++ 层,如何转换?
392浏览 • 1回复 待解决
#鸿蒙通关秘籍#在线程模型中,如何进行线程间通信?
294浏览 • 1回复 待解决
如何实现ArkTS与C/C++的对象传递
842浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在ArkTS中创建和管理Worker线程?
353浏览 • 2回复 待解决
#鸿蒙通关秘籍#如何在C/C++中实现对文件的持久化权限管理?
264浏览 • 1回复 待解决
在多个C++线程间共享ArkTS中的Sendable对象,通过序列化和反序列化技术实现。由于
napi_value
不是线程安全的,不能直接共享,需要先在一个线程中序列化Sendable对象到全局变量,然后在另一个线程中通过反序列化获取对象引用。cpp #include "napi/native_api.h" #include <thread>
static void *serializationData = nullptr;
static void *CreateEnvAndSendSendable(void *) { napi_env env = nullptr; napi_status ret = napi_create_ark_runtime(&env); if (ret != napi_ok) { std::abort(); } napi_value test = nullptr; ret = napi_load_module_with_info(env, "entry/src/main/ets/pages/SendableObjTest", "com.example.myapplication/entry", &test); if (ret != napi_ok) { std::abort(); } napi_value sendableObjTest = nullptr; ret = napi_get_named_property(env, test, "SendableObjTest", &sendableObjTest); if (ret != napi_ok) { std::abort(); } napi_value newSendable = nullptr; ret = napi_get_named_property(env, sendableObjTest, "newSendable", &newSendable); if (ret != napi_ok) { std::abort(); } napi_value result = nullptr; ret = napi_call_function(env, sendableObjTest, newSendable, 0, nullptr, &result); if (ret != napi_ok) { std::abort(); } napi_value undefined; napi_get_undefined(env, &undefined); ret = napi_serialize(env, result, undefined, undefined, &serializationData); if (ret != napi_ok) { std::abort(); } return nullptr; }
static void *CreateEnvAndReceiveSendable(void *) { napi_env env = nullptr; napi_status ret = napi_create_ark_runtime(&env); if (ret != napi_ok) { std::abort(); } napi_value result = nullptr; ret = napi_deserialize(env, serializationData, &result); if (ret != napi_ok) { std::abort(); } ret = napi_delete_serialization_data(env, serializationData); if (ret != napi_ok) { std::abort(); } napi_valuetype valuetype0; napi_typeof(env, result, &valuetype0); if (valuetype0 != napi_number) { std::abort(); } int value0; napi_get_value_int32(env, result, &value0); if (value0 != 1024) { std::abort(); } return nullptr; }