1e41f4b71Sopenharmony_ci# Using Node-API Extension APIs
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci## Introduction
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ciThe Node-API [extension APIs](../reference/native-lib/napi.md) extends Node-API functionalities and provides APIs for creating custom ArkTS objects, which allows more flexible interaction between ArkTS and C/C++.
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_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 involved in the Node-API extension APIs.
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci## Module Loading
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci### Available APIs
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci| API| Description|
14e41f4b71Sopenharmony_ci| -------- | -------- |
15e41f4b71Sopenharmony_ci| napi_load_module | Loads an .abc file as a module. This API returns the namespace of the module. You can use it for the applications that need to dynamically load modules or resources in runtime.|
16e41f4b71Sopenharmony_ci| napi_load_module_with_info | Loads a module. After the module is loaded, you can use **napi_get_property** to obtain the variables exported by the module or use **napi_get_named_property** to obtain the functions exported by the module. The **napi_load_module_with_info** API can be used in a [newly created ArkTS runtime environment](use-napi-ark-runtime.md).|
17e41f4b71Sopenharmony_ci| napi_module_register | Registers a native module. Sometimes, you may need to implement certain functionalities using Node-API for better performance. You can use **napi_module_register** to customize the functionalities implemented using Node-API as a module and register it with ArkTS. This can improve the overall performance.|
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ci### Example
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci#### napi_load_module
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ciUse **napi_load_module** to [load a module in the main thread](use-napi-load-module.md).
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci#### napi_load_module_with_info
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ciUse **napi_load_module_with_info** to [load a module](use-napi-load-module-with-info.md).
28e41f4b71Sopenharmony_ci
29e41f4b71Sopenharmony_ci#### napi_module_register
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ciUse **napi_module_register** to register a custom module, which is implemented by using Node-API, with the ArkTS environment.
32e41f4b71Sopenharmony_ci
33e41f4b71Sopenharmony_ciCPP code:
34e41f4b71Sopenharmony_ci
35e41f4b71Sopenharmony_ci```cpp
36e41f4b71Sopenharmony_ci#include "napi/native_api.h"
37e41f4b71Sopenharmony_ci
38e41f4b71Sopenharmony_ci// This module is a Node-API callback function.
39e41f4b71Sopenharmony_cistatic napi_value Add(napi_env env, napi_callback_info info)
40e41f4b71Sopenharmony_ci{
41e41f4b71Sopenharmony_ci    // Obtain the two parameters passed in.
42e41f4b71Sopenharmony_ci    size_t requireArgc = 2;
43e41f4b71Sopenharmony_ci    size_t argc = 2;
44e41f4b71Sopenharmony_ci    napi_value args[2] = {nullptr};
45e41f4b71Sopenharmony_ci    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
46e41f4b71Sopenharmony_ci
47e41f4b71Sopenharmony_ci    // Convert the parameter of the napi_value type to the double type.
48e41f4b71Sopenharmony_ci    double valueLift;
49e41f4b71Sopenharmony_ci    double valueRight;
50e41f4b71Sopenharmony_ci    napi_get_value_double(env, args[0], &valueLift);
51e41f4b71Sopenharmony_ci    napi_get_value_double(env, args[1], &valueRight);
52e41f4b71Sopenharmony_ci
53e41f4b71Sopenharmony_ci    // Add up the converted double values, convert the sum into napi_value, and return the result to ArkTS.
54e41f4b71Sopenharmony_ci    napi_value sum;
55e41f4b71Sopenharmony_ci    napi_create_double(env, valueLift + valueRight, &sum);
56e41f4b71Sopenharmony_ci
57e41f4b71Sopenharmony_ci    return sum;
58e41f4b71Sopenharmony_ci}
59e41f4b71Sopenharmony_ci
60e41f4b71Sopenharmony_ci// Call the C++ Init() function to initialize the addon, which associates the functions or properties in ArkTS with those in C++.
61e41f4b71Sopenharmony_ciEXTERN_C_START
62e41f4b71Sopenharmony_cistatic napi_value Init(napi_env env, napi_value exports)
63e41f4b71Sopenharmony_ci{
64e41f4b71Sopenharmony_ci    // Use the napi_property_descriptor struct to define the properties to be exported and used in the Node-API module. napi_define_properties associates ArkTS properties with C++ functions so that they can be accessed and called from ArkTS.
65e41f4b71Sopenharmony_ci    napi_property_descriptor desc[] = {
66e41f4b71Sopenharmony_ci        { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }
67e41f4b71Sopenharmony_ci    };
68e41f4b71Sopenharmony_ci    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
69e41f4b71Sopenharmony_ci    return exports;
70e41f4b71Sopenharmony_ci}
71e41f4b71Sopenharmony_ciEXTERN_C_END
72e41f4b71Sopenharmony_ci
73e41f4b71Sopenharmony_ci// The addon initialization is defined in a struct named demoModule, which contains the basic module information, such as the version number and registered functions.
74e41f4b71Sopenharmony_cistatic napi_module demoModule = {
75e41f4b71Sopenharmony_ci    .nm_version =1,
76e41f4b71Sopenharmony_ci    .nm_flags = 0,
77e41f4b71Sopenharmony_ci    .nm_filename = nullptr,
78e41f4b71Sopenharmony_ci    .nm_register_func = Init,
79e41f4b71Sopenharmony_ci    .nm_modname = "entry",
80e41f4b71Sopenharmony_ci    .nm_priv = ((void*)0),
81e41f4b71Sopenharmony_ci    .reserved = { 0 },
82e41f4b71Sopenharmony_ci};
83e41f4b71Sopenharmony_ci
84e41f4b71Sopenharmony_ci// In the RegisterEntryModule function, the napi_module_register function is used to register and export the addon.
85e41f4b71Sopenharmony_ciextern "C" __attribute__((constructor)) void RegisterEntryModule(void)
86e41f4b71Sopenharmony_ci{
87e41f4b71Sopenharmony_ci    napi_module_register(&demoModule);
88e41f4b71Sopenharmony_ci}
89e41f4b71Sopenharmony_ci```
90e41f4b71Sopenharmony_ci
91e41f4b71Sopenharmony_ciAPI declaration:
92e41f4b71Sopenharmony_ci
93e41f4b71Sopenharmony_ci```ts
94e41f4b71Sopenharmony_ci// index.d.ts
95e41f4b71Sopenharmony_ciexport const add: (a: number, b: number) => number;
96e41f4b71Sopenharmony_ci```
97e41f4b71Sopenharmony_ci
98e41f4b71Sopenharmony_ciArkTS code:
99e41f4b71Sopenharmony_ci
100e41f4b71Sopenharmony_ci```ts
101e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
102e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
103e41f4b71Sopenharmony_ci
104e41f4b71Sopenharmony_cihilog.info(0x0000, 'testTag', 'Test Node-API 2 + 3 = %{public}d', testNapi.add(2, 3));
105e41f4b71Sopenharmony_ci```
106e41f4b71Sopenharmony_ci
107e41f4b71Sopenharmony_ci## ArkTS Object Operations
108e41f4b71Sopenharmony_ci
109e41f4b71Sopenharmony_ci### Available APIs
110e41f4b71Sopenharmony_ci
111e41f4b71Sopenharmony_ci| API| Description|
112e41f4b71Sopenharmony_ci| -------- | -------- |
113e41f4b71Sopenharmony_ci| napi_create_object_with_properties | Creates an ArkTS object with the given **napi_property_descriptor** in a native module. The key in **napi_property_descriptor** must be a string and cannot be converted into a number.|
114e41f4b71Sopenharmony_ci| napi_create_object_with_named_properties | Creates an ArkTS object with the given **napi_value** and key in a native module. The key must be a string and cannot be converted into a number.|
115e41f4b71Sopenharmony_ci
116e41f4b71Sopenharmony_ci### Example
117e41f4b71Sopenharmony_ci
118e41f4b71Sopenharmony_ci#### napi_create_object_with_properties
119e41f4b71Sopenharmony_ci
120e41f4b71Sopenharmony_ciUse **napi_create_object_with_properties** to create an ArkTS object with the given **napi_property_descriptor**. The key of **napi_property_descriptor** must be a string and cannot be converted into a number.
121e41f4b71Sopenharmony_ci
122e41f4b71Sopenharmony_ciCPP code:
123e41f4b71Sopenharmony_ci
124e41f4b71Sopenharmony_ci```cpp
125e41f4b71Sopenharmony_ci#include "napi/native_api.h"
126e41f4b71Sopenharmony_ci
127e41f4b71Sopenharmony_cistatic napi_value CreateObjectWithProperties(napi_env env, napi_callback_info info)
128e41f4b71Sopenharmony_ci{
129e41f4b71Sopenharmony_ci    size_t argc = 1;
130e41f4b71Sopenharmony_ci    napi_value argv[1] = nullptr;
131e41f4b71Sopenharmony_ci    // Obtain the parameters of the call.
132e41f4b71Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
133e41f4b71Sopenharmony_ci    // Declare a desc array in napi_property_descriptor. The desc array contains a property named "name", whose value is the first input parameter argv[0].
134e41f4b71Sopenharmony_ci    napi_property_descriptor desc[] = {
135e41f4b71Sopenharmony_ci        {"name", nullptr, nullptr, nullptr, nullptr, argv[0], napi_default_jsproperty, nullptr}};
136e41f4b71Sopenharmony_ci    napi_value object = nullptr;
137e41f4b71Sopenharmony_ci    // Call napi_create_object_with_properties to create an ArkTS object with the specified properties.
138e41f4b71Sopenharmony_ci    napi_create_object_with_properties(env, &object, sizeof(desc) / sizeof(desc[0]), desc);
139e41f4b71Sopenharmony_ci    napi_valuetype valueType;
140e41f4b71Sopenharmony_ci    napi_typeof(env, object, &valueType);
141e41f4b71Sopenharmony_ci    if (valueType == napi_object) {
142e41f4b71Sopenharmony_ci        return object;
143e41f4b71Sopenharmony_ci    }
144e41f4b71Sopenharmony_ci}
145e41f4b71Sopenharmony_ci```
146e41f4b71Sopenharmony_ci
147e41f4b71Sopenharmony_ciAPI declaration:
148e41f4b71Sopenharmony_ci
149e41f4b71Sopenharmony_ci```ts
150e41f4b71Sopenharmony_ci// index.d.ts
151e41f4b71Sopenharmony_ciexport const createObjectWithProperties: (data: string) => Object;
152e41f4b71Sopenharmony_ci```
153e41f4b71Sopenharmony_ci
154e41f4b71Sopenharmony_ciArkTS code:
155e41f4b71Sopenharmony_ci
156e41f4b71Sopenharmony_ci```ts
157e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
158e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
159e41f4b71Sopenharmony_ci
160e41f4b71Sopenharmony_cilet value = testNapi.createObjectWithProperties('createObject');
161e41f4b71Sopenharmony_cihilog.info(0x0000, 'testTag', 'Node-API napi_create_object_with_properties:%{public}s', JSON.stringify(value));
162e41f4b71Sopenharmony_ci```
163e41f4b71Sopenharmony_ci
164e41f4b71Sopenharmony_ci#### napi_create_object_with_named_properties
165e41f4b71Sopenharmony_ci
166e41f4b71Sopenharmony_ciUse **napi_create_object_with_named_properties** to create an ArkTS object with the specified **napi_value** and key. The key must be a string and cannot be converted into a number.
167e41f4b71Sopenharmony_ci
168e41f4b71Sopenharmony_ciCPP code:
169e41f4b71Sopenharmony_ci
170e41f4b71Sopenharmony_ci```cpp
171e41f4b71Sopenharmony_ci#include "napi/native_api.h"
172e41f4b71Sopenharmony_ci
173e41f4b71Sopenharmony_cistatic napi_value CreateObjectWithNameProperties(napi_env env, napi_callback_info info)
174e41f4b71Sopenharmony_ci{
175e41f4b71Sopenharmony_ci    size_t argc = 1;
176e41f4b71Sopenharmony_ci    napi_value argv[1] = nullptr;
177e41f4b71Sopenharmony_ci    // Obtain the parameters of the call.
178e41f4b71Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
179e41f4b71Sopenharmony_ci    napi_value obj = nullptr;
180e41f4b71Sopenharmony_ci    const char *key[] = {
181e41f4b71Sopenharmony_ci        "name",
182e41f4b71Sopenharmony_ci    };
183e41f4b71Sopenharmony_ci    const napi_value values[] = {
184e41f4b71Sopenharmony_ci        argv[0],
185e41f4b71Sopenharmony_ci    };
186e41f4b71Sopenharmony_ci    napi_property_descriptor desc[] = {{"name", nullptr, nullptr,
187e41f4b71Sopenharmony_ci                                        nullptr, nullptr, nullptr, napi_default, nullptr}};
188e41f4b71Sopenharmony_ci    napi_status status;
189e41f4b71Sopenharmony_ci    status = napi_create_object_with_named_properties(env, &obj, sizeof(desc) / sizeof(desc[0]), key, values);
190e41f4b71Sopenharmony_ci    if (status != napi_ok) {
191e41f4b71Sopenharmony_ci        return argv[0];
192e41f4b71Sopenharmony_ci    }
193e41f4b71Sopenharmony_ci    return obj;
194e41f4b71Sopenharmony_ci}
195e41f4b71Sopenharmony_ci```
196e41f4b71Sopenharmony_ci
197e41f4b71Sopenharmony_ciAPI declaration:
198e41f4b71Sopenharmony_ci
199e41f4b71Sopenharmony_ci```ts
200e41f4b71Sopenharmony_ci// index.d.ts
201e41f4b71Sopenharmony_ciexport const createObjectWithNameProperties: (data: string) => string | { name: string };
202e41f4b71Sopenharmony_ci```
203e41f4b71Sopenharmony_ci
204e41f4b71Sopenharmony_ciArkTS code:
205e41f4b71Sopenharmony_ci
206e41f4b71Sopenharmony_ci```ts
207e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
208e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
209e41f4b71Sopenharmony_ci
210e41f4b71Sopenharmony_cilet value = testNapi.createObjectWithNameProperties('ls');
211e41f4b71Sopenharmony_cihilog.info(0x0000, 'testTag', 'Node-API napi_create_object_with_named_properties:%{public}s', JSON.stringify(value));
212e41f4b71Sopenharmony_ci```
213e41f4b71Sopenharmony_ci
214e41f4b71Sopenharmony_ci## Runing an .abc File
215e41f4b71Sopenharmony_ci
216e41f4b71Sopenharmony_ci### Available APIs
217e41f4b71Sopenharmony_ci
218e41f4b71Sopenharmony_ci| API| Description|
219e41f4b71Sopenharmony_ci| -------- | -------- |
220e41f4b71Sopenharmony_ci| napi_run_script_path | Runs the specified .abc file.|
221e41f4b71Sopenharmony_ci
222e41f4b71Sopenharmony_ci### Example
223e41f4b71Sopenharmony_ci
224e41f4b71Sopenharmony_ci#### napi_run_script_path
225e41f4b71Sopenharmony_ci
226e41f4b71Sopenharmony_ciUse **napi_run_script_path** to run an .abc file.
227e41f4b71Sopenharmony_ci
228e41f4b71Sopenharmony_ciCPP code:
229e41f4b71Sopenharmony_ci
230e41f4b71Sopenharmony_ci```cpp
231e41f4b71Sopenharmony_ci#include "napi/native_api.h"
232e41f4b71Sopenharmony_ci
233e41f4b71Sopenharmony_cistatic napi_value RunScriptPath(napi_env env, napi_callback_info info)
234e41f4b71Sopenharmony_ci{
235e41f4b71Sopenharmony_ci    napi_value value = nullptr;
236e41f4b71Sopenharmony_ci    // The .abc file in the rawfile directory of the application.
237e41f4b71Sopenharmony_ci    const char *scriptPath = "/entry/resources/rawfile/test.abc";
238e41f4b71Sopenharmony_ci    // Call napi_run_script_path to execute the file of the specified path.
239e41f4b71Sopenharmony_ci    napi_status status = napi_run_script_path(env, scriptPath, &value);
240e41f4b71Sopenharmony_ci    // Check whether the script execution is successful. If the execution fails, return false.
241e41f4b71Sopenharmony_ci    napi_value returnValue = nullptr;
242e41f4b71Sopenharmony_ci    if (value == nullptr || status != napi_ok) {
243e41f4b71Sopenharmony_ci        napi_get_boolean(env, false, &returnValue);
244e41f4b71Sopenharmony_ci    } else {
245e41f4b71Sopenharmony_ci        napi_get_boolean(env, true, &returnValue);
246e41f4b71Sopenharmony_ci    }
247e41f4b71Sopenharmony_ci    return returnValue;
248e41f4b71Sopenharmony_ci}
249e41f4b71Sopenharmony_ci```
250e41f4b71Sopenharmony_ci
251e41f4b71Sopenharmony_ciAPI declaration:
252e41f4b71Sopenharmony_ci
253e41f4b71Sopenharmony_ci```ts
254e41f4b71Sopenharmony_ci// index.d.ts
255e41f4b71Sopenharmony_ciexport const runScriptPath: () => boolean;
256e41f4b71Sopenharmony_ci```
257e41f4b71Sopenharmony_ci
258e41f4b71Sopenharmony_ciArkTS code:
259e41f4b71Sopenharmony_ci
260e41f4b71Sopenharmony_ci```ts
261e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
262e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
263e41f4b71Sopenharmony_ci
264e41f4b71Sopenharmony_citry {
265e41f4b71Sopenharmony_ci  // Return true is the script is executed successfully; return false otherwise.
266e41f4b71Sopenharmony_ci  hilog.info(0x0000, 'testTag', 'Test Node-API napi_run_script_path: %{public}s', testNapi.runScriptPath());
267e41f4b71Sopenharmony_ci} catch (error) {
268e41f4b71Sopenharmony_ci  hilog.error(0x0000, 'testTag', 'Test Node-API napi_run_script_path errorMessage: %{public}s', error.message);
269e41f4b71Sopenharmony_ci}
270e41f4b71Sopenharmony_ci```
271e41f4b71Sopenharmony_ci
272e41f4b71Sopenharmony_ciTo compile JS code, **test.js** for example, into an .abc file, perform the following steps:
273e41f4b71Sopenharmony_ci
274e41f4b71Sopenharmony_ci1. Place the **test.js** file in the **ets/build-tools/ets-loader/bin/ark/build-win/bin** directory of the SDK.
275e41f4b71Sopenharmony_ci2. Run the **es2abc.exe test.js --output test.abc** command. The **test.abc** file is generated.
276e41f4b71Sopenharmony_ci
277e41f4b71Sopenharmony_ciSave the file to the **/entry/resources/rawfile** directory.
278e41f4b71Sopenharmony_ci
279e41f4b71Sopenharmony_ci```js
280e41f4b71Sopenharmony_cifunction add(a, b) {
281e41f4b71Sopenharmony_ci  return a+b;
282e41f4b71Sopenharmony_ci}
283e41f4b71Sopenharmony_ciadd(1, 2);
284e41f4b71Sopenharmony_ci```
285e41f4b71Sopenharmony_ci
286e41f4b71Sopenharmony_ci## Adding an Async Work with the Specified Priority to a Queue
287e41f4b71Sopenharmony_ci
288e41f4b71Sopenharmony_ci### Available APIs
289e41f4b71Sopenharmony_ci
290e41f4b71Sopenharmony_ci| API| Description|
291e41f4b71Sopenharmony_ci| -------- | -------- |
292e41f4b71Sopenharmony_ci| napi_queue_async_work_with_qos | Adds an async work object to the queue so that it can be scheduled for execution based on the QoS priority passed in.|
293e41f4b71Sopenharmony_ci
294e41f4b71Sopenharmony_ci### Example
295e41f4b71Sopenharmony_ci
296e41f4b71Sopenharmony_ci#### napi_queue_async_work_with_qos
297e41f4b71Sopenharmony_ci
298e41f4b71Sopenharmony_ciUse **napi_queue_async_work_with_qos** to add an async work to the queue. Then, the async work will be scheduled for execution based on the specified QoS priority.
299e41f4b71Sopenharmony_ci
300e41f4b71Sopenharmony_ci<!--Del-->
301e41f4b71Sopenharmony_ciSee [Prioritizing Asynchronous Tasks](../performance/develop-Native-modules-using-NAPI-safely-and-efficiently.md#prioritizing-asynchronous-tasks).
302e41f4b71Sopenharmony_ci<!--DelEnd-->
303e41f4b71Sopenharmony_ci
304e41f4b71Sopenharmony_ci## Binding an ArkTS Object and a Native Callback with Parameters
305e41f4b71Sopenharmony_ci
306e41f4b71Sopenharmony_ci### Available APIs
307e41f4b71Sopenharmony_ci
308e41f4b71Sopenharmony_ci| API| Description|
309e41f4b71Sopenharmony_ci| -------- | -------- |
310e41f4b71Sopenharmony_ci| napi_coerce_to_native_binding_object | Forcibly binds an ArkTS object and a native callback with necessary data. This API allows the ArkTS object to carry native information.|
311e41f4b71Sopenharmony_ci
312e41f4b71Sopenharmony_ci### Example
313e41f4b71Sopenharmony_ci
314e41f4b71Sopenharmony_ci#### napi_coerce_to_native_binding_object
315e41f4b71Sopenharmony_ci
316e41f4b71Sopenharmony_ciUse **napi_coerce_to_native_binding_object** to bind an ArkTS object and a native callback with necessary data. This API allows the ArkTS object to carry native information.
317e41f4b71Sopenharmony_ci
318e41f4b71Sopenharmony_ciCPP code:
319e41f4b71Sopenharmony_ci
320e41f4b71Sopenharmony_ci```cpp
321e41f4b71Sopenharmony_ci#include <bits/alltypes.h>
322e41f4b71Sopenharmony_ci#include <mutex>
323e41f4b71Sopenharmony_ci#include <unordered_set>
324e41f4b71Sopenharmony_ci#include <uv.h>
325e41f4b71Sopenharmony_ci#include "napi/native_api.h"
326e41f4b71Sopenharmony_ci
327e41f4b71Sopenharmony_ciclass Object {
328e41f4b71Sopenharmony_cipublic:
329e41f4b71Sopenharmony_ci    Object() = default;
330e41f4b71Sopenharmony_ci    ~Object() = default;
331e41f4b71Sopenharmony_ci
332e41f4b71Sopenharmony_ci    static Object* GetInstance()
333e41f4b71Sopenharmony_ci    {
334e41f4b71Sopenharmony_ci        Object* instance = new Object();
335e41f4b71Sopenharmony_ci        return instance;
336e41f4b71Sopenharmony_ci    }
337e41f4b71Sopenharmony_ci
338e41f4b71Sopenharmony_ci    static napi_value GetAddress(napi_env env, napi_callback_info info)
339e41f4b71Sopenharmony_ci    {
340e41f4b71Sopenharmony_ci        napi_value thisVar = nullptr;
341e41f4b71Sopenharmony_ci        napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
342e41f4b71Sopenharmony_ci        if (thisVar == nullptr) {
343e41f4b71Sopenharmony_ci            return nullptr;
344e41f4b71Sopenharmony_ci        }
345e41f4b71Sopenharmony_ci        void* object = nullptr;
346e41f4b71Sopenharmony_ci        napi_unwrap(env, thisVar, &object);
347e41f4b71Sopenharmony_ci        if (object == nullptr) {
348e41f4b71Sopenharmony_ci            return nullptr;
349e41f4b71Sopenharmony_ci        }
350e41f4b71Sopenharmony_ci        uint64_t addressVal = reinterpret_cast<uint64_t>(object);
351e41f4b71Sopenharmony_ci        napi_value address = nullptr;
352e41f4b71Sopenharmony_ci        napi_create_bigint_uint64(env, addressVal, &address);
353e41f4b71Sopenharmony_ci        return address;
354e41f4b71Sopenharmony_ci    }
355e41f4b71Sopenharmony_ci
356e41f4b71Sopenharmony_ci    // Obtain the array size.
357e41f4b71Sopenharmony_ci    static napi_value GetSetSize(napi_env env, napi_callback_info info)
358e41f4b71Sopenharmony_ci    {
359e41f4b71Sopenharmony_ci        napi_value thisVar = nullptr;
360e41f4b71Sopenharmony_ci        napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
361e41f4b71Sopenharmony_ci        if (thisVar == nullptr) {
362e41f4b71Sopenharmony_ci            return nullptr;
363e41f4b71Sopenharmony_ci        }
364e41f4b71Sopenharmony_ci        void* object = nullptr;
365e41f4b71Sopenharmony_ci        napi_unwrap(env, thisVar, &object);
366e41f4b71Sopenharmony_ci        if (object == nullptr) {
367e41f4b71Sopenharmony_ci            return nullptr;
368e41f4b71Sopenharmony_ci        }
369e41f4b71Sopenharmony_ci        std::lock_guard<std::mutex> lock(reinterpret_cast<Object*>(object)->numberSetMutex_);
370e41f4b71Sopenharmony_ci        uint32_t setSize = reinterpret_cast<Object*>(object)->numberSet_.size();
371e41f4b71Sopenharmony_ci        napi_value napiSize = nullptr;
372e41f4b71Sopenharmony_ci        napi_create_uint32(env, setSize, &napiSize);
373e41f4b71Sopenharmony_ci        return napiSize;
374e41f4b71Sopenharmony_ci    }
375e41f4b71Sopenharmony_ci
376e41f4b71Sopenharmony_ci    // Insert an element into the array.
377e41f4b71Sopenharmony_ci    static napi_value Store(napi_env env, napi_callback_info info)
378e41f4b71Sopenharmony_ci    {
379e41f4b71Sopenharmony_ci        size_t argc = 1;
380e41f4b71Sopenharmony_ci        napi_value args[1] = {nullptr};
381e41f4b71Sopenharmony_ci        napi_value thisVar = nullptr;
382e41f4b71Sopenharmony_ci        napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
383e41f4b71Sopenharmony_ci        if (argc != 1) {
384e41f4b71Sopenharmony_ci            napi_throw_error(env, nullptr, "Store args number must be one.");
385e41f4b71Sopenharmony_ci            return nullptr;
386e41f4b71Sopenharmony_ci        }
387e41f4b71Sopenharmony_ci        napi_valuetype type = napi_undefined;
388e41f4b71Sopenharmony_ci        napi_typeof(env, args[0], &type);
389e41f4b71Sopenharmony_ci        if (type != napi_number) {
390e41f4b71Sopenharmony_ci            napi_throw_error(env, nullptr, "Store args is not number.");
391e41f4b71Sopenharmony_ci            return nullptr;
392e41f4b71Sopenharmony_ci        }
393e41f4b71Sopenharmony_ci        if (thisVar == nullptr) {
394e41f4b71Sopenharmony_ci            return nullptr;
395e41f4b71Sopenharmony_ci        }
396e41f4b71Sopenharmony_ci        uint32_t value = 0;
397e41f4b71Sopenharmony_ci        napi_get_value_uint32(env, args[0], &value);
398e41f4b71Sopenharmony_ci        void* object = nullptr;
399e41f4b71Sopenharmony_ci        napi_unwrap(env, thisVar, &object);
400e41f4b71Sopenharmony_ci        if (object == nullptr) {
401e41f4b71Sopenharmony_ci            return nullptr;
402e41f4b71Sopenharmony_ci        }
403e41f4b71Sopenharmony_ci        std::lock_guard<std::mutex> lock(reinterpret_cast<Object*>(object)->numberSetMutex_);
404e41f4b71Sopenharmony_ci        reinterpret_cast<Object *>(object)-> numberSet_.insert(value);
405e41f4b71Sopenharmony_ci        return nullptr;
406e41f4b71Sopenharmony_ci    }
407e41f4b71Sopenharmony_ci
408e41f4b71Sopenharmony_ci    // Delete an element from the array.
409e41f4b71Sopenharmony_ci    static napi_value Erase(napi_env env, napi_callback_info info)
410e41f4b71Sopenharmony_ci    {
411e41f4b71Sopenharmony_ci        size_t argc = 1;
412e41f4b71Sopenharmony_ci        napi_value args[1] = {nullptr};
413e41f4b71Sopenharmony_ci        napi_value thisVar = nullptr;
414e41f4b71Sopenharmony_ci        napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr);
415e41f4b71Sopenharmony_ci        if (argc != 1) {
416e41f4b71Sopenharmony_ci            napi_throw_error(env, nullptr, "Erase args number must be one.");
417e41f4b71Sopenharmony_ci            return nullptr;
418e41f4b71Sopenharmony_ci        }
419e41f4b71Sopenharmony_ci        napi_valuetype type = napi_undefined;
420e41f4b71Sopenharmony_ci        napi_typeof(env, args[0], &type);
421e41f4b71Sopenharmony_ci        if (type != napi_number) {
422e41f4b71Sopenharmony_ci            napi_throw_error(env, nullptr, "Erase args is not number.");
423e41f4b71Sopenharmony_ci            return nullptr;
424e41f4b71Sopenharmony_ci        }
425e41f4b71Sopenharmony_ci        if (thisVar == nullptr) {
426e41f4b71Sopenharmony_ci            return nullptr;
427e41f4b71Sopenharmony_ci        }
428e41f4b71Sopenharmony_ci        uint32_t value = 0;
429e41f4b71Sopenharmony_ci        napi_get_value_uint32(env, args[0], &value);
430e41f4b71Sopenharmony_ci        void* object = nullptr;
431e41f4b71Sopenharmony_ci        napi_unwrap(env, thisVar, &object);
432e41f4b71Sopenharmony_ci        if (object == nullptr) {
433e41f4b71Sopenharmony_ci            return nullptr;
434e41f4b71Sopenharmony_ci        }
435e41f4b71Sopenharmony_ci        std::lock_guard<std::mutex> lock(reinterpret_cast<Object*>(object)->numberSetMutex_);
436e41f4b71Sopenharmony_ci        reinterpret_cast<Object *>(object)->numberSet_.erase(value);
437e41f4b71Sopenharmony_ci        return nullptr;
438e41f4b71Sopenharmony_ci    }
439e41f4b71Sopenharmony_ci
440e41f4b71Sopenharmony_ci    // Clear the array.
441e41f4b71Sopenharmony_ci    static napi_value Clear(napi_env env, napi_callback_info info)
442e41f4b71Sopenharmony_ci    {
443e41f4b71Sopenharmony_ci        napi_value thisVar = nullptr;
444e41f4b71Sopenharmony_ci        napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
445e41f4b71Sopenharmony_ci        if (thisVar == nullptr) {
446e41f4b71Sopenharmony_ci            return nullptr;
447e41f4b71Sopenharmony_ci        }
448e41f4b71Sopenharmony_ci        void* object = nullptr;
449e41f4b71Sopenharmony_ci        napi_unwrap(env, thisVar, &object);
450e41f4b71Sopenharmony_ci        if (object == nullptr) {
451e41f4b71Sopenharmony_ci            return nullptr;
452e41f4b71Sopenharmony_ci        }
453e41f4b71Sopenharmony_ci        std::lock_guard<std::mutex> lock(reinterpret_cast<Object*>(object)->numberSetMutex_);
454e41f4b71Sopenharmony_ci        reinterpret_cast<Object *>(object)->numberSet_.clear();
455e41f4b71Sopenharmony_ci        return nullptr;
456e41f4b71Sopenharmony_ci    }
457e41f4b71Sopenharmony_ci
458e41f4b71Sopenharmony_ciprivate:
459e41f4b71Sopenharmony_ci    Object(const Object &) = delete;
460e41f4b71Sopenharmony_ci    Object &operator=(const Object &) = delete;
461e41f4b71Sopenharmony_ci
462e41f4b71Sopenharmony_ci    std::unordered_set<uint32_t> numberSet_{};
463e41f4b71Sopenharmony_ci    std::mutex numberSetMutex_{};
464e41f4b71Sopenharmony_ci};
465e41f4b71Sopenharmony_ci
466e41f4b71Sopenharmony_civoid FinializeCallback(napi_env env, void *data, void *hint)
467e41f4b71Sopenharmony_ci{
468e41f4b71Sopenharmony_ci    return;
469e41f4b71Sopenharmony_ci}
470e41f4b71Sopenharmony_ci
471e41f4b71Sopenharmony_ci// Detach a callback. Generally, it is called in serialization to perform cleanup operations when the object is detached.
472e41f4b71Sopenharmony_civoid* DetachCallback(napi_env env, void *value, void *hint)
473e41f4b71Sopenharmony_ci{
474e41f4b71Sopenharmony_ci    return value;
475e41f4b71Sopenharmony_ci}
476e41f4b71Sopenharmony_ci
477e41f4b71Sopenharmony_ci// Attach the callback, which is called during deserialization.
478e41f4b71Sopenharmony_cinapi_value AttachCallback(napi_env env, void* value, void* hint)
479e41f4b71Sopenharmony_ci{
480e41f4b71Sopenharmony_ci    napi_value object = nullptr;
481e41f4b71Sopenharmony_ci    napi_create_object(env, &object);
482e41f4b71Sopenharmony_ci    napi_property_descriptor desc[] = {
483e41f4b71Sopenharmony_ci        {"getAddress", nullptr, Object::GetAddress, nullptr, nullptr, nullptr, napi_default, nullptr},
484e41f4b71Sopenharmony_ci        {"getSetSize", nullptr, Object::GetSetSize, nullptr, nullptr, nullptr, napi_default, nullptr},
485e41f4b71Sopenharmony_ci        {"store", nullptr, Object::Store, nullptr, nullptr, nullptr, napi_default, nullptr},
486e41f4b71Sopenharmony_ci        {"erase", nullptr, Object::Erase, nullptr, nullptr, nullptr, napi_default, nullptr},
487e41f4b71Sopenharmony_ci        {"clear", nullptr, Object::Clear, nullptr, nullptr, nullptr, napi_default, nullptr}};
488e41f4b71Sopenharmony_ci    napi_define_properties(env, object, sizeof(desc) / sizeof(desc[0]), desc);
489e41f4b71Sopenharmony_ci    // Bind the ArkTS object named object to the lifecycle of the native object named value.
490e41f4b71Sopenharmony_ci    napi_wrap(env, object, value, FinializeCallback, nullptr, nullptr);
491e41f4b71Sopenharmony_ci    // Enable the ArkTS object to carry native information.
492e41f4b71Sopenharmony_ci    napi_coerce_to_native_binding_object(env, object, DetachCallback, AttachCallback, value, hint);
493e41f4b71Sopenharmony_ci    return object;
494e41f4b71Sopenharmony_ci}
495e41f4b71Sopenharmony_ci
496e41f4b71Sopenharmony_ciEXTERN_C_START
497e41f4b71Sopenharmony_cistatic napi_value Init(napi_env env, napi_value exports)
498e41f4b71Sopenharmony_ci{
499e41f4b71Sopenharmony_ci    napi_property_descriptor desc[] = {
500e41f4b71Sopenharmony_ci        {"getAddress", nullptr, Object::GetAddress, nullptr, nullptr, nullptr, napi_default, nullptr},
501e41f4b71Sopenharmony_ci        {"getSetSize", nullptr, Object::GetSetSize, nullptr, nullptr, nullptr, napi_default, nullptr},
502e41f4b71Sopenharmony_ci        {"store", nullptr, Object::Store, nullptr, nullptr, nullptr, napi_default, nullptr},
503e41f4b71Sopenharmony_ci        {"erase", nullptr, Object::Erase, nullptr, nullptr, nullptr, napi_default, nullptr},
504e41f4b71Sopenharmony_ci        {"clear", nullptr, Object::Clear, nullptr, nullptr, nullptr, napi_default, nullptr}};
505e41f4b71Sopenharmony_ci    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
506e41f4b71Sopenharmony_ci    auto object = Object::GetInstance();
507e41f4b71Sopenharmony_ci    napi_wrap(env, exports, reinterpret_cast<void*>(object), FinializeCallback, nullptr, nullptr);
508e41f4b71Sopenharmony_ci    napi_coerce_to_native_binding_object(env, exports, DetachCallback, AttachCallback, reinterpret_cast<void*>(object),
509e41f4b71Sopenharmony_ci                                         nullptr);
510e41f4b71Sopenharmony_ci    return exports;
511e41f4b71Sopenharmony_ci}
512e41f4b71Sopenharmony_ciEXTERN_C_END
513e41f4b71Sopenharmony_ci
514e41f4b71Sopenharmony_cistatic napi_module demoModule = {
515e41f4b71Sopenharmony_ci    .nm_version = 1,
516e41f4b71Sopenharmony_ci    .nm_flags = 0,
517e41f4b71Sopenharmony_ci    .nm_filename = nullptr,
518e41f4b71Sopenharmony_ci    .nm_register_func = Init,
519e41f4b71Sopenharmony_ci    .nm_modname = "entry",
520e41f4b71Sopenharmony_ci    .nm_priv = ((void*)0),
521e41f4b71Sopenharmony_ci    .reserved = { 0 },
522e41f4b71Sopenharmony_ci};
523e41f4b71Sopenharmony_ci
524e41f4b71Sopenharmony_ciextern "C" __attribute__((constructor)) void RegisterEntryModule(void)
525e41f4b71Sopenharmony_ci{
526e41f4b71Sopenharmony_ci    napi_module_register(&demoModule);
527e41f4b71Sopenharmony_ci}
528e41f4b71Sopenharmony_ci```
529e41f4b71Sopenharmony_ci
530e41f4b71Sopenharmony_ciAPI declaration:
531e41f4b71Sopenharmony_ci
532e41f4b71Sopenharmony_ci```ts
533e41f4b71Sopenharmony_ci// index.d.ts
534e41f4b71Sopenharmony_ciexport const getAddress: () => number;
535e41f4b71Sopenharmony_ciexport const getSetSize: () => number;
536e41f4b71Sopenharmony_ciexport const store: (a: number) => void;
537e41f4b71Sopenharmony_ciexport const erase: (a: number) => void;
538e41f4b71Sopenharmony_ciexport const clear: () => void;
539e41f4b71Sopenharmony_ci```
540e41f4b71Sopenharmony_ci
541e41f4b71Sopenharmony_ciArkTS code:
542e41f4b71Sopenharmony_ci
543e41f4b71Sopenharmony_ci```ts
544e41f4b71Sopenharmony_ci// index.ets
545e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so';
546e41f4b71Sopenharmony_ciimport taskpool from '@ohos.taskpool';
547e41f4b71Sopenharmony_ci
548e41f4b71Sopenharmony_ci@Concurrent
549e41f4b71Sopenharmony_cifunction getAddress() {
550e41f4b71Sopenharmony_ci  let address: number = testNapi.getAddress();
551e41f4b71Sopenharmony_ci  console.info("taskpool:: address is " + address);
552e41f4b71Sopenharmony_ci}
553e41f4b71Sopenharmony_ci
554e41f4b71Sopenharmony_ci@Concurrent
555e41f4b71Sopenharmony_cifunction store(a:number, b:number, c:number) {
556e41f4b71Sopenharmony_ci  let size:number = testNapi.getSetSize();
557e41f4b71Sopenharmony_ci  console.info("set size is " + size + " before store");
558e41f4b71Sopenharmony_ci  testNapi.store(a);
559e41f4b71Sopenharmony_ci  testNapi.store(b);
560e41f4b71Sopenharmony_ci  testNapi.store(c);
561e41f4b71Sopenharmony_ci  size = testNapi.getSetSize();
562e41f4b71Sopenharmony_ci  console.info("set size is " + size + " after store");
563e41f4b71Sopenharmony_ci}
564e41f4b71Sopenharmony_ci
565e41f4b71Sopenharmony_ci@Concurrent
566e41f4b71Sopenharmony_cifunction erase(a:number) {
567e41f4b71Sopenharmony_ci  let size:number = testNapi.getSetSize();
568e41f4b71Sopenharmony_ci  console.info("set size is " + size + " before erase");
569e41f4b71Sopenharmony_ci  testNapi.erase(a);
570e41f4b71Sopenharmony_ci  size = testNapi.getSetSize();
571e41f4b71Sopenharmony_ci  console.info("set size is " + size + " after erase");
572e41f4b71Sopenharmony_ci}
573e41f4b71Sopenharmony_ci
574e41f4b71Sopenharmony_ci@Concurrent
575e41f4b71Sopenharmony_cifunction clear() {
576e41f4b71Sopenharmony_ci  let size:number = testNapi.getSetSize();
577e41f4b71Sopenharmony_ci  console.info("set size is " + size + " before clear");
578e41f4b71Sopenharmony_ci  testNapi.clear();
579e41f4b71Sopenharmony_ci  size = testNapi.getSetSize();
580e41f4b71Sopenharmony_ci  console.info("set size is " + size + " after clear");
581e41f4b71Sopenharmony_ci}
582e41f4b71Sopenharmony_ci
583e41f4b71Sopenharmony_cilet address:number = testNapi.getAddress();
584e41f4b71Sopenharmony_ciconsole.info("host thread address is " + address);
585e41f4b71Sopenharmony_ci
586e41f4b71Sopenharmony_cilet task1 = new taskpool.Task(getAddress);
587e41f4b71Sopenharmony_ciawait taskpool.execute(task1);
588e41f4b71Sopenharmony_ci
589e41f4b71Sopenharmony_cilet task2 = new taskpool.Task(store, 1, 2, 3);
590e41f4b71Sopenharmony_ciawait taskpool.execute(task2);
591e41f4b71Sopenharmony_ci
592e41f4b71Sopenharmony_cilet task3 = new taskpool.Task(store, 4, 5, 6);
593e41f4b71Sopenharmony_ciawait taskpool.execute(task3);
594e41f4b71Sopenharmony_ci
595e41f4b71Sopenharmony_cilet task4 = new taskpool.Task(erase, 3);
596e41f4b71Sopenharmony_ciawait taskpool.execute(task4);
597e41f4b71Sopenharmony_ci
598e41f4b71Sopenharmony_cilet task5 = new taskpool.Task(erase, 5);
599e41f4b71Sopenharmony_ciawait taskpool.execute(task5);
600e41f4b71Sopenharmony_ci
601e41f4b71Sopenharmony_cilet task6 = new taskpool.Task(clear);
602e41f4b71Sopenharmony_ciawait taskpool.execute(task6);
603e41f4b71Sopenharmony_ci```
604e41f4b71Sopenharmony_ci
605e41f4b71Sopenharmony_ci**NOTE**
606e41f4b71Sopenharmony_ci
607e41f4b71Sopenharmony_ciCall **napi_coerce_to_native_binding_object** to add the **detach()** and **attach()** callbacks and native object information to ArkTs object A, and then pass object A across threads. Object A needs to be serialized and deserialized when passed cross threads. In thread 1, "data" is obtained after object A is serialized, and the **detach()** callback is invoked in the serialization process. Then, "data" is passed to thread 2 and deserialized in thread 2. The **attach()** callback is invoked to obtain the ArkTS object A'.
608e41f4b71Sopenharmony_ci![napi_coerce_to_native_binding_object](figures/napi_coerce_to_native_binding_object.png)
609e41f4b71Sopenharmony_ci
610e41f4b71Sopenharmony_ci## Event Loop
611e41f4b71Sopenharmony_ci
612e41f4b71Sopenharmony_ci### Available APIs
613e41f4b71Sopenharmony_ci
614e41f4b71Sopenharmony_ci| API| Description|
615e41f4b71Sopenharmony_ci| -------- | -------- |
616e41f4b71Sopenharmony_ci| napi_run_event_loop | Runs an underlying event loop.|
617e41f4b71Sopenharmony_ci| napi_stop_event_loop | Stops an underlying event loop.|
618e41f4b71Sopenharmony_ci
619e41f4b71Sopenharmony_ci### Example
620e41f4b71Sopenharmony_ci
621e41f4b71Sopenharmony_ci#### napi_run_event_loop, napi_stop_event_loop
622e41f4b71Sopenharmony_ci
623e41f4b71Sopenharmony_ciSee [Running or Stopping an Event Loop in an Asynchronous Thread Using Node-API Extensions](use-napi-event-loop.md)
624e41f4b71Sopenharmony_ci
625e41f4b71Sopenharmony_ci## ArkTS Runtime Environment
626e41f4b71Sopenharmony_ci
627e41f4b71Sopenharmony_ci### Available APIs
628e41f4b71Sopenharmony_ci
629e41f4b71Sopenharmony_ci| API| Description|
630e41f4b71Sopenharmony_ci| -------- | -------- |
631e41f4b71Sopenharmony_ci| napi_create_ark_runtime | Creates an ArkTS runtime environment.|
632e41f4b71Sopenharmony_ci| napi_destroy_ark_runtime | Destroys the ArkTS runtime environment.|
633e41f4b71Sopenharmony_ci
634e41f4b71Sopenharmony_ci### Example
635e41f4b71Sopenharmony_ci
636e41f4b71Sopenharmony_ci#### napi_create_ark_runtime, napi_destroy_ark_runtime
637e41f4b71Sopenharmony_ci
638e41f4b71Sopenharmony_ciSee [Creating an ArkTs Runtime Environment Using Node-API](use-napi-ark-runtime.md).
639e41f4b71Sopenharmony_ci
640e41f4b71Sopenharmony_ci## Serialization and Deserialization
641e41f4b71Sopenharmony_ci
642e41f4b71Sopenharmony_ci### Available APIs
643e41f4b71Sopenharmony_ci
644e41f4b71Sopenharmony_ci| API| Description|
645e41f4b71Sopenharmony_ci| -------- | -------- |
646e41f4b71Sopenharmony_ci| napi_serialize | Converts an ArkTS object into native data. <br>The first parameter **env** indicates the ArkTS environment where the API is executed. The second parameter **object** indicates the ArkTS object to be serialized. The third parameter **transfer_list** indicates an array that holds the **arrayBuffer** to be passed. This parameter can be set to **undefined** if there is no data to be passed. The fourth parameter **clone_list** indicates an array that holds the sendable object to be cloned. This parameter can be set to **undefined** if there is no data to be cloned. The fifth parameter **result** indicates the serialized data obtained.|
647e41f4b71Sopenharmony_ci| napi_deserialize | Converts native data into an ArkTS object. The first parameter **env** indicates the ArkTS environment where the API is executed. The second parameter **buffer** indicates the data to be deserialized. The third parameter **object** indicates the deserialized data obtained.|
648e41f4b71Sopenharmony_ci| napi_delete_serialization_data | Deletes serialized data.|
649e41f4b71Sopenharmony_ci
650e41f4b71Sopenharmony_ci### Example
651e41f4b71Sopenharmony_ci
652e41f4b71Sopenharmony_ci#### napi_serialize, napi_deserialize, napi_delete_serialization_data
653e41f4b71Sopenharmony_ci
654e41f4b71Sopenharmony_ciUse **napi_serialize** to convert an ArkTS object into native data; use **napi_deserialize** to convert native data into an ArkTS object; use napi_delete_serialization_data to delete serialized data.
655e41f4b71Sopenharmony_ci
656e41f4b71Sopenharmony_ciCPP code:
657e41f4b71Sopenharmony_ci
658e41f4b71Sopenharmony_ci```cpp
659e41f4b71Sopenharmony_ci#include "napi/native_api.h"
660e41f4b71Sopenharmony_ci
661e41f4b71Sopenharmony_cistatic napi_value AboutSerialize(napi_env env, napi_callback_info info)
662e41f4b71Sopenharmony_ci{
663e41f4b71Sopenharmony_ci    // Obtain an ArkTS object as a parameter.
664e41f4b71Sopenharmony_ci    size_t argc = 1;
665e41f4b71Sopenharmony_ci    napi_value args[1] = {nullptr};
666e41f4b71Sopenharmony_ci    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
667e41f4b71Sopenharmony_ci    napi_value undefined = nullptr;
668e41f4b71Sopenharmony_ci    // Construct the parameters required by the napi_serialize method.
669e41f4b71Sopenharmony_ci    napi_get_undefined(env, &undefined);
670e41f4b71Sopenharmony_ci    void *data = nullptr;
671e41f4b71Sopenharmony_ci    // Call napi_serialize to convert the ArkTS object into native data.
672e41f4b71Sopenharmony_ci    napi_status status = napi_serialize(env, args[0], undefined, undefined, &data);
673e41f4b71Sopenharmony_ci    if (status != napi_ok ||data == nullptr) {
674e41f4b71Sopenharmony_ci        napi_throw_error(env, nullptr, "Node-API napi_serialize fail");
675e41f4b71Sopenharmony_ci        return nullptr;
676e41f4b71Sopenharmony_ci    }
677e41f4b71Sopenharmony_ci    // Construct data of the napi_value type to hold the ArkTS object converted from the native data.
678e41f4b71Sopenharmony_ci    napi_value result = nullptr;
679e41f4b71Sopenharmony_ci    napi_deserialize(env, data, &result);
680e41f4b71Sopenharmony_ci    napi_value number = nullptr;
681e41f4b71Sopenharmony_ci    // Obtain the value of the numKey property in the ArkTS object converted from native data.
682e41f4b71Sopenharmony_ci    napi_get_named_property(env, result, "numKey", &number);
683e41f4b71Sopenharmony_ci    // Check whether the obtained property value is of the number type.
684e41f4b71Sopenharmony_ci    napi_valuetype valuetype;
685e41f4b71Sopenharmony_ci    napi_typeof(env, number, &valuetype);
686e41f4b71Sopenharmony_ci    if (valuetype != napi_number) {
687e41f4b71Sopenharmony_ci        napi_throw_error(env, nullptr, "Node-API Wrong type of argment. Expects a number.");
688e41f4b71Sopenharmony_ci        return nullptr;
689e41f4b71Sopenharmony_ci    }
690e41f4b71Sopenharmony_ci    // Call napi_delete_serialization_data to delete the serialized data.
691e41f4b71Sopenharmony_ci    napi_delete_serialization_data(env, data);
692e41f4b71Sopenharmony_ci    // Return the obtained property value.
693e41f4b71Sopenharmony_ci    return number;
694e41f4b71Sopenharmony_ci}
695e41f4b71Sopenharmony_ci```
696e41f4b71Sopenharmony_ci
697e41f4b71Sopenharmony_ciAPI declaration:
698e41f4b71Sopenharmony_ci
699e41f4b71Sopenharmony_ci```ts
700e41f4b71Sopenharmony_ci// index.d.ts
701e41f4b71Sopenharmony_ciexport const aboutSerialize: (obj: Object) => number;
702e41f4b71Sopenharmony_ci```
703e41f4b71Sopenharmony_ci
704e41f4b71Sopenharmony_ciArkTS code:
705e41f4b71Sopenharmony_ci
706e41f4b71Sopenharmony_ci```ts
707e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
708e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
709e41f4b71Sopenharmony_ciclass Obj {
710e41f4b71Sopenharmony_ci  numKey:number = 0;
711e41f4b71Sopenharmony_ci}
712e41f4b71Sopenharmony_cilet obj: Obj = { numKey: 500 };
713e41f4b71Sopenharmony_cihilog.info(0x0000, 'testTag', ' Node-API aboutSerialize: %{public}d', testNapi.aboutSerialize(obj));
714e41f4b71Sopenharmony_ci```
715e41f4b71Sopenharmony_ci
716e41f4b71Sopenharmony_ci## Passing a Task from an Asynchronous Thread to an ArkTS Thread
717e41f4b71Sopenharmony_ci
718e41f4b71Sopenharmony_ci### Available APIs
719e41f4b71Sopenharmony_ci
720e41f4b71Sopenharmony_ci| API| Description|
721e41f4b71Sopenharmony_ci| -------- | -------- |
722e41f4b71Sopenharmony_ci| napi_call_threadsafe_function_with_priority | Calls a task with the specified priority and enqueuing mode into the ArkTS main thread.|
723e41f4b71Sopenharmony_ci
724e41f4b71Sopenharmony_ci### Example
725e41f4b71Sopenharmony_ci
726e41f4b71Sopenharmony_ci#### napi_call_threadsafe_function_with_priority
727e41f4b71Sopenharmony_ci
728e41f4b71Sopenharmony_ciSee [Passing a Task with the Specified Priority to an ArkTS Thread from an Asynchronous Thread Using Node-API](use-call-threadsafe-function-with-priority.md).
729e41f4b71Sopenharmony_ci
730e41f4b71Sopenharmony_ci## Sendable-related Operations
731e41f4b71Sopenharmony_ci
732e41f4b71Sopenharmony_ci### Available APIs
733e41f4b71Sopenharmony_ci
734e41f4b71Sopenharmony_ci| API                      | Description                              |
735e41f4b71Sopenharmony_ci| -------------------------- | ---------------------------------- |
736e41f4b71Sopenharmony_ci| napi_is_sendable           | Checks whether an ArkTS value is sendable.|
737e41f4b71Sopenharmony_ci| napi_define_sendable_class | Creates a sendable class.              |
738e41f4b71Sopenharmony_ci| napi_create_sendable_object_with_properties | Creates a sendable object with the given **napi_property_descriptor**.|
739e41f4b71Sopenharmony_ci| napi_create_sendable_array | Creates a sendable array.|
740e41f4b71Sopenharmony_ci| napi_create_sendable_array_with_length | Creates a sendable array of the specified length.|
741e41f4b71Sopenharmony_ci| napi_create_sendable_arraybuffer | Creates a sendable **ArrayBuffer**.|
742e41f4b71Sopenharmony_ci| napi_create_sendable_typedarray | Creates a sendable **TypedArray**.|
743e41f4b71Sopenharmony_ci| napi_wrap_sendable | Wraps a native instance into an ArkTS object.|
744e41f4b71Sopenharmony_ci| napi_wrap_sendable_with_size | Wraps a native instance of the specified size into an ArkTS object.|
745e41f4b71Sopenharmony_ci| napi_unwrap_sendable | Unwraps the native instance from an ArkTS object.|
746e41f4b71Sopenharmony_ci| napi_remove_wrap_sendable | Removes the native instance from an ArkTS object.|
747e41f4b71Sopenharmony_ci
748e41f4b71Sopenharmony_ci### Example
749e41f4b71Sopenharmony_ci
750e41f4b71Sopenharmony_ci#### napi_is_sendable
751e41f4b71Sopenharmony_ci
752e41f4b71Sopenharmony_ciUse **napi_is_sendable** to check whether an ArkTS value is sendable.
753e41f4b71Sopenharmony_ci
754e41f4b71Sopenharmony_ciCPP code:
755e41f4b71Sopenharmony_ci
756e41f4b71Sopenharmony_ci```cpp
757e41f4b71Sopenharmony_ci#include "napi/native_api.h"
758e41f4b71Sopenharmony_ci
759e41f4b71Sopenharmony_cistatic napi_value IsSendable(napi_env env, napi_callback_info info) {
760e41f4b71Sopenharmony_ci    size_t argc = 1;
761e41f4b71Sopenharmony_ci    napi_value args[1] = {nullptr};
762e41f4b71Sopenharmony_ci    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
763e41f4b71Sopenharmony_ci    bool isSendable = false;
764e41f4b71Sopenharmony_ci    napi_is_sendable(env, args[0], &isSendable);
765e41f4b71Sopenharmony_ci    napi_value result;
766e41f4b71Sopenharmony_ci    napi_get_boolean(env, isSendable, &result);
767e41f4b71Sopenharmony_ci    return result;
768e41f4b71Sopenharmony_ci}
769e41f4b71Sopenharmony_ci```
770e41f4b71Sopenharmony_ci
771e41f4b71Sopenharmony_ciAPI declaration:
772e41f4b71Sopenharmony_ci
773e41f4b71Sopenharmony_ci```ts
774e41f4b71Sopenharmony_ci// index.d.ts
775e41f4b71Sopenharmony_ciexport const isSendable: <T>(a: T) => boolean;
776e41f4b71Sopenharmony_ci```
777e41f4b71Sopenharmony_ci
778e41f4b71Sopenharmony_ciArkTS code:
779e41f4b71Sopenharmony_ci
780e41f4b71Sopenharmony_ci```ts
781e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
782e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
783e41f4b71Sopenharmony_ci
784e41f4b71Sopenharmony_cilet value = testNapi.isSendable('createObject');
785e41f4b71Sopenharmony_cihilog.info(0x0000, 'testTag', 'Node-API napi_is_sendable: %{public}s', JSON.stringify(value));
786e41f4b71Sopenharmony_ci```
787e41f4b71Sopenharmony_ci
788e41f4b71Sopenharmony_ci#### napi_define_sendable_class
789e41f4b71Sopenharmony_ci
790e41f4b71Sopenharmony_ciUse **napi_define_sendable_class** to create a sendable class.
791e41f4b71Sopenharmony_ci
792e41f4b71Sopenharmony_ciCPP code:
793e41f4b71Sopenharmony_ci
794e41f4b71Sopenharmony_ci```cpp
795e41f4b71Sopenharmony_ci#include "napi/native_api.h"
796e41f4b71Sopenharmony_ci
797e41f4b71Sopenharmony_cistatic napi_value func(napi_env env, napi_callback_info info) {
798e41f4b71Sopenharmony_ci    napi_value val;
799e41f4b71Sopenharmony_ci    napi_create_string_utf8(env, "func result", NAPI_AUTO_LENGTH, &val);
800e41f4b71Sopenharmony_ci    return val;
801e41f4b71Sopenharmony_ci}
802e41f4b71Sopenharmony_ci
803e41f4b71Sopenharmony_cistatic napi_value DefineSendableClass(napi_env env) {
804e41f4b71Sopenharmony_ci    napi_value str;
805e41f4b71Sopenharmony_ci    napi_create_string_utf8(env, "str", NAPI_AUTO_LENGTH, &str);
806e41f4b71Sopenharmony_ci
807e41f4b71Sopenharmony_ci    napi_property_descriptor props[] = {
808e41f4b71Sopenharmony_ci        {"staticStr", nullptr, nullptr, nullptr, nullptr, str,
809e41f4b71Sopenharmony_ci         static_cast<napi_property_attributes>(napi_static | napi_writable), nullptr},
810e41f4b71Sopenharmony_ci        {"staticFunc", nullptr, func, nullptr, nullptr, nullptr, napi_static, nullptr},
811e41f4b71Sopenharmony_ci        {"str", nullptr, nullptr, nullptr, nullptr, str, static_cast<napi_property_attributes>(1 << 9 | napi_writable),
812e41f4b71Sopenharmony_ci         nullptr},
813e41f4b71Sopenharmony_ci        {"func", nullptr, nullptr, nullptr, nullptr, nullptr,
814e41f4b71Sopenharmony_ci         static_cast<napi_property_attributes>(1 << 11 | napi_writable), nullptr},
815e41f4b71Sopenharmony_ci    };
816e41f4b71Sopenharmony_ci
817e41f4b71Sopenharmony_ci    napi_value sendableClass = nullptr;
818e41f4b71Sopenharmony_ci    napi_define_sendable_class(
819e41f4b71Sopenharmony_ci        env, "SendableClass", NAPI_AUTO_LENGTH,
820e41f4b71Sopenharmony_ci        [](napi_env env, napi_callback_info info) -> napi_value {
821e41f4b71Sopenharmony_ci            napi_value thisVar = nullptr;
822e41f4b71Sopenharmony_ci            napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
823e41f4b71Sopenharmony_ci            napi_value str;
824e41f4b71Sopenharmony_ci            napi_create_string_utf8(env, "instance str", NAPI_AUTO_LENGTH, &str);
825e41f4b71Sopenharmony_ci            napi_property_descriptor props[] = {
826e41f4b71Sopenharmony_ci                {"str", nullptr, nullptr, nullptr, nullptr, str, napi_default, nullptr},
827e41f4b71Sopenharmony_ci                {"func", nullptr, func, nullptr, nullptr, nullptr, napi_default, nullptr},
828e41f4b71Sopenharmony_ci            };
829e41f4b71Sopenharmony_ci            napi_define_properties(env, thisVar, sizeof(props) / sizeof(props[0]), props);
830e41f4b71Sopenharmony_ci            return thisVar;
831e41f4b71Sopenharmony_ci        },
832e41f4b71Sopenharmony_ci        nullptr, sizeof(props) / sizeof(props[0]), props, nullptr, &sendableClass);
833e41f4b71Sopenharmony_ci
834e41f4b71Sopenharmony_ci    return sendableClass;
835e41f4b71Sopenharmony_ci}
836e41f4b71Sopenharmony_ci```
837e41f4b71Sopenharmony_ci
838e41f4b71Sopenharmony_ciAPI declaration:
839e41f4b71Sopenharmony_ci
840e41f4b71Sopenharmony_ci```ts
841e41f4b71Sopenharmony_ci// index.d.ts
842e41f4b71Sopenharmony_ci@Sendable
843e41f4b71Sopenharmony_ciexport class SendableClass {
844e41f4b71Sopenharmony_ci  static staticStr: string;
845e41f4b71Sopenharmony_ci  static staticFunc(): string;
846e41f4b71Sopenharmony_ci  str: string;
847e41f4b71Sopenharmony_ci  func(): string;
848e41f4b71Sopenharmony_ci}
849e41f4b71Sopenharmony_ci```
850e41f4b71Sopenharmony_ci
851e41f4b71Sopenharmony_ciArkTS code:
852e41f4b71Sopenharmony_ci
853e41f4b71Sopenharmony_ci```ts
854e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
855e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
856e41f4b71Sopenharmony_ci
857e41f4b71Sopenharmony_cilet value = new testNapi.SendableClass();
858e41f4b71Sopenharmony_cihilog.info(0x0000, 'testTag', 'Node-API napi_define_sendable_class: %{public}s', value.str);
859e41f4b71Sopenharmony_ci```
860e41f4b71Sopenharmony_ci
861e41f4b71Sopenharmony_ci#### napi_create_sendable_object_with_properties
862e41f4b71Sopenharmony_ci
863e41f4b71Sopenharmony_ciUse **napi_create_sendable_object_with_properties** to create a sendable object with the given **napi_property_descriptor**.
864e41f4b71Sopenharmony_ci
865e41f4b71Sopenharmony_ciCPP code:
866e41f4b71Sopenharmony_ci
867e41f4b71Sopenharmony_ci```cpp
868e41f4b71Sopenharmony_ci#include "napi/native_api.h"
869e41f4b71Sopenharmony_ci
870e41f4b71Sopenharmony_cistatic napi_value GetSendableObject(napi_env env, napi_callback_info info) {
871e41f4b71Sopenharmony_ci    napi_value val_true;
872e41f4b71Sopenharmony_ci    napi_get_boolean(env, true, &val_true);
873e41f4b71Sopenharmony_ci    napi_property_descriptor desc1[] = {
874e41f4b71Sopenharmony_ci        {"x", nullptr, nullptr, nullptr, nullptr, val_true, napi_default_jsproperty, nullptr},
875e41f4b71Sopenharmony_ci    };
876e41f4b71Sopenharmony_ci    napi_value obj;
877e41f4b71Sopenharmony_ci    napi_create_sendable_object_with_properties(env, 1, desc1, &obj);
878e41f4b71Sopenharmony_ci    return obj;
879e41f4b71Sopenharmony_ci}
880e41f4b71Sopenharmony_ci```
881e41f4b71Sopenharmony_ci
882e41f4b71Sopenharmony_ciAPI declaration:
883e41f4b71Sopenharmony_ci
884e41f4b71Sopenharmony_ci```ts
885e41f4b71Sopenharmony_ci// index.d.ts
886e41f4b71Sopenharmony_ciexport const getSendableObject: () => { x: true };
887e41f4b71Sopenharmony_ci```
888e41f4b71Sopenharmony_ci
889e41f4b71Sopenharmony_ciArkTS code:
890e41f4b71Sopenharmony_ci
891e41f4b71Sopenharmony_ci```ts
892e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
893e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
894e41f4b71Sopenharmony_ci
895e41f4b71Sopenharmony_cilet value = testNapi.getSendableObject();
896e41f4b71Sopenharmony_cihilog.info(0x0000, 'testTag', 'Node-API napi_create_sendable_object_with_properties: %{public}s', JSON.stringify(value));
897e41f4b71Sopenharmony_ci```
898e41f4b71Sopenharmony_ci
899e41f4b71Sopenharmony_ci#### napi_create_sendable_array
900e41f4b71Sopenharmony_ci
901e41f4b71Sopenharmony_ciUse **napi_create_sendable_array** to create a sendable array.
902e41f4b71Sopenharmony_ci
903e41f4b71Sopenharmony_ciCPP code:
904e41f4b71Sopenharmony_ci
905e41f4b71Sopenharmony_ci```cpp
906e41f4b71Sopenharmony_ci#include "napi/native_api.h"
907e41f4b71Sopenharmony_ci
908e41f4b71Sopenharmony_cistatic napi_value GetSendableArray(napi_env env, napi_callback_info info) {
909e41f4b71Sopenharmony_ci    napi_value result = nullptr;
910e41f4b71Sopenharmony_ci    napi_create_sendable_array(env, &result);
911e41f4b71Sopenharmony_ci    return result;
912e41f4b71Sopenharmony_ci}
913e41f4b71Sopenharmony_ci```
914e41f4b71Sopenharmony_ci
915e41f4b71Sopenharmony_ciAPI declaration:
916e41f4b71Sopenharmony_ci
917e41f4b71Sopenharmony_ci```ts
918e41f4b71Sopenharmony_ci// index.d.ts
919e41f4b71Sopenharmony_ciexport const getSendableArray: () => [];
920e41f4b71Sopenharmony_ci```
921e41f4b71Sopenharmony_ci
922e41f4b71Sopenharmony_ciArkTS code:
923e41f4b71Sopenharmony_ci
924e41f4b71Sopenharmony_ci```ts
925e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
926e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
927e41f4b71Sopenharmony_ci
928e41f4b71Sopenharmony_cilet value = testNapi.getSendableArray();
929e41f4b71Sopenharmony_cihilog.info(0x0000, 'testTag', 'Node-API napi_create_sendable_array: %{public}s', JSON.stringify(value));
930e41f4b71Sopenharmony_ci```
931e41f4b71Sopenharmony_ci
932e41f4b71Sopenharmony_ci#### napi_create_sendable_array_with_length
933e41f4b71Sopenharmony_ci
934e41f4b71Sopenharmony_ciUse **napi_create_sendable_array_with_length** to create a sendable array of the specified length.
935e41f4b71Sopenharmony_ci
936e41f4b71Sopenharmony_ciCPP code:
937e41f4b71Sopenharmony_ci
938e41f4b71Sopenharmony_ci```cpp
939e41f4b71Sopenharmony_cistatic napi_value GetSendableArrayWithLength(napi_env env, napi_callback_info info) {
940e41f4b71Sopenharmony_ci    napi_value result = nullptr;
941e41f4b71Sopenharmony_ci    napi_create_sendable_array_with_length(env, 1, &result);
942e41f4b71Sopenharmony_ci    return result;
943e41f4b71Sopenharmony_ci}
944e41f4b71Sopenharmony_ci```
945e41f4b71Sopenharmony_ci
946e41f4b71Sopenharmony_ciAPI declaration:
947e41f4b71Sopenharmony_ci
948e41f4b71Sopenharmony_ci```ts
949e41f4b71Sopenharmony_ci// index.d.ts
950e41f4b71Sopenharmony_ciexport const getSendableArrayWithLength: () => [];
951e41f4b71Sopenharmony_ci```
952e41f4b71Sopenharmony_ci
953e41f4b71Sopenharmony_ciArkTS code:
954e41f4b71Sopenharmony_ci
955e41f4b71Sopenharmony_ci```ts
956e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
957e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
958e41f4b71Sopenharmony_ci
959e41f4b71Sopenharmony_cilet value = testNapi.getSendableArrayWithLength();
960e41f4b71Sopenharmony_cihilog.info(0x0000, 'testTag', 'Node-API napi_create_sendable_array_with_length: %{public}s', JSON.stringify(value.length));
961e41f4b71Sopenharmony_ci```
962e41f4b71Sopenharmony_ci
963e41f4b71Sopenharmony_ci#### napi_create_sendable_arraybuffer
964e41f4b71Sopenharmony_ci
965e41f4b71Sopenharmony_ciUse **napi_create_sendable_arraybuffer** to create a sendable **ArrayBuffer**.
966e41f4b71Sopenharmony_ci
967e41f4b71Sopenharmony_ciCPP code:
968e41f4b71Sopenharmony_ci
969e41f4b71Sopenharmony_ci```cpp
970e41f4b71Sopenharmony_ci#include "napi/native_api.h"
971e41f4b71Sopenharmony_ci#include "hilog/log.h"
972e41f4b71Sopenharmony_ci
973e41f4b71Sopenharmony_cistatic napi_value GetSendableArrayBuffer(napi_env env, napi_callback_info info) {
974e41f4b71Sopenharmony_ci    static size_t LENGTH = 1024;
975e41f4b71Sopenharmony_ci    void *data;
976e41f4b71Sopenharmony_ci    napi_value result = nullptr;
977e41f4b71Sopenharmony_ci    napi_create_sendable_arraybuffer(env, LENGTH, &data, &result);
978e41f4b71Sopenharmony_ci    bool isArrayBuffer = false;
979e41f4b71Sopenharmony_ci    napi_is_arraybuffer(env, result, &isArrayBuffer);
980e41f4b71Sopenharmony_ci    OH_LOG_INFO(LOG_APP, "isArrayBuffer: %{public}d", isArrayBuffer);
981e41f4b71Sopenharmony_ci    return result;
982e41f4b71Sopenharmony_ci}
983e41f4b71Sopenharmony_ci```
984e41f4b71Sopenharmony_ci
985e41f4b71Sopenharmony_ciAPI declaration:
986e41f4b71Sopenharmony_ci
987e41f4b71Sopenharmony_ci```ts
988e41f4b71Sopenharmony_ci// index.d.ts
989e41f4b71Sopenharmony_ciexport const getSendableArrayBuffer: () => void;
990e41f4b71Sopenharmony_ci```
991e41f4b71Sopenharmony_ci
992e41f4b71Sopenharmony_ciArkTS code:
993e41f4b71Sopenharmony_ci
994e41f4b71Sopenharmony_ci```ts
995e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
996e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
997e41f4b71Sopenharmony_ci
998e41f4b71Sopenharmony_citestNapi.getSendableArrayBuffer();
999e41f4b71Sopenharmony_ci```
1000e41f4b71Sopenharmony_ci
1001e41f4b71Sopenharmony_ci#### napi_create_sendable_typedarray
1002e41f4b71Sopenharmony_ci
1003e41f4b71Sopenharmony_ciUse **napi_create_sendable_typedarray** to create a sendable **TypedArray**.
1004e41f4b71Sopenharmony_ci
1005e41f4b71Sopenharmony_ciCPP code:
1006e41f4b71Sopenharmony_ci
1007e41f4b71Sopenharmony_ci```cpp
1008e41f4b71Sopenharmony_ci#include "napi/native_api.h"
1009e41f4b71Sopenharmony_ci#include "hilog/log.h"
1010e41f4b71Sopenharmony_ci
1011e41f4b71Sopenharmony_cistatic napi_value GetSendableTypedArray(napi_env env, napi_callback_info info) {
1012e41f4b71Sopenharmony_ci    static size_t LENGTH = 1024;
1013e41f4b71Sopenharmony_ci    static size_t OFFSET = 0;
1014e41f4b71Sopenharmony_ci    void *data;
1015e41f4b71Sopenharmony_ci    napi_value arraybuffer = nullptr;
1016e41f4b71Sopenharmony_ci    napi_create_sendable_arraybuffer(env, LENGTH, &data, &arraybuffer);
1017e41f4b71Sopenharmony_ci
1018e41f4b71Sopenharmony_ci    napi_value result = nullptr;
1019e41f4b71Sopenharmony_ci    napi_create_sendable_typedarray(env, napi_uint8_array, LENGTH, arraybuffer, OFFSET, &result);
1020e41f4b71Sopenharmony_ci    bool isTypedArray = false;
1021e41f4b71Sopenharmony_ci    napi_is_typedarray(env, result, &isTypedArray);
1022e41f4b71Sopenharmony_ci    OH_LOG_INFO(LOG_APP, "isTypedArray: %{public}d", isTypedArray);
1023e41f4b71Sopenharmony_ci    return result;
1024e41f4b71Sopenharmony_ci}
1025e41f4b71Sopenharmony_ci```
1026e41f4b71Sopenharmony_ci
1027e41f4b71Sopenharmony_ciAPI declaration:
1028e41f4b71Sopenharmony_ci
1029e41f4b71Sopenharmony_ci```ts
1030e41f4b71Sopenharmony_ci// index.d.ts
1031e41f4b71Sopenharmony_ciexport const getSendableTypedArray: () => void;
1032e41f4b71Sopenharmony_ci```
1033e41f4b71Sopenharmony_ci
1034e41f4b71Sopenharmony_ciArkTS code:
1035e41f4b71Sopenharmony_ci
1036e41f4b71Sopenharmony_ci```ts
1037e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
1038e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
1039e41f4b71Sopenharmony_ci
1040e41f4b71Sopenharmony_citestNapi.getSendableTypedArray();
1041e41f4b71Sopenharmony_ci```
1042e41f4b71Sopenharmony_ci
1043e41f4b71Sopenharmony_ci#### napi_wrap_sendable
1044e41f4b71Sopenharmony_ci
1045e41f4b71Sopenharmony_ciUse **napi_wrap_sendable** to wrap a native instance into an ArkTS object.
1046e41f4b71Sopenharmony_ci
1047e41f4b71Sopenharmony_ciCPP code:
1048e41f4b71Sopenharmony_ci
1049e41f4b71Sopenharmony_ci```cpp
1050e41f4b71Sopenharmony_ci#include "napi/native_api.h"
1051e41f4b71Sopenharmony_ci
1052e41f4b71Sopenharmony_cistatic napi_value WrapSendable(napi_env env, napi_callback_info info) {
1053e41f4b71Sopenharmony_ci    napi_value val_true;
1054e41f4b71Sopenharmony_ci    napi_get_boolean(env, true, &val_true);
1055e41f4b71Sopenharmony_ci    napi_property_descriptor desc1[] = {
1056e41f4b71Sopenharmony_ci        {"x", nullptr, nullptr, nullptr, nullptr, val_true, napi_default_jsproperty, nullptr},
1057e41f4b71Sopenharmony_ci    };
1058e41f4b71Sopenharmony_ci    napi_value obj;
1059e41f4b71Sopenharmony_ci    napi_create_sendable_object_with_properties(env, 1, desc1, &obj);
1060e41f4b71Sopenharmony_ci
1061e41f4b71Sopenharmony_ci    const char* testStr = "test";
1062e41f4b71Sopenharmony_ci    napi_wrap_sendable(env, obj, (void*)testStr, [](napi_env env, void* data, void* hint) {}, nullptr);
1063e41f4b71Sopenharmony_ci    
1064e41f4b71Sopenharmony_ci    return nullptr;
1065e41f4b71Sopenharmony_ci}
1066e41f4b71Sopenharmony_ci```
1067e41f4b71Sopenharmony_ci
1068e41f4b71Sopenharmony_ciAPI declaration:
1069e41f4b71Sopenharmony_ci
1070e41f4b71Sopenharmony_ci```ts
1071e41f4b71Sopenharmony_ci// index.d.ts
1072e41f4b71Sopenharmony_ciexport const wrapSendable: () => void;
1073e41f4b71Sopenharmony_ci```
1074e41f4b71Sopenharmony_ci
1075e41f4b71Sopenharmony_ciArkTS code:
1076e41f4b71Sopenharmony_ci
1077e41f4b71Sopenharmony_ci```ts
1078e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
1079e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
1080e41f4b71Sopenharmony_ci
1081e41f4b71Sopenharmony_citestNapi.wrapSendable();
1082e41f4b71Sopenharmony_ci```
1083e41f4b71Sopenharmony_ci
1084e41f4b71Sopenharmony_ci#### napi_wrap_sendable_with_size
1085e41f4b71Sopenharmony_ci
1086e41f4b71Sopenharmony_ciUse **napi_wrap_sendable_with_size** to wrap a native instance of the specified size into an ArkTS object.
1087e41f4b71Sopenharmony_ci
1088e41f4b71Sopenharmony_ciCPP code:
1089e41f4b71Sopenharmony_ci
1090e41f4b71Sopenharmony_ci```cpp
1091e41f4b71Sopenharmony_ci#include "napi/native_api.h"
1092e41f4b71Sopenharmony_ci
1093e41f4b71Sopenharmony_cistatic napi_value WrapSendableWithSize(napi_env env, napi_callback_info info) {
1094e41f4b71Sopenharmony_ci    napi_value val_true;
1095e41f4b71Sopenharmony_ci    napi_get_boolean(env, true, &val_true);
1096e41f4b71Sopenharmony_ci    napi_property_descriptor desc1[] = {
1097e41f4b71Sopenharmony_ci        {"x", nullptr, nullptr, nullptr, nullptr, val_true, napi_default_jsproperty, nullptr},
1098e41f4b71Sopenharmony_ci    };
1099e41f4b71Sopenharmony_ci    napi_value obj;
1100e41f4b71Sopenharmony_ci    napi_create_sendable_object_with_properties(env, 1, desc1, &obj);
1101e41f4b71Sopenharmony_ci
1102e41f4b71Sopenharmony_ci    const char* testStr = "test";
1103e41f4b71Sopenharmony_ci    napi_wrap_sendable_with_size(env, obj, (void*)testStr, [](napi_env env, void* data, void* hint) {}, nullptr, 100);
1104e41f4b71Sopenharmony_ci    
1105e41f4b71Sopenharmony_ci    return nullptr;
1106e41f4b71Sopenharmony_ci}
1107e41f4b71Sopenharmony_ci```
1108e41f4b71Sopenharmony_ci
1109e41f4b71Sopenharmony_ciAPI declaration:
1110e41f4b71Sopenharmony_ci
1111e41f4b71Sopenharmony_ci```ts
1112e41f4b71Sopenharmony_ci// index.d.ts
1113e41f4b71Sopenharmony_ciexport const wrapSendableWithSize: () => void;
1114e41f4b71Sopenharmony_ci```
1115e41f4b71Sopenharmony_ci
1116e41f4b71Sopenharmony_ciArkTS code:
1117e41f4b71Sopenharmony_ci
1118e41f4b71Sopenharmony_ci```ts
1119e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
1120e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
1121e41f4b71Sopenharmony_ci
1122e41f4b71Sopenharmony_citestNapi.wrapSendableWithSize();
1123e41f4b71Sopenharmony_ci```
1124e41f4b71Sopenharmony_ci
1125e41f4b71Sopenharmony_ci#### napi_unwrap_sendable
1126e41f4b71Sopenharmony_ci
1127e41f4b71Sopenharmony_ciUse **napi_unwrap_sendable** to unwrap the native instance from an ArkTS object.
1128e41f4b71Sopenharmony_ci
1129e41f4b71Sopenharmony_ciCPP code:
1130e41f4b71Sopenharmony_ci
1131e41f4b71Sopenharmony_ci```cpp
1132e41f4b71Sopenharmony_ci#include "napi/native_api.h"
1133e41f4b71Sopenharmony_ci
1134e41f4b71Sopenharmony_cistatic napi_value UnwrapSendable(napi_env env, napi_callback_info info) {
1135e41f4b71Sopenharmony_ci    napi_value val_true;
1136e41f4b71Sopenharmony_ci    napi_get_boolean(env, true, &val_true);
1137e41f4b71Sopenharmony_ci    napi_property_descriptor desc1[] = {
1138e41f4b71Sopenharmony_ci        {"x", nullptr, nullptr, nullptr, nullptr, val_true, napi_default_jsproperty, nullptr},
1139e41f4b71Sopenharmony_ci    };
1140e41f4b71Sopenharmony_ci    napi_value obj;
1141e41f4b71Sopenharmony_ci    napi_create_sendable_object_with_properties(env, 1, desc1, &obj);
1142e41f4b71Sopenharmony_ci
1143e41f4b71Sopenharmony_ci    const char* testStr = "test";
1144e41f4b71Sopenharmony_ci    napi_wrap_sendable(env, obj, (void*)testStr, [](napi_env env, void* data, void* hint) {}, nullptr);
1145e41f4b71Sopenharmony_ci
1146e41f4b71Sopenharmony_ci    char* tmpTestStr = nullptr;
1147e41f4b71Sopenharmony_ci    napi_unwrap_sendable(env, obj, (void**)&tmpTestStr);
1148e41f4b71Sopenharmony_ci    OH_LOG_INFO(LOG_APP, "native value is %{public}s", tmpTestStr);
1149e41f4b71Sopenharmony_ci    
1150e41f4b71Sopenharmony_ci    return nullptr;
1151e41f4b71Sopenharmony_ci}
1152e41f4b71Sopenharmony_ci```
1153e41f4b71Sopenharmony_ci
1154e41f4b71Sopenharmony_ciAPI declaration:
1155e41f4b71Sopenharmony_ci
1156e41f4b71Sopenharmony_ci```ts
1157e41f4b71Sopenharmony_ci// index.d.ts
1158e41f4b71Sopenharmony_ciexport const unwrapSendable: () => void;
1159e41f4b71Sopenharmony_ci```
1160e41f4b71Sopenharmony_ci
1161e41f4b71Sopenharmony_ciArkTS code:
1162e41f4b71Sopenharmony_ci
1163e41f4b71Sopenharmony_ci```ts
1164e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
1165e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
1166e41f4b71Sopenharmony_ci
1167e41f4b71Sopenharmony_citestNapi.unwrapSendable();
1168e41f4b71Sopenharmony_ci```
1169e41f4b71Sopenharmony_ci
1170e41f4b71Sopenharmony_ci#### napi_remove_wrap_sendable
1171e41f4b71Sopenharmony_ci
1172e41f4b71Sopenharmony_ciUse **napi_remove_wrap_sendable** to remove the native instance from an ArkTS object.
1173e41f4b71Sopenharmony_ci
1174e41f4b71Sopenharmony_ciCPP code:
1175e41f4b71Sopenharmony_ci
1176e41f4b71Sopenharmony_ci```cpp
1177e41f4b71Sopenharmony_ci#include "napi/native_api.h"
1178e41f4b71Sopenharmony_ci
1179e41f4b71Sopenharmony_cistatic napi_value RemoveWrapSendable(napi_env env, napi_callback_info info) {
1180e41f4b71Sopenharmony_ci    napi_value val_true;
1181e41f4b71Sopenharmony_ci    napi_get_boolean(env, true, &val_true);
1182e41f4b71Sopenharmony_ci    napi_property_descriptor desc1[] = {
1183e41f4b71Sopenharmony_ci        {"x", nullptr, nullptr, nullptr, nullptr, val_true, napi_default_jsproperty, nullptr},
1184e41f4b71Sopenharmony_ci    };
1185e41f4b71Sopenharmony_ci    napi_value obj;
1186e41f4b71Sopenharmony_ci    napi_create_sendable_object_with_properties(env, 1, desc1, &obj);
1187e41f4b71Sopenharmony_ci
1188e41f4b71Sopenharmony_ci    const char* testStr = "test";
1189e41f4b71Sopenharmony_ci    napi_wrap_sendable(env, obj, (void*)testStr, [](napi_env env, void* data, void* hint) {}, nullptr);
1190e41f4b71Sopenharmony_ci
1191e41f4b71Sopenharmony_ci    char* tmpTestStr = nullptr;
1192e41f4b71Sopenharmony_ci    napi_remove_wrap_sendable(env, obj, (void**)&tmpTestStr);
1193e41f4b71Sopenharmony_ci    OH_LOG_INFO(LOG_APP, "native value is %{public}s", tmpTestStr);
1194e41f4b71Sopenharmony_ci    
1195e41f4b71Sopenharmony_ci    return nullptr;
1196e41f4b71Sopenharmony_ci}
1197e41f4b71Sopenharmony_ci```
1198e41f4b71Sopenharmony_ci
1199e41f4b71Sopenharmony_ciAPI declaration:
1200e41f4b71Sopenharmony_ci
1201e41f4b71Sopenharmony_ci```ts
1202e41f4b71Sopenharmony_ci// index.d.ts
1203e41f4b71Sopenharmony_ciexport const removeWrapSendable: () => void;
1204e41f4b71Sopenharmony_ci```
1205e41f4b71Sopenharmony_ci
1206e41f4b71Sopenharmony_ciArkTS code:
1207e41f4b71Sopenharmony_ci
1208e41f4b71Sopenharmony_ci```ts
1209e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog'
1210e41f4b71Sopenharmony_ciimport testNapi from 'libentry.so'
1211e41f4b71Sopenharmony_ci
1212e41f4b71Sopenharmony_citestNapi.removeWrapSendable();
1213e41f4b71Sopenharmony_ci```
1214e41f4b71Sopenharmony_ci
1215e41f4b71Sopenharmony_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"**.
1216e41f4b71Sopenharmony_ci
1217e41f4b71Sopenharmony_ci```text
1218e41f4b71Sopenharmony_ci// CMakeLists.txt
1219e41f4b71Sopenharmony_ciadd_definitions( "-DLOG_DOMAIN=0xd0d0" )
1220e41f4b71Sopenharmony_ciadd_definitions( "-DLOG_TAG=\"testTag\"" )
1221e41f4b71Sopenharmony_citarget_link_libraries(entry PUBLIC libhilog_ndk.z.so)
1222e41f4b71Sopenharmony_ci```
1223