相关问题
#鸿蒙通关秘籍#如何在多个C++线程间共享ArkTS中Sendable对象?
56浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中通过C/C++实现数据持久化?
62浏览 • 1回复 待解决
Node-API的组成架构都有哪些?
350浏览 • 1回复 待解决
Node-API的关键交互流程有哪些?
394浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何实现ArkTS线程间数据共享?
30浏览 • 1回复 待解决
#鸿蒙通关秘籍# 如何在多个设备上共享任务数据?
158浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何使用共享数据进行ExtensionAbility通信
39浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中通过Native C/C++创建子进程?
29浏览 • 1回复 待解决
#鸿蒙通关秘籍# 如何使用AKI实现C++跨线程调用JS函数,并进行加10操作?
38浏览 • 0回复 待解决
#鸿蒙通关秘籍#鸿蒙系统中如何在C++线程上调用ArkTS能力?
85浏览 • 1回复 待解决
#鸿蒙通关秘籍#在鸿蒙开发中如何使用共享模式的NativeBinding对象进行跨线程通信?
77浏览 • 1回复 待解决
JS线程通过napi创建的C++线程的处理结果,如何返回JS线程
2041浏览 • 1回复 待解决
如何对多个C++源文件中接口进行导出声明
1858浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何通过跨设备Call进行数据同步的流程?
34浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何通过命名路由跳转共享包页面
82浏览 • 1回复 待解决
如何将通过napi创建的C++线程的处理结果传递回JS线程?
502浏览 • 1回复 待解决
#鸿蒙通关秘籍#在ArkTS中如何实现SharedArrayBuffer对象的跨线程共享?
44浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS NEXT中集成和使用GTest进行C++单元测试?
59浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS NEXT中使用GTest框架进行C++项目单元测试?
59浏览 • 1回复 待解决
如何实现跨线程数据共享
249浏览 • 1回复 待解决
应用有少量C++代码,C++代码如何进行适配?
201浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在不同线程中操作鸿蒙共享模块中的对象?
103浏览 • 1回复 待解决
如何实现多线程数据共享
2200浏览 • 1回复 待解决
#鸿蒙通关秘籍#在线程模型中,如何进行线程间通信?
122浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何通过用户首选项进行数据持久化?
54浏览 • 1回复 待解决
通过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; }