# Working with Arrays Using JSVM-API
## Introduction
JSVM-API provides APIs for directly managing JavaScript (JS) arrays.
## Basic Concepts
JSVM-API can be used to create, access, modify, and traverse arrays. Before using JSVM-API to work with arrays, it's helpful if you understand the following concepts:
- Array creation: You can use **OH_JSVM_CreateArray** to create an array and pass it to the JS layer.
- Array-related operations: You can use the APIs provides by the JSVM module to obtain the length of a JS array, retrieve the element at the specified index, and set the element value at the specified index.
- **TypedArray**: A **TypedArray** object in JS is an array-like view of an underlying binary data buffer. It can be simply understood as an array of elements of the specified type. There is no constructor for **TypedArray** objects, but its child class constructor can be used to construct **TypedArray** data. The child classes of **TypedArray** include **Int8Array**, **Uint8Array**, **Uint8ClampedArray**, **Int16Array**, and **Int32Array**.
- **ArrayBuffer**: **ArrayBuffer** is a data struct used to represent a binary data buffer of fixed length.
- **DataView**: **DataView** is a JS view that allows a variety of number types to be read and written in an **ArrayBuffer** object.
## Available APIs
| API | Description |
| ---------------------------- | ------------------------------------------ |
|OH_JSVM_CreateArray | Creates a JS array object.|
|OH_JSVM_CreateArrayWithLength | Creates a JS array object of the specified length.|
|OH_JSVM_CreateTypedarray | Creates a JS **TypedArray** object for an **ArrayBuffer**. The **TypedArray** object provides an array-like view over an underlying data buffer, where each element has the same underlying binary scalar data type.
The parameters specified must meet the following:
(**length** x **size_of_element**) + **byte_offset** ≤ Array size (in bytes)
Otherwise, a **RangeError** exception will be thrown.
**size_of_element** specifies the size of the data type of the elements in the array. |
|OH_JSVM_CreateDataview | Creates a JS **DataView** object based on an existing **ArrayBuffer**. The **DataView** object provides an array-like view on the underlying data buffer. The **ArrayBuffer** allows elements of different sizes and types.
The sum of **byte_length** and **byte_offset** must be less than or equal to the array size (in bytes). Otherwise, a **RangeError** exception will be thrown. |
|OH_JSVM_GetArrayLength | Obtains the length of an array.|
|OH_JSVM_GetTypedarrayInfo | Obtains information about a **TypedArray** object.|
|OH_JSVM_GetDataviewInfo | Obtains information of a **DataView** object.|
|OH_JSVM_IsArray | Checks whether a JS object is an array.|
|OH_JSVM_SetElement | Sets an element at the specified index for a JS object.|
|OH_JSVM_GetElement | Obtains the element at the specified index of a JS object.|
|OH_JSVM_HasElement | Checks whether a JS object has an element at the specified index.|
|OH_JSVM_DeleteElement | Deletes the element at the specified index from a JS object.|
|OH_JSVM_IsDataview | Checks whether a JS object is a **DataView** object.|
|OH_JSVM_IsTypedarray | Checks whether a JS object is a **TypedArray** object.|
## Example
If you are just starting out with JSVM-API, see [JSVM-API Development Process](use-jsvm-process.md). The following demonstrates only the C++ code involved in array development.
### OH_JSVM_CreateArray
Use **OH_JSVM_CreateArray** to create a JS array object.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Register the CreateArray callback.
static int DIFF_VALUE_FIVE = 5;
// Define OH_JSVM_CreateArray.
static JSVM_Value CreateArray(JSVM_Env env, JSVM_CallbackInfo info)
{
// Create an empty array.
JSVM_Value array = nullptr;
JSVM_Status status = OH_JSVM_CreateArray(env, &array);
// Assign values to the created array.
for (int i = 0; i < DIFF_VALUE_FIVE; i++) {
JSVM_Value element;
OH_JSVM_CreateInt32(env, i, &element);
OH_JSVM_SetElement(env, array, i, element);
}
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM CreateArray fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM CreateArray success");
}
return array;
}
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = CreateArray},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named createArray and associate it with a callback. This allows the CreateArray callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"createArray", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
function testCreateArray() {
return createArray();
}
testCreateArray();
)JS";
```
### OH_JSVM_CreateArrayWithLength
Use **OH_JSVM_CreateArrayWithLength** to create a JS array object of the specified length.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_CreateArrayWithLength.
static JSVM_Value CreateArrayWithLength(JSVM_Env env, JSVM_CallbackInfo info)
{
size_t argc = 1;
JSVM_Value argv[1] = {nullptr};
JSVM_Value result = nullptr;
// Obtain the callback information.
OH_JSVM_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
// Obtain the array length passed.
int32_t length;
OH_JSVM_GetValueInt32(env, argv[0], &length);
// Call OH_JSVM_CreateArrayWithLength to create an array with the specified length.
JSVM_Status status = OH_JSVM_CreateArrayWithLength(env, length, &result);
if (status == JSVM_OK) {
// Set an element in the created array.
for (int32_t i = 0; i < length; i++) {
JSVM_Value value;
OH_JSVM_CreateInt32(env, i, &value);
OH_JSVM_SetElement(env, result, i, value);
}
OH_LOG_INFO(LOG_APP, "JSVM CreateArrayWithLength success");
} else {
OH_LOG_ERROR(LOG_APP, "JSVM CreateArrayWithLength fail");
}
return result;
}
// Register the CreateArrayWithLength callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = CreateArrayWithLength},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named createArrayWithLength and associate it with a callback. This allows the CreateArrayWithLength callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"createArrayWithLength", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
let num = 7;
function testCreateArrayWithLength(num){
return createArrayWithLength(num);
}
testCreateArrayWithLength(num);
)JS";
```
### OH_JSVM_CreateTypedarray
Use **OH_JSVM_CreateTypedarray** to create a JS **TypedArray** object based on an **ArrayBuffer**. The **TypedArray** object provides an array-like view over an underlying data buffer, where each element has the same underlying binary scalar data type.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_CreateTypedarray.
static int DIFF_VALUE_THREE = 3;
static JSVM_Value CreateTypedArray(JSVM_Env env, JSVM_CallbackInfo info)
{
size_t argc = 1;
JSVM_Value args[1] = {nullptr};
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
int32_t typeNum;
OH_JSVM_GetValueInt32(env, args[0], &typeNum);
JSVM_TypedarrayType arrayType;
// Set the element size.
size_t elementSize = 0;
// Convert the value to the JSVM_TypedarrayType type.
arrayType = static_cast(typeNum);
switch (typeNum) {
case JSVM_INT8_ARRAY:
case JSVM_UINT8_ARRAY:
case JSVM_UINT8_CLAMPED_ARRAY:
elementSize = sizeof(int8_t);
break;
case JSVM_INT16_ARRAY:
case JSVM_UINT16_ARRAY:
elementSize = sizeof(int16_t);
break;
case JSVM_INT32_ARRAY:
case JSVM_UINT32_ARRAY:
elementSize = sizeof(int32_t);
break;
case JSVM_FLOAT32_ARRAY:
elementSize = sizeof(float);
break;
case JSVM_FLOAT64_ARRAY:
elementSize = sizeof(double);
break;
case JSVM_BIGINT64_ARRAY:
case JSVM_BIGUINT64_ARRAY:
elementSize = sizeof(int64_t);
break;
default:
// By default, an array of the JSVM_INT8_ARRAY type is created.
arrayType = JSVM_INT8_ARRAY;
elementSize = sizeof(int8_t);
break;
}
size_t length = DIFF_VALUE_THREE;
JSVM_Value arrayBuffer = nullptr;
JSVM_Value typedArray = nullptr;
void *data;
// Create an ArrayBuffer object.
OH_JSVM_CreateArraybuffer(env, length * elementSize, (void **)&data, &arrayBuffer);
// Create a TypedArray object of the specified type.
JSVM_Status status = OH_JSVM_CreateTypedarray(env, arrayType, length, arrayBuffer, 0, &typedArray);
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM CreateTypedArray fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM CreateTypedArray success");
}
return typedArray;
}
// Register the CreateTypedArray callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = CreateTypedArray},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named createTypedArray and associate it with a callback. This allows the CreateTypedArray callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"createTypedArray", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
const type = {
INT8_ARRAY: 0,
UINT8_ARRAY: 1,
UINT8_CLAMPED_ARRAY: 2,
INT16_ARRAY: 3,
UINT16_ARRAY: 4,
INT32_ARRAY: 5,
UINT32_ARRAY: 6,
FLOAT32_ARRAY: 7,
FLOAT64_ARRAY: 8,
BIGINT64_ARRAY: 9,
BIGUINT64_ARRAY: 10
};
createTypedArray(type.INT8_ARRAY);
createTypedArray(type.INT32_ARRAY);
)JS";
```
### OH_JSVM_CreateDataview
Use **OH_JSVM_CreateDataview** to create a JS **DataView** object based on an **ArrayBuffer**. The **DataView** object provides an array-like view over an underlying data buffer.
CPP code:
```cpp
static int DIFF_VALUE_FOUR = 4;
static int DIFF_VALUE_TWELVE = 12;
// Define OH_JSVM_CreateDataview.
static JSVM_Value CreateDataView(JSVM_Env env, JSVM_CallbackInfo info)
{
// Obtain the two parameters passed from JS.
size_t argc = 2;
JSVM_Value args[2] = {nullptr};
JSVM_Value arrayBuffer = nullptr;
JSVM_Value result = nullptr;
// Byte length of DataView.
size_t byteLength = DIFF_VALUE_TWELVE;
// Offset of the byte.
size_t byteOffset = DIFF_VALUE_FOUR;
// Obtain the parameters of the callback.
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
// Convert the parameter into the object type.
OH_JSVM_CoerceToObject(env, args[0], &arrayBuffer);
// Create a DataView object with the specified byte length and offset.
JSVM_Status status = OH_JSVM_CreateDataview(env, byteLength, arrayBuffer, byteOffset, &result);
// Obtain the pointer to the DataView object and the length.
uint8_t *data = nullptr;
size_t length = 0;
// Assign values to DataView.
for (size_t i = 0; i < length; i++) {
data[i] = static_cast(i + 1);
}
int32_t infoType;
OH_JSVM_GetValueInt32(env, args[1], &infoType);
size_t returnLength;
JSVM_Value returnArrayBuffer = nullptr;
size_t returnOffset;
enum InfoType { BYTE_LENGTHE, ARRAY_BUFFERE, BYTE_OFFSET };
// Obtain DataView information.
OH_JSVM_GetDataviewInfo(env, result, &returnLength, (void **)&data, &returnArrayBuffer, &returnOffset);
JSVM_Value returnResult = nullptr;
switch (infoType) {
case BYTE_LENGTHE:
JSVM_Value len;
OH_JSVM_CreateInt32(env, returnLength, &len);
returnResult = len;
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM CreateDataView fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM CreateDataView success, returnLength: %{public}d", returnLength);
}
break;
case ARRAY_BUFFERE:
bool isArraybuffer;
OH_JSVM_IsArraybuffer(env, returnArrayBuffer, &isArraybuffer);
JSVM_Value isArray;
OH_JSVM_GetBoolean(env, isArraybuffer, &isArray);
returnResult = isArray;
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM CreateDataView fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM CreateDataView success, isArraybuffer: %{public}d", isArraybuffer);
}
break;
case BYTE_OFFSET:
JSVM_Value offset;
OH_JSVM_CreateInt32(env, returnOffset, &offset);
returnResult = offset;
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM CreateDataView fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM CreateDataView success, returnOffset: %{public}d", returnOffset);
}
break;
default:
break;
}
return returnResult;
}
// Register the CreateDataView callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = CreateDataView},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named createDataView and associate it with a callback. This allows the CreateDataView callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"createDataView", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
let BYTE_LENGTH = 0;
createDataView(new ArrayBuffer(16), BYTE_LENGTH);
let IS_ARRAYBUFFER = 1;
createDataView(new ArrayBuffer(16), IS_ARRAYBUFFER);
let BYTE_OFFSET = 2;
createDataView(new ArrayBuffer(16), BYTE_OFFSET);
)JS";
```
### OH_JSVM_GetArrayLength
Use **OH_JSVM_GetArrayLength** to obtain the length of an array.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_GetArrayLength.
static JSVM_Value GetArrayLength(JSVM_Env env, JSVM_CallbackInfo info)
{
size_t argc = 1;
JSVM_Value args[1] = {nullptr};
JSVM_Value result = nullptr;
uint32_t length;
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
// Check whether the parameter is an array.
bool isArray = false;
OH_JSVM_IsArray(env, args[0], &isArray);
if (!isArray) {
OH_LOG_INFO(LOG_APP, "JSVM Argument must be an array");
return nullptr;
}
OH_JSVM_GetArrayLength(env, args[0], &length);
// Create a return value.
OH_JSVM_CreateInt32(env, length, &result);
OH_LOG_INFO(LOG_APP, "JSVM length: %{public}d", length);
return result;
}
// Register the GetArrayLength callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = GetArrayLength},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named getArrayLength and associate it with a callback. This allows the GetArrayLength callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"getArrayLength", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
let data = [0, 1, 2, 3, 4, 5];
getArrayLength(data);
)JS";
```
### OH_JSVM_GetTypedarrayInfo
Use **OH_JSVM_GetTypedarrayInfo** to obtain information about a **TypedArray** object.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_GetTypedarrayInfo.
static JSVM_Value GetTypedArrayInfo(JSVM_Env env, JSVM_CallbackInfo info)
{
// Obtain and parse the parameters passed to a JS callback within a JSVM. The first parameter is the TypedArray type of the information to obtain, and the second parameter is the enums of the information type to obtain.
size_t argc = 2;
JSVM_Value args[2] = {nullptr};
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
// Convert the second parameter to the int32 type for comparison.
int32_t infoTypeParam;
OH_JSVM_GetValueInt32(env, args[1], &infoTypeParam);
// Define the infoType enums in the same sequence as those in ArkTS.
enum InfoType { INFO_TYPE, INFO_LENGTH, INFO_ARRAY_BUFFER, INFO_BYTE_OFFSET };
void *data;
JSVM_TypedarrayType type;
size_t byteOffset, length;
JSVM_Value arrayBuffer = nullptr;
// Call OH_JSVM_GetTypedarrayInfo to obtain TypedArray information.
JSVM_Status status = OH_JSVM_GetTypedarrayInfo(env, args[0], &type, &length, &data, &arrayBuffer, &byteOffset);
JSVM_Value result = nullptr;
// Return the property value based on the property name.
switch (infoTypeParam) {
case INFO_TYPE:
// If the input parameter is TypedArray data of the int8 type, the value type is JSVM_INT8_ARRAY.
JSVM_Value int8_type;
OH_JSVM_GetBoolean(env, type == JSVM_INT8_ARRAY, &int8_type);
result = int8_type;
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM GetTypedArrayInfo fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM GetTypedArrayInfo success, JSVM_INT8_ARRAY: %{public}d", type == JSVM_INT8_ARRAY);
}
break;
case INFO_LENGTH:
// Number of elements in the TypedArray object.
JSVM_Value jsvmLength;
OH_JSVM_CreateInt32(env, length, &jsvmLength);
result = jsvmLength;
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM GetTypedArrayInfo fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM GetTypedArrayInfo success, length: %{public}d", length);
}
break;
case INFO_BYTE_OFFSET:
// Byte offset of the first TypedArray element in the native array.
JSVM_Value jsvmOffset;
OH_JSVM_CreateInt32(env, byteOffset, &jsvmOffset);
result = jsvmOffset;
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM GetTypedArrayInfo fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM GetTypedArrayInfo success, byteOffset: %{public}d", byteOffset);
}
break;
case INFO_ARRAY_BUFFER:
// ArrayBuffer under TypedArray.
bool isArrayBuffer;
OH_JSVM_IsArraybuffer(env, arrayBuffer, &isArrayBuffer);
JSVM_Value isArray;
OH_JSVM_GetBoolean(env, isArrayBuffer, &isArray);
result = isArray;
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM GetTypedArrayInfo fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM GetTypedArrayInfo success, isArrayBuffer: %{public}d", isArrayBuffer);
}
break;
default:
break;
}
return result;
}
// Register the GetTypedArrayInfo callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = GetTypedArrayInfo},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named getTypedArrayInfo and associate it with a callback. This allows the GetTypedArrayInfo callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"getTypedArrayInfo", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
// is JSVM_INT8_ARRAY
getTypedArrayInfo(new Int8Array(3), 0);
// Length
getTypedArrayInfo(new Int8Array(5), 1);
// is_arraybuffer
getTypedArrayInfo(new Int8Array(5), 2);
// Byte offset.
getTypedArrayInfo(new Int8Array(1), 3);
)JS";
```
### OH_JSVM_GetDataviewInfo
Use **OH_JSVM_GetDataviewInfo** to obtain information about a **DataView** object.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_GetDataviewInfo.
static JSVM_Value GetDataViewInfo(JSVM_Env env, JSVM_CallbackInfo info)
{
// Obtain and parse the parameters passed to a JS callback within a JSVM. The first parameter is the DataView type of the information to obtain, and the second parameter is the enums of the information type to obtain.
size_t argc = 2;
JSVM_Value args[2] = {nullptr};
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
// Convert the second parameter to an int32 number.
int32_t infoType;
OH_JSVM_GetValueInt32(env, args[1], &infoType);
size_t byteLength;
void *data;
JSVM_Value arrayBuffer = nullptr;
size_t byteOffset;
// Define the infoType enums in the same sequence as those in ArkTS.
enum infoTypeEnum { BYTE_LENGTHE, ARRAY_BUFFERE, BYTE_OFFSET };
// Obtain DataView information.
JSVM_Status status = OH_JSVM_GetDataviewInfo(env, args[0], &byteLength, &data, &arrayBuffer, &byteOffset);
JSVM_Value result = nullptr;
switch (infoType) {
case BYTE_LENGTHE:
// Return the length of DataView.
JSVM_Value len;
OH_JSVM_CreateInt32(env, byteLength, &len);
result = len;
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM GetDataViewInfo fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM GetDataViewInfo success, byteLength: %{public}d", byteLength);
}
break;
case ARRAY_BUFFERE:
// Check whether data in Info of DataView is an ArrayBuffer object.
bool isArrayBuffer;
OH_JSVM_IsArraybuffer(env, arrayBuffer, &isArrayBuffer);
JSVM_Value isArray;
OH_JSVM_GetBoolean(env, isArrayBuffer, &isArray);
result = isArray;
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM GetDataViewInfo fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM GetDataViewInfo success, isArrayBuffer: %{public}d", isArrayBuffer);
}
break;
case BYTE_OFFSET:
// Return the offset of DataView.
JSVM_Value offset;
OH_JSVM_CreateInt32(env, byteOffset, &offset);
result = offset;
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM GetDataViewInfo fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM GetDataViewInfo success, byteOffset: %{public}d", byteOffset);
}
break;
default:
break;
}
return result;
}
// Register the GetDataViewInfo callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = GetDataViewInfo},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named getDataViewInfo and associate it with a callback. This allows the GetDataViewInfo callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"getDataViewInfo", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
// Byte length.
getDataViewInfo(new DataView(new Int8Array([2,5]).buffer), 0);
// Check whether the data is an ArrayBuffer object.
let data = 'a';
let isarraybuffer = 1;
getDataViewInfo(data, isarraybuffer);
// Check whether the data is an ArrayBuffer object.
data = new DataView(new Int8Array([2,5,3]).buffer);
isarraybuffer = 1;
getDataViewInfo(data, isarraybuffer);
// byte_offset
data = new DataView(new Int8Array([2,5,3]).buffer);
isarraybuffer = 2;
getDataViewInfo(data, isarraybuffer);
)JS";
```
### OH_JSVM_IsArray
Use **OH_JSVM_IsArray** to check whether a JS object is an array.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_IsArray.
static JSVM_Value IsArray(JSVM_Env env, JSVM_CallbackInfo info)
{
size_t argc = 1;
JSVM_Value args[1] = {nullptr};
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
bool result = false;
JSVM_Status status = OH_JSVM_IsArray(env, args[0], &result);
JSVM_Value returnValue = nullptr;
OH_JSVM_GetBoolean(env, result, &returnValue);
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM IsArray fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM IsArray success, IsArray: %{public}d", result);
}
return returnValue;
}
// Register the IsArray callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = IsArray},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named isArray and associate it with a callback. This allows the IsArray callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"isArray", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
let data = [1, 2, 3, 4, 5];
isArray(data);
)JS";
```
### OH_JSVM_SetElement
Use **OH_JSVM_SetElement** to set an element at the specified index for a JS object.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_SetElement.
static int DIFF_VALUE_THREE = 3;
static JSVM_Value SetElement(JSVM_Env env, JSVM_CallbackInfo info) {
size_t argc = DIFF_VALUE_THREE;
JSVM_Value args[3] = {nullptr};
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
int32_t index = 0;
OH_JSVM_GetValueInt32(env, args[1], &index);
JSVM_Status status = OH_JSVM_SetElement(env, args[0], index, args[2]);
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM SetElement fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM SetElement success");
}
return args[0];
}
// Register the SetElement callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = SetElement},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named setElement and associate it with a callback. This allows the SetElement callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"setElement", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
setElement(3);
)JS";
```
### OH_JSVM_GetElement
Use **OH_JSVM_GetElement** to obtain the element at the specified index of a JS object.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_GetElement.
static JSVM_Value GetElement(JSVM_Env env, JSVM_CallbackInfo info) {
// Obtain the two parameters passed from JS.
size_t argc = 2;
JSVM_Value args[2] = {nullptr};
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
// Obtain the index value of the element.
uint32_t index;
OH_JSVM_GetValueUint32(env, args[1], &index);
// Obtain the element value at the index and store it in result.
JSVM_Value result = nullptr;
JSVM_Status status = OH_JSVM_GetElement(env, args[0], index, &result);
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM GetElement fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM GetElement success");
}
return result;
}
// Register the GetElement callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = GetElement},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named getElement and associate it with a callback. This allows the GetElement callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"getElement", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
let arr = [10, 'hello', null, true];
getElement(arr, 3);
)JS";
```
### OH_JSVM_HasElement
Use **OH_JSVM_HasElement** to check whether a JS object has an element at the specified index.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_HasElement.
static JSVM_Value HasElement(JSVM_Env env, JSVM_CallbackInfo info)
{
// Obtain the two parameters passed from JS.
size_t argc = 2;
JSVM_Value args[2] = {nullptr};
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
// Obtain the index of the element to be checked.
uint32_t index;
OH_JSVM_GetValueUint32(env, args[1], &index);
// Check whether the element exists based on the given index.
bool hasElement = true;
JSVM_Status status = OH_JSVM_HasElement(env, args[0], index, &hasElement);
// Convert the boolean value to JSVM_Value and return it.
JSVM_Value result = nullptr;
OH_JSVM_GetBoolean(env, hasElement, &result);
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM hasElement fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM hasElement: %{public}d", hasElement);
}
return result;
}
// Register the HasElement callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = HasElement},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named hasElement and associate it with a callback. This allows the HasElement callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"hasElement", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
let arr = [10, 'hello', null, true];
hasElement(arr, 0);
hasElement(arr, 4);
)JS";
```
### OH_JSVM_DeleteElement
Use **OH_JSVM_DeleteElement** to delete the element at the specified index from a JS object.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_DeleteElement.
static JSVM_Value DeleteElement(JSVM_Env env, JSVM_CallbackInfo info) {
// Obtain the two parameters passed from JS.
size_t argc = 2;
JSVM_Value args[2] = {nullptr};
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
// Obtain the index of the element to delete.
uint32_t index;
OH_JSVM_GetValueUint32(env, args[1], &index);
// Delete the element at the specified index.
bool deleted = true;
JSVM_Status status = OH_JSVM_DeleteElement(env, args[0], index, &deleted);
// Convert the boolean value to JSVM_Value and return it.
JSVM_Value result = nullptr;
OH_JSVM_GetBoolean(env, deleted, &result);
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM DeleteElement fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM DeleteElement: %{public}d", deleted);
}
return result;
}
// Register the DeleteElement callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = DeleteElement},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named deleteElement and associate it with a callback. This allows the DeleteElement callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"deleteElement", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
let arr = [10, 'hello', null, true];
deleteElement(arr, 0);
)JS";
```
### OH_JSVM_IsDataview
Use **OH_JSVM_IsDataview** to check whether a JS object is a **DataView** object.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_IsDataview.
static JSVM_Value IsDataView(JSVM_Env env, JSVM_CallbackInfo info) {
size_t argc = 1;
JSVM_Value args[1] = {nullptr};
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
// Call OH_JSVM_IsDataview to check whether the input parameter is a DataView object.
bool result = false;
JSVM_Status status = OH_JSVM_IsDataview(env, args[0], &result);
JSVM_Value isDateView = nullptr;
OH_JSVM_GetBoolean(env, result, &isDateView);
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM IsDataView fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM IsDataView: %{public}d", result);
}
return isDateView;
}
// Register the IsDataView callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = IsDataView},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named isDataView and associate it with a callback. This allows the IsDataView callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"isDataView", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
let buffer = new ArrayBuffer(16);
let dataView = new DataView(buffer);
isDataView(dataView);
)JS";
```
### OH_JSVM_IsTypedarray
Use **OH_JSVM_IsTypedarray** to check whether a JS object is a **TypedArray** object.
CPP code:
```cpp
// hello.cpp
#include "napi/native_api.h"
#include "ark_runtime/jsvm.h"
#include
// Define OH_JSVM_IsTypedarray.
static JSVM_Value IsTypedarray(JSVM_Env env, JSVM_CallbackInfo info) {
size_t argc = 1;
JSVM_Value args[1] = {nullptr};
OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
bool result = false;
JSVM_Status status = OH_JSVM_IsTypedarray(env, args[0], &result);
JSVM_Value isTypedArray = nullptr;
OH_JSVM_GetBoolean(env, result, &isTypedArray);
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM IsTypedarray fail");
} else {
OH_LOG_INFO(LOG_APP, "JSVM IsTypedarray: %{public}d", result);
}
return isTypedArray;
}
// Register the IsTypedarray callback.
static JSVM_CallbackStruct param[] = {
{.data = nullptr, .callback = IsTypedarray},
};
static JSVM_CallbackStruct *method = param;
// Set a property descriptor named isTypedarray and associate it with a callback. This allows the IsTypedarray callback to be called from JS.
static JSVM_PropertyDescriptor descriptor[] = {
{"isTypedarray", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
};
// Call the C++ code from JS.
const char *srcCallNative = R"JS(
isTypedarray(new Uint16Array([1, 2, 3, 4]));
)JS";
```