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 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