#鸿蒙通关秘籍#如何在多个C++线程间共享ArkTS中Sendable对象?

HarmonyOS
3天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
CPV静谧森林

在多个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; }

分享
微博
QQ
微信
回复
2天前
相关问题
如何在C/C++ 创建ArkTS对象
2205浏览 • 1回复 待解决
ArkTS对象绑定的C++对象如何回收?
893浏览 • 1回复 待解决
如何实现ArkTSC/C++对象传递
633浏览 • 1回复 待解决
ArkTS层通过接口访问C++对象
356浏览 • 1回复 待解决