相关问题
#鸿蒙通关秘籍#如何通过Node-API进行多个C++线程的数据共享?
43浏览 • 1回复 待解决
如何在C/C++ 创建ArkTS的对象
2205浏览 • 1回复 待解决
#鸿蒙通关秘籍#鸿蒙系统中如何在C++线程上调用ArkTS能力?
85浏览 • 1回复 待解决
如何在C++子线程调用ArkTS方法?(线程安全)
1340浏览 • 1回复 待解决
ArkTS对象绑定的C++对象如何回收?
893浏览 • 1回复 待解决
#鸿蒙通关秘籍#在ArkTS中如何实现SharedArrayBuffer对象的跨线程共享?
43浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在不同线程中操作鸿蒙共享模块中的对象?
103浏览 • 1回复 待解决
#鸿蒙通关秘籍#ArkTS 如何在不同的线程间切换?
125浏览 • 0回复 待解决
HarmonyOS C++自创线程如何回调到ArkTS应用中?
237浏览 • 1回复 待解决
ArkTS 中的 HashMap 对象传给 C++ 层,如何转换?
202浏览 • 1回复 待解决
如何实现ArkTS与C/C++的对象传递
633浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS中实现页面间共享组件实例?
100浏览 • 1回复 待解决
HarmonyOS Sendable对象怎么保证线程安全?
182浏览 • 1回复 待解决
ArkTS层通过接口访问C++层对象
356浏览 • 1回复 待解决
将C++层分配的对象在ArkTS层管理,ArkTS层通过接口访问C++层对象业务
913浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何实现ArkTS线程间数据共享?
26浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中通过C/C++实现数据持久化?
62浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中通过Native C/C++创建子进程?
29浏览 • 1回复 待解决
#鸿蒙通关秘籍# 如何在多个设备上共享任务数据?
158浏览 • 1回复 待解决
如何在C++的子线程调用从ArkTS传递过来的function
2154浏览 • 1回复 待解决
HarmonyOS 如何在ArkTS中向C++层注册回调,C++层如何调用回调方法?
152浏览 • 1回复 待解决
HarmonyOS C++的异步通知如何回调给ArkTS的线程?
182浏览 • 1回复 待解决
如何在Native侧C++子线程直接调用ArkTS接口,不用通过ArkTS侧触发回调
2102浏览 • 1回复 待解决
Native侧获取env具有线程限制,如何在C++子线程触发ArkTS侧回调
1986浏览 • 1回复 待解决
#鸿蒙通关秘籍#在线程模型中,如何进行线程间通信?
122浏览 • 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; }