鸿蒙5.0开发进阶:NDK开发-使用Node-API接口进行ArrayBuffer相关开发 ...

瑞星  金牌会员 | 2024-11-9 15:27:40 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

往期鸿蒙全套实战文章必看:



  • 鸿蒙开发核心知识点,看这篇文章就够了
  • 最新版!鸿蒙HarmonyOS Next应用开发实战学习路线
  • 鸿蒙HarmonyOS NEXT开发技术最全学习路线指南
  • 鸿蒙应用开发实战项目,看这一篇文章就够了(部分项目附源码)

简介

ArrayBuffer是ArkTS中的一种数据范例,用于表示通用的、固定长度的原始二进制数据缓冲区。它提供了一种在ArkTS中有用地表示和利用原始二进制数据的方式。
基本概念



  • ArrayBuffer:ArrayBuffer对象用来表示一个通用的、固定长度的原始二进制数据缓冲区。不能直接利用ArrayBuffer的内容,而是须要包装成TypedArray对象或DataView对象来读写。ArrayBuffer常用于处理惩罚大量的二进制数据,如文件、网络数据包等。
  • 生命周期和内存管理:在使用Node-API处理惩罚ArrayBuffer时,需留意创建的arrayBufferPtr生命周期由引擎管理,不允许用户自己delete,否则会double free。
场景和功能介绍

以下Node-API接口通常在Node-API模块中利用ArrayBuffer范例的数据。以下是一些大概的使用场景:
接口形貌napi_is_arraybuffer检查一个值是否为ArrayBuffer,以确保正在处理惩罚精确的数据范例。须要留意的是,此函数只能判定一个值是否为ArrayBuffer,而不能判定一个值是否为TypedArray。如果须要判定一个值是否为TypedArray,可以使用napi_is_typedarray函数。napi_get_arraybuffer_info获取给定的ArrayBuffer对象的相关信息,包罗数据指针和数据长度。napi_detach_arraybuffer在某些环境下,当须要频繁地访问ArrayBuffer的底层数据缓冲区时,将其分离可以提高性能。分离后可以直接在C/C++中利用数据,而无需通过Node-API接口进行数据访问。napi_is_detached_arraybuffer判定给定的ArrayBuffer是否已经被分离。napi_create_arraybuffer用于在Node-API模块中创建一个具有指定字节长度的ArkTS ArrayBuffer对象。 使用示例

本文仅对接口对应C++及ArkTS相关代码进行展示。
napi_is_arraybuffer

判定给定ArkTS value是否为ArrayBuffer。
cpp部分代码
  1. #include "napi/native_api.h"
  2. static napi_value IsArrayBuffer(napi_env env, napi_callback_info info)
  3. {
  4.     // 接受一个入参
  5.     size_t argc = 1;
  6.     napi_value args[1] = {nullptr};
  7.     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  8.     // 调用napi_is_arraybuffer接口判断给定入参是否为ArrayBuffer数据
  9.     bool result = false;
  10.     napi_status status = napi_is_arraybuffer(env, args[0], &result);  
  11.     if (status != napi_ok) {
  12.         napi_throw_error(env, nullptr, "Node-API napi_is_arraybuffer fail");
  13.         return nullptr;
  14.     }
  15.     // 将结果转成napi_value类型返回
  16.     napi_value returnValue = nullptr;
  17.     napi_get_boolean(env, result, &returnValue);
  18.     return returnValue;
  19. }
复制代码
接口声明
  1. // index.d.ts
  2. export const isArrayBuffer: <T>(arrayBuffer: T) => boolean | void;
复制代码
ArkTS侧示例代码
  1. import hilog from '@ohos.hilog'
  2. import testNapi from 'libentry.so'
  3. try {
  4.   let value = new ArrayBuffer(1);
  5.   let data = "123";
  6.   hilog.info(0x0000, 'testTag', 'Test Node-API napi_is_arraybuffer: %{public}s', testNapi.isArrayBuffer(value));
  7.   hilog.info(0x0000, 'testTag', 'Test Node-API napi_is_arraybuffer: %{public}s', testNapi.isArrayBuffer(data));
  8. } catch (error) {
  9.   hilog.error(0x0000, 'testTag', 'Test Node-API napi_is_arraybuffer error: %{public}s', error.message);
  10. }
复制代码
napi_get_arraybuffer_info

获取ArrayBuffer的底层数据缓冲区和长度。
cpp部分代码
  1. #include "napi/native_api.h"
  2. static napi_value GetArraybufferInfo(napi_env env, napi_callback_info info)
  3. {
  4.     size_t argc = 1;
  5.     napi_value args[1] = {nullptr};
  6.     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  7.     // 检查参数是否为ArrayBuffer
  8.     bool isArraybuffer = false;
  9.     napi_is_arraybuffer(env, args[0], &isArraybuffer);
  10.     if (!isArraybuffer) {
  11.         napi_throw_type_error(env, nullptr, "Argument must be an ArrayBuffer");
  12.         return nullptr;
  13.     }
  14.     void *data = nullptr;
  15.     size_t byteLength = 0;
  16.     // 获取ArrayBuffer的底层数据缓冲区和长度
  17.     napi_status status = napi_get_arraybuffer_info(env, args[0], &data, &byteLength);
  18.     if (status != napi_ok) {
  19.         napi_throw_error(env, nullptr, "Failed to get ArrayBuffer info");
  20.         return nullptr;
  21.     }
  22.     // 创建结果对象
  23.     napi_value result = nullptr;
  24.     napi_create_object(env, &result);
  25.     // 创建数据缓冲区的字节长度属性
  26.     napi_value byteLengthValue = nullptr;
  27.     napi_create_uint32(env, byteLength, &byteLengthValue);
  28.     napi_set_named_property(env, result, "byteLength", byteLengthValue);
  29.     napi_value bufferData;
  30.     napi_create_arraybuffer(env, byteLength, &data, &bufferData);
  31.     napi_set_named_property(env, result, "buffer", bufferData);
  32.     return result;
  33. }
复制代码
接口声明
  1. // index.d.ts
  2. export class ArrayBufferInfo {
  3.   byteLength: number;
  4.   buffer: Object;
  5. }
  6. export const getArraybufferInfo: (data: ArrayBuffer) => ArrayBufferInfo | void;
复制代码
ArkTS侧示例代码
  1. import hilog from '@ohos.hilog'
  2. import testNapi from 'libentry.so'
  3. const buffer = new ArrayBuffer(10);
  4. hilog.info(0x0000, 'testTag', 'Test Node-API get_arraybuffer_info:%{public}s ', JSON.stringify(testNapi.getArraybufferInfo(buffer)));
复制代码
napi_detach_arraybuffer

分离给定ArrayBuffer的底层数据。
napi_is_detached_arraybuffer

判定给定的ArrayBuffer是否已被分离。
cpp部分代码
  1. #include "napi/native_api.h"
  2. static napi_value DetachedArraybuffer(napi_env env, napi_callback_info info)
  3. {
  4.     // 调用napi_detach_arraybuffer接口分离给定ArrayBuffer的底层数据
  5.     size_t argc = 1;
  6.     napi_value args[1] = {nullptr};
  7.     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  8.     napi_value arrayBuffer = args[0];
  9.     napi_detach_arraybuffer(env, arrayBuffer);
  10.     // 将分离后的arraybuffer传出去
  11.     return arrayBuffer;
  12. }
  13. static napi_value IsDetachedArraybuffer(napi_env env, napi_callback_info info)
  14. {
  15.     // 调用napi_is_detached_arraybuffer判断给定的arraybuffer是否已被分离
  16.     size_t argc = 1;
  17.     napi_value args[1] = {nullptr};
  18.     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  19.     napi_value arrayBuffer = args[0];
  20.     bool result = false;
  21.     napi_is_detached_arraybuffer(env, arrayBuffer, &result);
  22.     // 将返回值通过napi_get_boolean接口转成napi_value传出去做打印
  23.     napi_value returnValue;
  24.     napi_get_boolean(env, result, &returnValue);
  25.     return returnValue;
  26. }
复制代码
接口声明
  1. // index.d.ts
  2. export const detachedArraybuffer: (buffer:ArrayBuffer) => ArrayBuffer;
  3. export const isDetachedArraybuffer: (arrarBeffer: ArrayBuffer) => boolean;
复制代码
ArkTS侧示例代码
  1. import hilog from '@ohos.hilog'
  2. import testNapi from 'libentry.so'
  3. try {
  4.   const bufferArray = new ArrayBuffer(8);
  5.   hilog.info(0x0000, 'testTag', 'Test Node-API napi_is_detached_arraybuffer one: %{public}s', testNapi.isDetachedArraybuffer(bufferArray));
  6.   hilog.info(0x0000, 'testTag', 'Test Node-API napi_is_detached_arraybuffer two: %{public}s ', testNapi.isDetachedArraybuffer(testNapi.detachedArraybuffer(bufferArray)));
  7. } catch (error) {
  8.   hilog.error(0x0000, 'testTag', 'Test Node-API napi_is_detached_arraybuffer error: %{public}s', error.message);
  9. }
复制代码
napi_create_arraybuffer

用于在C/C++中创建一个具有指定字节长度的ArkTS ArrayBuffer对象,如果调用者想要直接利用缓冲区,则可以选择将底层缓冲区返回给调用者。要从ArkTS写入此缓冲区,须要创建范例化数组或DataView对象。
cpp部分代码
  1. #include "napi/native_api.h"
  2. static napi_value CreateArraybuffer(napi_env env, napi_callback_info info)
  3. {
  4.     size_t argc = 1;
  5.     napi_value argv[1] = {nullptr};
  6.     napi_value result = nullptr;
  7.     // 解析传递的参数
  8.     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  9.     int32_t value;
  10.     size_t length;
  11.     // 将ArkTS侧传递的参数转换为size_t类型,作为napi_create_arraybuffer的参数
  12.     napi_get_value_int32(env, argv[0], &value);
  13.     length = size_t(value);
  14.     void *data;
  15.     // 创建一个新的ArrayBuffer
  16.     napi_create_arraybuffer(env, length, &data, &result);
  17.     // 返回ArrayBuffer
  18.     return result;
  19. }
复制代码
接口声明
  1. // index.d.ts
  2. export const createArraybuffer: (size: number) => ArrayBuffer;
复制代码
ArkTS侧示例代码
  1. import hilog from '@ohos.hilog'
  2. import testNapi from 'libentry.so'
  3. hilog.info(0x0000, 'testTag', 'Test Node-API napi_create_arraybuffer:%{public}s', testNapi.createArraybuffer(10).toString());
复制代码
以上代码如果要在native cpp中打印日志,需在CMakeLists.txt文件中添加以下配置信息(并添加头文件:#include "hilog/log.h"):
  1. // CMakeLists.txt
  2. add_definitions( "-DLOG_DOMAIN=0xd0d0" )
  3. add_definitions( "-DLOG_TAG="testTag"" )
  4. target_link_libraries(entry PUBLIC libhilog_ndk.z.so)
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表