相关问题
#鸿蒙通关秘籍#在鸿蒙系统中如何通过Node-API进行ArkTS和C++间的函数调用?
340浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何使用HarmonyOS Node-API实现ArkTS与C/C++的跨语言交互?
351浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在多个C++线程间共享ArkTS中Sendable对象?
279浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何利用Node-API进行错误和异常处理?
201浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在Node-API中实现多线程JavaScript函数调用?
311浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何使用Node-API接口进行鸿蒙错误处理开发?
186浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在异步线程中使用Node-API向ArkTS线程投递任务?
207浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在Node-API线程安全开发中管理异步资源?
314浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何使用Node-API创建异步任务以避免阻塞主线程?
320浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙中使用Node-API扩展接口运行异步线程的事件循环?
210浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何处理Node-API中的异步操作?
161浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在CMake中配置Node-API模块?
199浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙中通过Node-API接口创建ArkTs运行时环境?
267浏览 • 1回复 待解决
#鸿蒙通关秘籍#在使用Node-API进行跨语言交互时有哪些约束限制?
193浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何初始化和调用Node-API模块?
230浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙中使用Node-API抛出范围错误?
153浏览 • 1回复 待解决
#鸿蒙通关秘籍#Node-API的架构组成包括哪些关键组件?
154浏览 • 1回复 待解决
#鸿蒙通关秘籍#在Node-API中如何处理Buffer和ArrayBuffer?
355浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中通过C/C++实现数据持久化?
262浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙中使用Node-API运行动态模块?
166浏览 • 1回复 待解决
HarmonyOS native开发中如何传递map给c++层 / node-api层如何反射调用ArkTS对象
286浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中使用Node-API执行指定的abc文件?
202浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在ArkTS中调用自定义Node-API接口?
256浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中使用Node-API实现跨语言交互?
213浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙中扩展Node-API功能实现跨语言交互?
257浏览 • 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; }