1# 使用JSVM-API接口进行ArrayBuffer相关开发 2<!--Kit: NDK Development--> 3<!--Subsystem: arkcompiler--> 4<!--Owner: @yuanxiaogou; @string_sz--> 5<!--Designer: @knightaoko--> 6<!--Tester: @test_lzz--> 7<!--Adviser: @fang-jinxu--> 8 9## 简介 10 11ArrayBuffer 是 JavaScript 中的一种数据类型,用于表示通用的、固定长度的原始二进制数据缓冲区。它提供了一种在 JavaScript 中有效地表示和操作原始二进制数据的方式。 12 13## 基本概念 14 15- **ArrayBuffer**:ArrayBuffer 对象用来表示一个通用的、固定长度的原始二进制数据缓冲区。不能直接操作 ArrayBuffer 的内容,而是需要通过包装成 TypedArray 对象或 DataView 对象来读写。ArrayBuffer 常用于处理固定长度的原始二进制数据,如文件、网络数据包等。 16- **生命周期和内存管理**:在使用 JSVM 处理 ArrayBuffer 时,需要特别注意对象的生命周期管理,确保及时释放内存。 17 18## 接口说明 19 20| 接口 | 功能说明 | 21| ---------------------------- | ------------------------------------------ | 22| OH_JSVM_GetArraybufferInfo | 检索 ArrayBuffer 的底层数据缓冲区及其长度。 | 23| OH_JSVM_IsArraybuffer | 判断一个 JavaScript 对象是否为 ArrayBuffer 类型对象。 | 24| OH_JSVM_DetachArraybuffer | 调用 ArrayBuffer 对象的 Detach 操作。 | 25| OH_JSVM_IsDetachedArraybuffer | 检查给定的 ArrayBuffer 是否已被分离(Detached)。 | 26| OH_JSVM_CreateArraybuffer | 创建一个指定大小的 ArrayBuffer 对象。 | 27 28## 使用示例 29 30JSVM-API 接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](use-jsvm-process.md),本文仅对接口对应 C++ 相关代码进行展示。 31 32### OH_JSVM_GetArraybufferInfo 33 34检索 ArrayBuffer 的底层数据缓冲区及其长度。 35 36cpp部分代码: 37 38```cpp 39// hello.cpp 40#include "napi/native_api.h" 41#include "ark_runtime/jsvm.h" 42#include <hilog/log.h> 43// OH_JSVM_GetArraybufferInfo的样例方法 44static JSVM_Value GetArraybufferInfo(JSVM_Env env, JSVM_CallbackInfo info) 45{ 46 size_t argc = 1; 47 JSVM_Value args[1] = {nullptr}; 48 // 解析传递的参数 49 OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr); 50 // 检查参数是否为ArrayBuffer 51 bool isArrayBuffer = false; 52 OH_JSVM_IsArraybuffer(env, args[0], &isArrayBuffer); 53 if (!isArrayBuffer) { 54 OH_LOG_ERROR(LOG_APP, "JSVM GetArraybufferInfo isArrayBuffer:false"); 55 return nullptr; 56 } 57 void *data; 58 size_t byteLength = 0; 59 // 获取ArrayBuffer的底层数据缓冲区和长度 60 JSVM_Status status = OH_JSVM_GetArraybufferInfo(env, args[0], &data, &byteLength); 61 if (status != JSVM_OK) { 62 OH_LOG_ERROR(LOG_APP, "JSVM GetArraybufferInfo: failed"); 63 } else { 64 OH_LOG_INFO(LOG_APP, "JSVM GetArraybufferInfo: success"); 65 } 66 return args[0]; 67} 68// GetArraybufferInfo注册回调 69static JSVM_CallbackStruct param[] = { 70 {.data = nullptr, .callback = GetArraybufferInfo}, 71}; 72static JSVM_CallbackStruct *method = param; 73// GetArraybufferInfo方法别名,供JS调用 74static JSVM_PropertyDescriptor descriptor[] = { 75 {"getArraybufferInfo", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 76}; 77// 样例测试js 78const char *srcCallNative = R"JS( 79getArraybufferInfo(new ArrayBuffer(10)); 80)JS"; 81``` 82 83预期结果: 84``` 85JSVM GetArraybufferInfo: success 86``` 87 88<!-- @[oh_jsvm_get_arraybuffer_info](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArraybuffer/getarraybufferinfo/src/main/cpp/hello.cpp) --> 89 90### OH_JSVM_IsArraybuffer 91 92判断一个 JavaScript 对象是否为 ArrayBuffer 类型对象。 93 94cpp部分代码: 95 96```cpp 97// hello.cpp 98#include "napi/native_api.h" 99#include "ark_runtime/jsvm.h" 100#include <hilog/log.h> 101// OH_JSVM_IsArraybuffer的样例方法 102static JSVM_Value IsArrayBuffer(JSVM_Env env, JSVM_CallbackInfo info) 103{ 104 size_t argc = 1; 105 JSVM_Value args[1] = {nullptr}; 106 OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr); 107 // 调用OH_JSVM_IsArraybuffer接口判断给定入参是否为ArrayBuffer数据 108 bool isArrayBuffer = false; 109 JSVM_Status status = OH_JSVM_IsArraybuffer(env, args[0], &isArrayBuffer); 110 if (status != JSVM_OK) { 111 OH_LOG_ERROR(LOG_APP, "JSVM IsArrayBuffer: failed"); 112 } else { 113 OH_LOG_INFO(LOG_APP, "JSVM IsArrayBuffer: success"); 114 OH_LOG_INFO(LOG_APP, "JSVM IsArrayBuffer: %{public}d", isArrayBuffer); 115 } 116 JSVM_Value boolean = nullptr; 117 OH_JSVM_GetBoolean(env, isArrayBuffer, &boolean); 118 return boolean; 119} 120// IsArrayBuffer注册回调 121static JSVM_CallbackStruct param[] = { 122 {.data = nullptr, .callback = IsArrayBuffer}, 123}; 124static JSVM_CallbackStruct *method = param; 125// IsArrayBuffer方法别名,供JS调用 126static JSVM_PropertyDescriptor descriptor[] = { 127 {"isArrayBuffer", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 128}; 129// 样例测试js 130const char *srcCallNative = R"JS( 131isArrayBuffer(new ArrayBuffer(8)); 132)JS"; 133``` 134 135预期结果: 136``` 137JSVM IsArrayBuffer: success 138JSVM IsArrayBuffer: 1 139``` 140 141<!-- @[oh_jsvm_is_arraybuffer](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArraybuffer/isarraybuffer/src/main/cpp/hello.cpp) --> 142 143### OH_JSVM_DetachArraybuffer 144 145调用 ArrayBuffer 对象的 Detach 操作。 146 147### OH_JSVM_IsDetachedArraybuffer 148 149检查给定的 ArrayBuffer 是否已被分离。 150 151cpp部分代码: 152 153```cpp 154// hello.cpp 155#include "napi/native_api.h" 156#include "ark_runtime/jsvm.h" 157#include <hilog/log.h> 158// OH_JSVM_DetachArraybuffer、OH_JSVM_IsDetachedArraybuffer的样例方法 159static JSVM_Value DetachArraybuffer(JSVM_Env env, JSVM_CallbackInfo info) 160{ 161 size_t argc = 1; 162 JSVM_Value args[1] = {nullptr}; 163 OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr); 164 JSVM_Value arraybuffer = args[0]; 165 JSVM_Status status = OH_JSVM_DetachArraybuffer(env, arraybuffer); 166 if (status != JSVM_OK) { 167 OH_LOG_ERROR(LOG_APP, "JSVM DetachArraybuffer: failed"); 168 } else { 169 OH_LOG_INFO(LOG_APP, "JSVM DetachArraybuffer: success"); 170 } 171 return arraybuffer; 172} 173static JSVM_Value IsDetachedArraybuffer(JSVM_Env env, JSVM_CallbackInfo info) 174{ 175 size_t argc = 1; 176 JSVM_Value args[1] = {nullptr}; 177 OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr); 178 JSVM_Value arraybuffer = args[0]; 179 OH_JSVM_DetachArraybuffer(env, arraybuffer); 180 bool result = false; 181 JSVM_Status status = OH_JSVM_IsDetachedArraybuffer(env, arraybuffer, &result); 182 if (status != JSVM_OK) { 183 OH_LOG_ERROR(LOG_APP, "JSVM IsDetachedArraybuffer: failed"); 184 } else { 185 OH_LOG_INFO(LOG_APP, "JSVM IsDetachedArraybuffer: success"); 186 OH_LOG_INFO(LOG_APP, "JSVM IsArrayBuffer: %{public}d", result); 187 } 188 JSVM_Value isDetached = nullptr; 189 OH_JSVM_GetBoolean(env, result, &isDetached); 190 return isDetached; 191} 192// DetachArraybuffer、IsDetachedArraybuffer注册回调 193static JSVM_CallbackStruct param[] = { 194 {.data = nullptr, .callback = DetachArraybuffer}, 195 {.data = nullptr, .callback = IsDetachedArraybuffer}, 196}; 197static JSVM_CallbackStruct *method = param; 198// DetachArraybuffer、IsDetachedArraybuffer方法别名,TS侧调用 199static JSVM_PropertyDescriptor descriptor[] = { 200 {"detachArraybuffer", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 201 {"isDetachedArraybuffer", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 202}; 203// 样例测试js 204const char *srcCallNative = R"JS( 205let arrayBuffer = new ArrayBuffer(10); 206detachArraybuffer(arrayBuffer); 207isDetachedArraybuffer(arrayBuffer); 208)JS"; 209``` 210 211预期结果: 212``` 213JSVM DetachArraybuffer: success 214JSVM IsDetachedArraybuffer: success 215JSVM IsArrayBuffer: 1 216``` 217 218<!-- @[oh_jsvm_is_detached_arraybuffer](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArraybuffer/isdetachedarraybuffer/src/main/cpp/hello.cpp) --> 219 220### OH_JSVM_CreateArraybuffer 221 222创建一个指定大小的 ArrayBuffer 对象。 223 224cpp部分代码: 225 226```cpp 227// hello.cpp 228#include "napi/native_api.h" 229#include "ark_runtime/jsvm.h" 230#include <hilog/log.h> 231// OH_JSVM_CreateArraybuffer的样例方法 232static JSVM_Value CreateArraybuffer(JSVM_Env env, JSVM_CallbackInfo info) 233{ 234 size_t argc = 1; 235 JSVM_Value argv[1] = {nullptr}; 236 JSVM_Value result = nullptr; 237 // 解析传递的参数 238 OH_JSVM_GetCbInfo(env, info, &argc, argv, nullptr, nullptr); 239 int32_t value = 0; 240 size_t length = 0; 241 JSVM_CALL(OH_JSVM_GetValueInt32(env, argv[0], &value)); 242 length = size_t(value); 243 void *data; 244 // 创建一个新的ArrayBuffer 245 JSVM_Status status = OH_JSVM_CreateArraybuffer(env, length, &data, &result); 246 if (status != JSVM_OK) { 247 OH_LOG_ERROR(LOG_APP, "JSVM CreateArraybuffer: failed"); 248 return nullptr; 249 } else { 250 OH_LOG_INFO(LOG_APP, "JSVM CreateArraybuffer: success"); 251 OH_LOG_INFO(LOG_APP, "JSVM ArrayBuffer length: %{public}d", length); 252 } 253 // 返回创建好的ArrayBuffer 254 return result; 255} 256// CreateArraybuffer注册回调 257static JSVM_CallbackStruct param[] = { 258 {.data = nullptr, .callback = CreateArraybuffer}, 259}; 260static JSVM_CallbackStruct *method = param; 261// CreateArraybuffer方法别名,供TS侧调用 262static JSVM_PropertyDescriptor descriptor[] = { 263 {"createArraybuffer", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 264}; 265// 样例测试js 266const char *srcCallNative = R"JS( 267createArraybuffer(8); 268)JS"; 269``` 270 271预期结果: 272``` 273JSVM CreateArraybuffer: success 274JSVM ArrayBuffer length: 8 275``` 276 277<!-- @[oh_jsvm_create_arraybuffer](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArraybuffer/createarraybuffer/src/main/cpp/hello.cpp) --> 278