1e41f4b71Sopenharmony_ci# Working with ArrayBuffer Using Node-API 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci## Introduction 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ci**ArrayBuffer** in ArkTS is a type of object that represents a generic, fixed-length buffer of raw binary data. It provides a way to effectively represent and manipulate raw binary data in ArkTS. 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci## Basic Concepts 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci- **ArrayBuffer**: An **ArrayBuffer** object represents a generic, fixed-length buffer of raw binary data. The **ArrayBuffer** content cannot be directly operated. Instead, you need to use a **TypedArray** or **DataView** object to interpret the buffer data in specific formats. **ArrayBuffer** is used to process a large amount of binary data, such as files and network data packets. 10e41f4b71Sopenharmony_ci- Lifecycle and memory management: When using Node-API to process **ArrayBuffer** objects, note that the lifecycle of the created **arrayBufferPtr** is managed by the engine and cannot be deleted by users. Otherwise, a double free error may occur. 11e41f4b71Sopenharmony_ci 12e41f4b71Sopenharmony_ci## Available APIs 13e41f4b71Sopenharmony_ci 14e41f4b71Sopenharmony_ciThe following table lists the APIs used to manipulate data of the **ArrayBuffer** type. 15e41f4b71Sopenharmony_ci| API| Description| 16e41f4b71Sopenharmony_ci| -------- | -------- | 17e41f4b71Sopenharmony_ci| napi_is_arraybuffer | Checks whether a value is an **ArrayBuffer** object. Note that this API cannot be used to check whether a value is a **TypedArray** object. To check whether a value is a **TypedArray** object, use **napi_is_typedarray**.| 18e41f4b71Sopenharmony_ci| napi_get_arraybuffer_info | Obtains information of an **ArrayBuffer** object, including the pointer to the data and the data length.| 19e41f4b71Sopenharmony_ci| napi_detach_arraybuffer | Detaches the underlying data from an **ArrayBuffer** object. After the data is detached, you can operate the data in C/C++.| 20e41f4b71Sopenharmony_ci| napi_is_detached_arraybuffer | Checks whether an **ArrayBuffer** object has been detached.| 21e41f4b71Sopenharmony_ci| napi_create_arraybuffer | Creates an ArkTS **ArrayBuffer** object with the specified byte length.| 22e41f4b71Sopenharmony_ci 23e41f4b71Sopenharmony_ci## Example 24e41f4b71Sopenharmony_ci 25e41f4b71Sopenharmony_ciIf you are just starting out with Node-API, see [Node-API Development Process](use-napi-process.md). The following demonstrates only the C++ and ArkTS code related to **ArrayBuffer** management. 26e41f4b71Sopenharmony_ci 27e41f4b71Sopenharmony_ci### napi_is_arraybuffer 28e41f4b71Sopenharmony_ci 29e41f4b71Sopenharmony_ciUse **napi_is_arraybuffer** to check whether a JS value is an **ArrayBuffer** object. 30e41f4b71Sopenharmony_ci 31e41f4b71Sopenharmony_ciCPP code: 32e41f4b71Sopenharmony_ci 33e41f4b71Sopenharmony_ci```cpp 34e41f4b71Sopenharmony_ci#include "napi/native_api.h" 35e41f4b71Sopenharmony_ci 36e41f4b71Sopenharmony_cistatic napi_value IsArrayBuffer(napi_env env, napi_callback_info info) 37e41f4b71Sopenharmony_ci{ 38e41f4b71Sopenharmony_ci // Obtain a parameter. 39e41f4b71Sopenharmony_ci size_t argc = 1; 40e41f4b71Sopenharmony_ci napi_value args[1] = {nullptr}; 41e41f4b71Sopenharmony_ci napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 42e41f4b71Sopenharmony_ci // Call napi_is_arraybuffer to check whether the input parameter is an **ArrayBuffer** object. 43e41f4b71Sopenharmony_ci bool result = false; 44e41f4b71Sopenharmony_ci napi_status status = napi_is_arraybuffer(env, args[0], &result); 45e41f4b71Sopenharmony_ci if (status != napi_ok) { 46e41f4b71Sopenharmony_ci napi_throw_error(env, nullptr, "Node-API napi_is_arraybuffer fail"); 47e41f4b71Sopenharmony_ci return nullptr; 48e41f4b71Sopenharmony_ci } 49e41f4b71Sopenharmony_ci // Convert the result to napi_value and return it. 50e41f4b71Sopenharmony_ci napi_value returnValue = nullptr; 51e41f4b71Sopenharmony_ci napi_get_boolean(env, result, &returnValue); 52e41f4b71Sopenharmony_ci return returnValue; 53e41f4b71Sopenharmony_ci} 54e41f4b71Sopenharmony_ci``` 55e41f4b71Sopenharmony_ci 56e41f4b71Sopenharmony_ciAPI declaration: 57e41f4b71Sopenharmony_ci 58e41f4b71Sopenharmony_ci```ts 59e41f4b71Sopenharmony_ci// index.d.ts 60e41f4b71Sopenharmony_ciexport const isArrayBuffer: <T>(arrayBuffer: T) => boolean | void; 61e41f4b71Sopenharmony_ci``` 62e41f4b71Sopenharmony_ci 63e41f4b71Sopenharmony_ciArkTS code: 64e41f4b71Sopenharmony_ci 65e41f4b71Sopenharmony_ci```ts 66e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog' 67e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so' 68e41f4b71Sopenharmony_citry { 69e41f4b71Sopenharmony_ci let value = new ArrayBuffer(1); 70e41f4b71Sopenharmony_ci let data = "123"; 71e41f4b71Sopenharmony_ci hilog.info(0x0000, 'testTag', 'Test Node-API napi_is_arraybuffer: %{public}s', testNapi.isArrayBuffer(value)); 72e41f4b71Sopenharmony_ci hilog.info(0x0000, 'testTag', 'Test Node-API napi_is_arraybuffer: %{public}s', testNapi.isArrayBuffer(data)); 73e41f4b71Sopenharmony_ci} catch (error) { 74e41f4b71Sopenharmony_ci hilog.error(0x0000, 'testTag', 'Test Node-API napi_is_arraybuffer error: %{public}s', error.message); 75e41f4b71Sopenharmony_ci} 76e41f4b71Sopenharmony_ci``` 77e41f4b71Sopenharmony_ci 78e41f4b71Sopenharmony_ci### napi_get_arraybuffer_info 79e41f4b71Sopenharmony_ci 80e41f4b71Sopenharmony_ciUse **napi_get_arraybuffer_info** to obtain the underlying data buffer and length of an **ArrayBuffer** object. 81e41f4b71Sopenharmony_ci 82e41f4b71Sopenharmony_ciCPP code: 83e41f4b71Sopenharmony_ci 84e41f4b71Sopenharmony_ci```cpp 85e41f4b71Sopenharmony_ci#include "napi/native_api.h" 86e41f4b71Sopenharmony_ci 87e41f4b71Sopenharmony_cistatic napi_value GetArraybufferInfo(napi_env env, napi_callback_info info) 88e41f4b71Sopenharmony_ci{ 89e41f4b71Sopenharmony_ci size_t argc = 1; 90e41f4b71Sopenharmony_ci napi_value args[1] = {nullptr}; 91e41f4b71Sopenharmony_ci napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 92e41f4b71Sopenharmony_ci // Check whether the parameter is an ArrayBuffer object. 93e41f4b71Sopenharmony_ci bool isArraybuffer = false; 94e41f4b71Sopenharmony_ci napi_is_arraybuffer(env, args[0], &isArraybuffer); 95e41f4b71Sopenharmony_ci if (!isArraybuffer) { 96e41f4b71Sopenharmony_ci napi_throw_type_error(env, nullptr, "Argument must be an ArrayBuffer"); 97e41f4b71Sopenharmony_ci return nullptr; 98e41f4b71Sopenharmony_ci } 99e41f4b71Sopenharmony_ci 100e41f4b71Sopenharmony_ci void *data = nullptr; 101e41f4b71Sopenharmony_ci size_t byteLength = 0; 102e41f4b71Sopenharmony_ci // Obtain the underlying data buffer and length of the ArrayBuffer object. 103e41f4b71Sopenharmony_ci napi_status status = napi_get_arraybuffer_info(env, args[0], &data, &byteLength); 104e41f4b71Sopenharmony_ci if (status != napi_ok) { 105e41f4b71Sopenharmony_ci napi_throw_error(env, nullptr, "Failed to get ArrayBuffer info"); 106e41f4b71Sopenharmony_ci return nullptr; 107e41f4b71Sopenharmony_ci } 108e41f4b71Sopenharmony_ci // Create a result object. 109e41f4b71Sopenharmony_ci napi_value result = nullptr; 110e41f4b71Sopenharmony_ci napi_create_object(env, &result); 111e41f4b71Sopenharmony_ci // Set the byte length property of the data buffer. 112e41f4b71Sopenharmony_ci napi_value byteLengthValue = nullptr; 113e41f4b71Sopenharmony_ci napi_create_uint32(env, byteLength, &byteLengthValue); 114e41f4b71Sopenharmony_ci napi_set_named_property(env, result, "byteLength", byteLengthValue); 115e41f4b71Sopenharmony_ci napi_value bufferData; 116e41f4b71Sopenharmony_ci napi_create_arraybuffer(env, byteLength, &data, &bufferData); 117e41f4b71Sopenharmony_ci napi_set_named_property(env, result, "buffer", bufferData); 118e41f4b71Sopenharmony_ci return result; 119e41f4b71Sopenharmony_ci} 120e41f4b71Sopenharmony_ci``` 121e41f4b71Sopenharmony_ci 122e41f4b71Sopenharmony_ciAPI declaration: 123e41f4b71Sopenharmony_ci 124e41f4b71Sopenharmony_ci```ts 125e41f4b71Sopenharmony_ci// index.d.ts 126e41f4b71Sopenharmony_ciexport class ArrayBufferInfo { 127e41f4b71Sopenharmony_ci byteLength: number; 128e41f4b71Sopenharmony_ci buffer: Object; 129e41f4b71Sopenharmony_ci} 130e41f4b71Sopenharmony_ciexport const getArraybufferInfo: (data: ArrayBuffer) => ArrayBufferInfo | void; 131e41f4b71Sopenharmony_ci``` 132e41f4b71Sopenharmony_ci 133e41f4b71Sopenharmony_ciArkTS code: 134e41f4b71Sopenharmony_ci 135e41f4b71Sopenharmony_ci```ts 136e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog' 137e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so' 138e41f4b71Sopenharmony_ci 139e41f4b71Sopenharmony_ciconst buffer = new ArrayBuffer(10); 140e41f4b71Sopenharmony_cihilog.info(0x0000, 'testTag', 'Test Node-API get_arraybuffer_info:%{public}s ', JSON.stringify(testNapi.getArraybufferInfo(buffer))); 141e41f4b71Sopenharmony_ci``` 142e41f4b71Sopenharmony_ci 143e41f4b71Sopenharmony_ci### napi_detach_arraybuffer 144e41f4b71Sopenharmony_ci 145e41f4b71Sopenharmony_ciUse **napi_detach_arraybuffer** to detach the underlying data from an **ArrayBuffer** object. 146e41f4b71Sopenharmony_ci 147e41f4b71Sopenharmony_ci### napi_is_detached_arraybuffer 148e41f4b71Sopenharmony_ci 149e41f4b71Sopenharmony_ciUse **napi_is_detached_arraybuffer** to check whether an **ArrayBuffer** object has been detached. 150e41f4b71Sopenharmony_ci 151e41f4b71Sopenharmony_ciCPP code: 152e41f4b71Sopenharmony_ci 153e41f4b71Sopenharmony_ci```cpp 154e41f4b71Sopenharmony_ci#include "napi/native_api.h" 155e41f4b71Sopenharmony_ci 156e41f4b71Sopenharmony_cistatic napi_value DetachedArraybuffer(napi_env env, napi_callback_info info) 157e41f4b71Sopenharmony_ci{ 158e41f4b71Sopenharmony_ci // Call napi_detach_arraybuffer to detach the underlying data from an ArrayBuffer object. 159e41f4b71Sopenharmony_ci size_t argc = 1; 160e41f4b71Sopenharmony_ci napi_value args[1] = {nullptr}; 161e41f4b71Sopenharmony_ci napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 162e41f4b71Sopenharmony_ci napi_value arrayBuffer = args[0]; 163e41f4b71Sopenharmony_ci napi_detach_arraybuffer(env, arrayBuffer); 164e41f4b71Sopenharmony_ci // Pass out the detached ArrayBuffer object. 165e41f4b71Sopenharmony_ci return arrayBuffer; 166e41f4b71Sopenharmony_ci} 167e41f4b71Sopenharmony_ci 168e41f4b71Sopenharmony_cistatic napi_value IsDetachedArraybuffer(napi_env env, napi_callback_info info) 169e41f4b71Sopenharmony_ci{ 170e41f4b71Sopenharmony_ci // Call napi_is_detached_arraybuffer to check whether the specified ArrayBuffer object has been detached. 171e41f4b71Sopenharmony_ci size_t argc = 1; 172e41f4b71Sopenharmony_ci napi_value args[1] = {nullptr}; 173e41f4b71Sopenharmony_ci napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 174e41f4b71Sopenharmony_ci napi_value arrayBuffer = args[0]; 175e41f4b71Sopenharmony_ci bool result = false; 176e41f4b71Sopenharmony_ci napi_is_detached_arraybuffer(env, arrayBuffer, &result); 177e41f4b71Sopenharmony_ci // Call napi_get_boolean to convert the return value to napi_value, and pass out the napi_value for printing. 178e41f4b71Sopenharmony_ci napi_value returnValue; 179e41f4b71Sopenharmony_ci napi_get_boolean(env, result, &returnValue); 180e41f4b71Sopenharmony_ci return returnValue; 181e41f4b71Sopenharmony_ci} 182e41f4b71Sopenharmony_ci``` 183e41f4b71Sopenharmony_ci 184e41f4b71Sopenharmony_ciAPI declaration: 185e41f4b71Sopenharmony_ci 186e41f4b71Sopenharmony_ci```ts 187e41f4b71Sopenharmony_ci// index.d.ts 188e41f4b71Sopenharmony_ciexport const detachedArraybuffer: (buffer:ArrayBuffer) => ArrayBuffer; 189e41f4b71Sopenharmony_ciexport const isDetachedArraybuffer: (arrarBeffer: ArrayBuffer) => boolean; 190e41f4b71Sopenharmony_ci``` 191e41f4b71Sopenharmony_ci 192e41f4b71Sopenharmony_ciArkTS code: 193e41f4b71Sopenharmony_ci 194e41f4b71Sopenharmony_ci```ts 195e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog' 196e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so' 197e41f4b71Sopenharmony_citry { 198e41f4b71Sopenharmony_ci const bufferArray = new ArrayBuffer(8); 199e41f4b71Sopenharmony_ci hilog.info(0x0000, 'testTag', 'Test Node-API napi_is_detached_arraybuffer one: %{public}s', testNapi.isDetachedArraybuffer(bufferArray)); 200e41f4b71Sopenharmony_ci hilog.info(0x0000, 'testTag', 'Test Node-API napi_is_detached_arraybuffer two: %{public}s ', testNapi.isDetachedArraybuffer(testNapi.detachedArraybuffer(bufferArray))); 201e41f4b71Sopenharmony_ci} catch (error) { 202e41f4b71Sopenharmony_ci hilog.error(0x0000, 'testTag', 'Test Node-API napi_is_detached_arraybuffer error: %{public}s', error.message); 203e41f4b71Sopenharmony_ci} 204e41f4b71Sopenharmony_ci``` 205e41f4b71Sopenharmony_ci 206e41f4b71Sopenharmony_ci### napi_create_arraybuffer 207e41f4b71Sopenharmony_ci 208e41f4b71Sopenharmony_ciUse **napi_create_arraybuffer** to create an ArkTS **ArrayBuffer** object with the specified byte length in C/C++. If the caller wants to directly operate the buffer, return the underlying buffer to the caller. To write data to this buffer from ArkTS, you need to create a **TypedArray** or **DataView** object. 209e41f4b71Sopenharmony_ci 210e41f4b71Sopenharmony_ciCPP code: 211e41f4b71Sopenharmony_ci 212e41f4b71Sopenharmony_ci```cpp 213e41f4b71Sopenharmony_ci#include "napi/native_api.h" 214e41f4b71Sopenharmony_ci 215e41f4b71Sopenharmony_cistatic napi_value CreateArraybuffer(napi_env env, napi_callback_info info) 216e41f4b71Sopenharmony_ci{ 217e41f4b71Sopenharmony_ci size_t argc = 1; 218e41f4b71Sopenharmony_ci napi_value argv[1] = {nullptr}; 219e41f4b71Sopenharmony_ci napi_value result = nullptr; 220e41f4b71Sopenharmony_ci // Parse the input parameters. 221e41f4b71Sopenharmony_ci napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); 222e41f4b71Sopenharmony_ci int32_t value; 223e41f4b71Sopenharmony_ci size_t length; 224e41f4b71Sopenharmony_ci // Convert the parameter passed from ArkTS to the size_t type and use it as the parameter of napi_create_arraybuffer. 225e41f4b71Sopenharmony_ci napi_get_value_int32(env, argv[0], &value); 226e41f4b71Sopenharmony_ci length = size_t(value); 227e41f4b71Sopenharmony_ci void *data; 228e41f4b71Sopenharmony_ci // Create an ArrayBuffer object. 229e41f4b71Sopenharmony_ci napi_create_arraybuffer(env, length, &data, &result); 230e41f4b71Sopenharmony_ci // Return the ArrayBuffer object. 231e41f4b71Sopenharmony_ci return result; 232e41f4b71Sopenharmony_ci} 233e41f4b71Sopenharmony_ci``` 234e41f4b71Sopenharmony_ci 235e41f4b71Sopenharmony_ciAPI declaration: 236e41f4b71Sopenharmony_ci 237e41f4b71Sopenharmony_ci```ts 238e41f4b71Sopenharmony_ci// index.d.ts 239e41f4b71Sopenharmony_ciexport const createArraybuffer: (size: number) => ArrayBuffer; 240e41f4b71Sopenharmony_ci``` 241e41f4b71Sopenharmony_ci 242e41f4b71Sopenharmony_ciArkTS code: 243e41f4b71Sopenharmony_ci 244e41f4b71Sopenharmony_ci```ts 245e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog' 246e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so' 247e41f4b71Sopenharmony_ci 248e41f4b71Sopenharmony_cihilog.info(0x0000, 'testTag', 'Test Node-API napi_create_arraybuffer:%{public}s', testNapi.createArraybuffer(10).toString()); 249e41f4b71Sopenharmony_ci``` 250e41f4b71Sopenharmony_ci 251e41f4b71Sopenharmony_ciTo print logs in the native CPP, add the following information to the **CMakeLists.txt** file and add the header file by using **#include "hilog/log.h"**. 252e41f4b71Sopenharmony_ci 253e41f4b71Sopenharmony_ci```text 254e41f4b71Sopenharmony_ci// CMakeLists.txt 255e41f4b71Sopenharmony_ciadd_definitions( "-DLOG_DOMAIN=0xd0d0" ) 256e41f4b71Sopenharmony_ciadd_definitions( "-DLOG_TAG=\"testTag\"" ) 257e41f4b71Sopenharmony_citarget_link_libraries(entry PUBLIC libhilog_ndk.z.so) 258e41f4b71Sopenharmony_ci``` 259