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