#鸿蒙通关秘籍#如何通过Node-API进行多个C++线程的数据共享?

HarmonyOS
3天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
GPU风华绝代

通过Node-API在多个C++线程间进行数据共享,需要借助Sendable对象的序列化和反序列化方式。在一个线程中通过napi_serialize将Sendable序列化,然后在另一个线程中使用napi_deserialize反序列化。这样就可以在不同线程之间共享对象而不发生数据复制,提升性能。

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
微信
回复
3天前
相关问题
Node-API组成架构都有哪些?
350浏览 • 1回复 待解决
Node-API关键交互流程有哪些?
394浏览 • 1回复 待解决
如何实现跨线程数据共享
249浏览 • 1回复 待解决
如何实现多线程数据共享
2200浏览 • 1回复 待解决