• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用JSVM-API接口进行array相关开发
2<!--Kit: NDK Development-->
3<!--Subsystem: arkcompiler-->
4<!--Owner: @yuanxiaogou; @string_sz-->
5<!--Designer: @knightaoko-->
6<!--Tester: @test_lzz-->
7<!--Adviser: @fang-jinxu-->
8
9## 简介
10
11使用JSVM-API接口进行数组(array)相关开发时,在JSVM模块中可以调用相关接口直接操作和处理JavaScript中的数组。
12
13## 基本概念
14
15使用 JSVM-API 接口进行数组(array)相关开发时,涉及的基本概念主要包括数组的创建、访问、修改、遍历以及与数组相关的操作。这些概念对于理解在 JSVM 模块中与 JavaScript 数组交互非常重要。以下是一些关键概念:
16
17- **数组的创建**:若在 JSVM 模块中需要创建新的 JavaScript 数组时,可以使用提供的 OH_JSVM_CreateArray 接口创建数组,将传递给 JavaScript 层。
18- **数组相关操作**:在 JSVM 模块中通过对应的接口获取 JavaScript 数组的长度、检索指定索引处的元素、设置指定索引的元素值,从而实现 JSVM 模块与 JavaScript 数组的交互。
19- **TypedArray**:JavaScript 中的 TypedArray 是一种类数组数据视图,用于描述二进制数据。它可以视为指定元素类型的类数组数据视图,TypedArray 没有直接构造器,但是可以通过其子类构造器构造创建。子类包括:Int8Array、Uint8Array、Uint8ClampedArray、Int16Array、Int32Array等。
20- **ArrayBuffer**:ArrayBuffer 是固定长度的二进制数据缓冲区。
21- **DataView**:DataView 是 JavaScript 中的一种视图,是可以从 ArrayBuffer 对象中读写多种数值类型的底层接口。
22
23
24## 接口说明
25
26| 接口                         | 功能说明                                   |
27| ---------------------------- | ------------------------------------------ |
28|OH_JSVM_CreateArray | 创建一个新的 JavaScript 数组对象 |
29|OH_JSVM_CreateArrayWithLength | 创建一个指定长度的 JavaScript 数组对象 |
30|OH_JSVM_CreateTypedarray | 在现有的ArrayBuffer上创建JavaScript TypedArray对象,TypedArray对象提供类似类数组的视图,每个元素具有相同的二进制标量数据类型。注意(length * size_of_element) + byte_offset 不得超过传入数组的大小(以字节为单位),否则会引发RangeError异常。|
31|OH_JSVM_CreateDataview | 在现有的 ArrayBuffer 上创建一个 JavaScript DataView 对象,DataView 对象在底层数据缓冲区上提供类似数组的视图,该 ArrayBuffer 允许有不同大小和类型的元素。要求 byte_length + byte_offset 小于或等于传入数组的字节大小,否则会引发 RangeError 异常。|
32|OH_JSVM_GetArrayLength | 返回 Array 对象的长度 |
33|OH_JSVM_GetTypedarrayInfo | 获取 TypedArray(类型化数组)对象的信息 |
34|OH_JSVM_GetDataviewInfo | 获取 DataView 对象的信息 |
35|OH_JSVM_IsArray | 判断一个 JavaScript 对象是否为 Array 类型对象|
36|OH_JSVM_SetElement | 在给定对象的指定索引处设置元素 |
37|OH_JSVM_GetElement | 获取给定对象指定索引处的元素 |
38|OH_JSVM_HasElement | 若给定对象的指定索引处拥有属性,获取该元素 |
39|OH_JSVM_DeleteElement | 尝试删除给定对象的指定索引处的元素 |
40|OH_JSVM_IsDataview | 判断一个 JavaScript 对象是否为 DataView 类型对象 |
41|OH_JSVM_IsTypedarray | 判断一个 JavaScript 对象是否为 TypedArray 类型对象 |
42
43## 使用示例
44
45JSVM-API 接口开发流程参考[使用 JSVM-API 实现 JS 与 C/C++ 语言交互开发流程](use-jsvm-process.md),本文仅对接口对应 C++ 相关代码进行展示。
46
47### OH_JSVM_CreateArray
48
49创建一个新的 JavaScript 数组对象。
50
51cpp 部分代码:
52
53```cpp
54// hello.cpp
55#include "napi/native_api.h"
56#include "ark_runtime/jsvm.h"
57#include <hilog/log.h>
58// CreateArray注册回调
59static int DIFF_VALUE_FIVE = 5;
60// OH_JSVM_CreateArray的样例方法
61static JSVM_Value CreateArray(JSVM_Env env, JSVM_CallbackInfo info)
62{
63    // 创建一个空数组
64    JSVM_Value array = nullptr;
65    JSVM_Status status = OH_JSVM_CreateArray(env, &array);
66    if (status != JSVM_OK) {
67        OH_LOG_ERROR(LOG_APP, "JSVM CreateArray fail");
68        return nullptr;
69    } else {
70        OH_LOG_INFO(LOG_APP, "JSVM CreateArray success");
71    }
72    // 对创建的数组进行赋值
73    for (int i = 0; i < DIFF_VALUE_FIVE; i++) {
74        JSVM_Value element;
75        JSVM_CALL(OH_JSVM_CreateInt32(env, i, &element));
76        JSVM_CALL(OH_JSVM_SetElement(env, array, i, element));
77    }
78    return array;
79}
80static JSVM_CallbackStruct param[] = {
81    {.data = nullptr, .callback = CreateArray},
82};
83static JSVM_CallbackStruct *method = param;
84// CreateArray方法别名,供JS调用
85static JSVM_PropertyDescriptor descriptor[] = {
86    {"createArray", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
87};
88// 样例测试js
89const char *srcCallNative = R"JS(
90  function testCreateArray() {
91    return createArray();
92  }
93  testCreateArray();
94)JS";
95```
96<!-- @[oh_jsvm_create_array](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/createarray/src/main/cpp/hello.cpp) -->
97
98预计的输出结果:
99```
100JSVM CreateArray success
101```
102### OH_JSVM_CreateArrayWithLength
103
104创建一个指定长度的 JavaScript 数组对象。
105
106cpp 部分代码:
107
108```cpp
109// hello.cpp
110#include "napi/native_api.h"
111#include "ark_runtime/jsvm.h"
112#include <hilog/log.h>
113// OH_JSVM_CreateArrayWithLength的样例方法
114static JSVM_Value CreateArrayWithLength(JSVM_Env env, JSVM_CallbackInfo info)
115{
116    size_t argc = 1;
117    JSVM_Value argv[1] = {nullptr};
118    JSVM_Value result = nullptr;
119    // 解析传递的参数OH_JSVM_GetCbInfo
120    OH_JSVM_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
121    // 获取传递的数组长度
122    int32_t length = 0;
123    OH_JSVM_GetValueInt32(env, argv[0], &length);
124    // 使用OH_JSVM_CreateArrayWithLength创建传递固定长度的数组
125    JSVM_Status status = OH_JSVM_CreateArrayWithLength(env, length, &result);
126    if (status == JSVM_OK) {
127        // 给创建的数组设置值
128        for (int32_t i = 0; i < length; i++) {
129            JSVM_Value value;
130            JSVM_CALL(OH_JSVM_CreateInt32(env, i, &value));
131            JSVM_CALL(OH_JSVM_SetElement(env, result, i, value));
132        }
133        OH_LOG_INFO(LOG_APP, "JSVM CreateArrayWithLength success");
134    } else {
135        OH_LOG_ERROR(LOG_APP, "JSVM CreateArrayWithLength fail");
136    }
137    return result;
138}
139// CreateArrayWithLength注册回调
140static JSVM_CallbackStruct param[] = {
141    {.data = nullptr, .callback = CreateArrayWithLength},
142};
143static JSVM_CallbackStruct *method = param;
144// CreateArrayWithLength方法别名,供JS调用
145static JSVM_PropertyDescriptor descriptor[] = {
146    {"createArrayWithLength", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
147};
148// 样例测试js
149const char *srcCallNative = R"JS(
150let num = 7;
151function testCreateArrayWithLength(num){
152    return createArrayWithLength(num);
153}
154testCreateArrayWithLength(num);
155)JS";
156```
157<!-- @[oh_jsvm_create_array_with_length](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/createarraywithlength/src/main/cpp/hello.cpp) -->
158
159预计的输出结果:
160```
161JSVM CreateArrayWithLength success
162```
163### OH_JSVM_CreateTypedarray
164
165在现有的 ArrayBuffer上 创建一个 JavaScript TypedArray 对象,TypedArray 对象在底层数据缓冲区上提供类似数组的视图,其中每个元素都具有相同的底层二进制标量数据类型。
166
167cpp 部分代码:
168
169```cpp
170// hello.cpp
171#include "napi/native_api.h"
172#include "ark_runtime/jsvm.h"
173#include <hilog/log.h>
174// OH_JSVM_CreateTypedarray的样例方法
175static int DIFF_VALUE_THREE = 3;
176static JSVM_Value CreateTypedArray(JSVM_Env env, JSVM_CallbackInfo info)
177{
178    size_t argc = 1;
179    JSVM_Value args[1] = {nullptr};
180    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
181    int32_t typeNum = 0;
182    OH_JSVM_GetValueInt32(env, args[0], &typeNum);
183    JSVM_TypedarrayType arrayType;
184    // 用于存储每个元素的大小
185    size_t elementSize = 0;
186    // 转换为JSVM_TypedarrayType类型
187    arrayType = static_cast<JSVM_TypedarrayType>(typeNum);
188    switch (typeNum) {
189        case JSVM_INT8_ARRAY:
190        case JSVM_UINT8_ARRAY:
191        case JSVM_UINT8_CLAMPED_ARRAY:
192            elementSize = sizeof(int8_t);
193            break;
194        case JSVM_INT16_ARRAY:
195        case JSVM_UINT16_ARRAY:
196            elementSize = sizeof(int16_t);
197            break;
198        case JSVM_INT32_ARRAY:
199        case JSVM_UINT32_ARRAY:
200            elementSize = sizeof(int32_t);
201            break;
202        case JSVM_FLOAT32_ARRAY:
203            elementSize = sizeof(float);
204            break;
205        case JSVM_FLOAT64_ARRAY:
206            elementSize = sizeof(double);
207            break;
208        case JSVM_BIGINT64_ARRAY:
209        case JSVM_BIGUINT64_ARRAY:
210            elementSize = sizeof(int64_t);
211            break;
212        default:
213            // 默认创建JSVM_INT8_ARRAY类型
214            arrayType = JSVM_INT8_ARRAY;
215            elementSize = sizeof(int8_t);
216            break;
217    }
218    size_t length = DIFF_VALUE_THREE;
219    JSVM_Value arrayBuffer = nullptr;
220    JSVM_Value typedArray = nullptr;
221    void *data;
222    // 创建一个ArrayBuffer
223    OH_JSVM_CreateArraybuffer(env, length * elementSize, (void **)&data, &arrayBuffer);
224    // 根据给定类型创建TypedArray
225    JSVM_Status status = OH_JSVM_CreateTypedarray(env, arrayType, length, arrayBuffer, 0, &typedArray);
226    if (status != JSVM_OK) {
227        OH_LOG_ERROR(LOG_APP, "JSVM CreateTypedArray fail");
228    } else {
229        OH_LOG_INFO(LOG_APP, "JSVM CreateTypedArray success");
230    }
231    return typedArray;
232}
233// CreateTypedArray注册回调
234static JSVM_CallbackStruct param[] = {
235    {.data = nullptr, .callback = CreateTypedArray},
236};
237static JSVM_CallbackStruct *method = param;
238// CreateTypedArray方法别名,供JS调用
239static JSVM_PropertyDescriptor descriptor[] = {
240    {"createTypedArray", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
241};
242// 样例测试js
243const char *srcCallNative = R"JS(
244const type = {
245    INT8_ARRAY: 0,
246    UINT8_ARRAY: 1,
247    UINT8_CLAMPED_ARRAY: 2,
248    INT16_ARRAY: 3,
249    UINT16_ARRAY: 4,
250    INT32_ARRAY: 5,
251    UINT32_ARRAY: 6,
252    FLOAT32_ARRAY: 7,
253    FLOAT64_ARRAY: 8,
254    BIGINT64_ARRAY: 9,
255    BIGUINT64_ARRAY: 10
256};
257createTypedArray(type.INT8_ARRAY);
258createTypedArray(type.INT32_ARRAY);
259)JS";
260```
261<!-- @[oh_jsvm_create_typedarray](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/createtypedarray/src/main/cpp/hello.cpp) -->
262
263预计的输出结果:
264```
265JSVM CreateTypedArray success
266JSVM CreateTypedArray success
267```
268### OH_JSVM_CreateDataview
269
270在现有的 ArrayBuffer 上创建一个 JavaScript DataView 对象,DataView 对象在底层数据缓冲区上提供类似数组的视图。
271
272cpp 部分代码:
273
274```cpp
275static int DIFF_VALUE_FOUR = 4;
276static int DIFF_VALUE_TWELVE = 12;
277// OH_JSVM_CreateDataview的样例方法
278static JSVM_Value CreateDataView(JSVM_Env env, JSVM_CallbackInfo info)
279{
280    // 获取js侧传入的两个参数
281    size_t argc = 2;
282    JSVM_Value args[2] = {nullptr};
283    JSVM_Value arrayBuffer = nullptr;
284    JSVM_Value result = nullptr;
285    // DataView的字节长度
286    size_t byteLength = DIFF_VALUE_TWELVE;
287    // 字节偏移量
288    size_t byteOffset = DIFF_VALUE_FOUR;
289    // 获取回调函数的参数信息
290    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
291    // 将参数转换为对象类型
292    OH_JSVM_CoerceToObject(env, args[0], &arrayBuffer);
293    // 创建一个数据视图对象,并指定字节长度和字节偏移量
294    JSVM_Status status = OH_JSVM_CreateDataview(env, byteLength, arrayBuffer, byteOffset, &result);
295    // 获取DataView的指针和长度信息
296    uint8_t *data = nullptr;
297    // 为DataView赋值
298    int32_t infoType = 0;
299    OH_JSVM_GetValueInt32(env, args[1], &infoType);
300    size_t returnLength = 0;
301    JSVM_Value returnArrayBuffer = nullptr;
302    size_t returnOffset = 0;
303    enum InfoType { BYTE_LENGTH, ARRAY_BUFFER, BYTE_OFFSET };
304    // 获取dataview信息
305    OH_JSVM_GetDataviewInfo(env, result, &returnLength, (void **)&data, &returnArrayBuffer, &returnOffset);
306    JSVM_Value returnResult = nullptr;
307    switch (infoType) {
308        case BYTE_LENGTH:
309            JSVM_Value len;
310            JSVM_CALL(OH_JSVM_CreateInt32(env, returnLength, &len));
311            returnResult = len;
312            if (status != JSVM_OK) {
313                OH_LOG_ERROR(LOG_APP, "JSVM CreateDataView fail");
314            } else {
315                OH_LOG_INFO(LOG_APP, "JSVM CreateDataView success, returnLength: %{public}d", returnLength);
316            }
317            break;
318        case ARRAY_BUFFER:
319            {
320                bool isArraybuffer = false;
321                JSVM_CALL(OH_JSVM_IsArraybuffer(env, returnArrayBuffer, &isArraybuffer));
322                JSVM_Value isArray;
323                OH_JSVM_GetBoolean(env, isArraybuffer, &isArray);
324                returnResult = isArray;
325                if (status != JSVM_OK) {
326                    OH_LOG_ERROR(LOG_APP, "JSVM CreateDataView fail");
327                } else {
328                    OH_LOG_INFO(LOG_APP, "JSVM CreateDataView success, isArraybuffer: %{public}d", isArraybuffer);
329                }
330                break;
331            }
332        case BYTE_OFFSET:
333            JSVM_Value offset;
334            JSVM_CALL(OH_JSVM_CreateInt32(env, returnOffset, &offset));
335            returnResult = offset;
336            if (status != JSVM_OK) {
337                OH_LOG_ERROR(LOG_APP, "JSVM CreateDataView fail");
338            } else {
339                OH_LOG_INFO(LOG_APP, "JSVM CreateDataView success, returnOffset: %{public}d", returnOffset);
340            }
341            break;
342        default:
343            break;
344    }
345    return returnResult;
346}
347// CreateDataView注册回调
348static JSVM_CallbackStruct param[] = {
349    {.data = nullptr, .callback = CreateDataView},
350};
351static JSVM_CallbackStruct *method = param;
352// CreateDataView方法别名,供JS调用
353static JSVM_PropertyDescriptor descriptor[] = {
354    {"createDataView", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
355};
356// 样例测试js
357const char *srcCallNative = R"JS(
358 let BYTE_LENGTH = 0;
359 createDataView(new ArrayBuffer(16), BYTE_LENGTH);
360 let IS_ARRAYBUFFER = 1;
361 createDataView(new ArrayBuffer(16), IS_ARRAYBUFFER);
362 let BYTE_OFFSET = 2;
363 createDataView(new ArrayBuffer(16), BYTE_OFFSET);
364)JS";
365```
366<!-- @[oh_jsvm_create_dataview](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/createdataview/src/main/cpp/hello.cpp) -->
367
368预计的输出结果:
369```
370CreateDataView success, returnLength: 12
371JSVM CreateDataView success, isArraybuffer: 1
372JSVM CreateDataView success, returnOffset: 4
373```
374### OH_JSVM_GetArrayLength
375
376返回 Array 对象的长度。
377
378cpp 部分代码:
379
380```cpp
381// hello.cpp
382#include "napi/native_api.h"
383#include "ark_runtime/jsvm.h"
384#include <hilog/log.h>
385// OH_JSVM_GetArrayLength的样例方法
386static JSVM_Value GetArrayLength(JSVM_Env env, JSVM_CallbackInfo info)
387{
388    size_t argc = 1;
389    JSVM_Value args[1] = {nullptr};
390    JSVM_Value result = nullptr;
391    // 这里要对length进行初始化
392    uint32_t length = 0;
393    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
394    // 检查参数是否为数组
395    bool isArray = false;
396    OH_JSVM_IsArray(env, args[0], &isArray);
397    if (!isArray) {
398        OH_LOG_INFO(LOG_APP, "JSVM Argument must be an array");
399        return nullptr;
400    }
401    /*
402     * 当成功获取数组长度时,length会被赋值成实际JSArray的长度,接口返回JSVM_OK状态码;
403     * 当args[0]不是一个JSArray类型。例如,当args[0]是一个proxy对象时,无法获取长度。
404     * 此时,length维持原值不变,接口返回JSVM_ARRAY_EXPECTED状态码。
405     */
406    JSVM_Status status = OH_JSVM_GetArrayLength(env, args[0], &length);
407    if (status == JSVM_OK) {
408        // 创建返回值
409        JSVM_CALL(OH_JSVM_CreateInt32(env, length, &result));
410        OH_LOG_INFO(LOG_APP, "JSVM length: %{public}d", length);
411    }
412    return result;
413}
414// GetArrayLength注册回调
415static JSVM_CallbackStruct param[] = {
416    {.data = nullptr, .callback = GetArrayLength},
417};
418static JSVM_CallbackStruct *method = param;
419// GetArrayLength方法别名,供JS调用
420static JSVM_PropertyDescriptor descriptor[] = {
421    {"getArrayLength", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
422};
423// 样例测试js
424const char *srcCallNative = R"JS(
425let data = [0, 1, 2, 3, 4, 5];
426getArrayLength(data);
427)JS";
428```
429<!-- @[oh_jsvm_get_array_length](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/getarraylength/src/main/cpp/hello.cpp) -->
430
431预计的输出结果:
432```
433JSVM length: 6
434```
435### OH_JSVM_GetTypedarrayInfo
436
437获取 TypedArray(类型化数组)对象的信息。
438
439cpp 部分代码:
440
441```cpp
442// hello.cpp
443#include "napi/native_api.h"
444#include "ark_runtime/jsvm.h"
445#include <hilog/log.h>
446// OH_JSVM_GetTypedarrayInfo的样例方法
447static JSVM_Value GetTypedArrayInfo(JSVM_Env env, JSVM_CallbackInfo info)
448{
449    // 获取并解析参数,第一个参数为需要获得的信息的TypedArray类型数据,第二个参数为需要获得的信息类型的枚举值
450    size_t argc = 2;
451    JSVM_Value args[2] = {nullptr};
452    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
453
454    // 将第二个参数转为int32类型便于比较
455    int32_t infoTypeParam = 0;
456    OH_JSVM_GetValueInt32(env, args[1], &infoTypeParam);
457    // 定义枚举类型与ArkTS侧枚举类型infoType顺序含义一致
458    enum InfoType { INFO_TYPE, INFO_LENGTH, INFO_ARRAY_BUFFER, INFO_BYTE_OFFSET };
459    void *data;
460    JSVM_TypedarrayType type;
461    size_t byteOffset = 0;
462    size_t length = 0;
463    JSVM_Value arrayBuffer = nullptr;
464    // 调用接口OH_JSVM_GetTypedarrayInfo获得TypedArray类型数据的信息
465    JSVM_Status status = OH_JSVM_GetTypedarrayInfo(env, args[0], &type, &length, &data, &arrayBuffer, &byteOffset);
466    JSVM_Value result = nullptr;
467    // 根据属性名,返回TypedArray对应的属性值
468    switch (infoTypeParam) {
469        case INFO_TYPE:
470            // 如果传入的参数是int8类型的TypedArray数据,它的类型(type)为JSVM_INT8_ARRAY
471            JSVM_Value int8_type;
472            OH_JSVM_GetBoolean(env, type == JSVM_INT8_ARRAY, &int8_type);
473            result = int8_type;
474            if (status != JSVM_OK) {
475                OH_LOG_ERROR(LOG_APP, "JSVM GetTypedArrayInfo fail");
476            } else {
477                OH_LOG_INFO(
478                    LOG_APP, "JSVM GetTypedArrayInfo success, JSVM_INT8_ARRAY: %{public}d", type == JSVM_INT8_ARRAY);
479            }
480            break;
481        case INFO_LENGTH:
482            // TypedArray中的元素数
483            JSVM_Value jsvmLength;
484            JSVM_CALL(OH_JSVM_CreateInt32(env, length, &jsvmLength));
485            result = jsvmLength;
486            if (status != JSVM_OK) {
487                OH_LOG_ERROR(LOG_APP, "JSVM GetTypedArrayInfo fail");
488            } else {
489                OH_LOG_INFO(LOG_APP, "JSVM GetTypedArrayInfo success, length: %{public}d", length);
490            }
491            break;
492        case INFO_BYTE_OFFSET:
493            // TypedArray数组的第一个元素所在的基础原生数组中的字节偏移量
494            JSVM_Value jsvmOffset;
495            JSVM_CALL(OH_JSVM_CreateInt32(env, byteOffset, &jsvmOffset));
496            result = jsvmOffset;
497            if (status != JSVM_OK) {
498                OH_LOG_ERROR(LOG_APP, "JSVM GetTypedArrayInfo fail");
499            } else {
500                OH_LOG_INFO(LOG_APP, "JSVM GetTypedArrayInfo success, byteOffset: %{public}d", byteOffset);
501            }
502            break;
503        case INFO_ARRAY_BUFFER:
504            {
505                // TypedArray下的ArrayBuffer
506                bool isArrayBuffer = false;
507                JSVM_CALL(OH_JSVM_IsArraybuffer(env, arrayBuffer, &isArrayBuffer));
508                JSVM_Value isArray;
509                OH_JSVM_GetBoolean(env, isArrayBuffer, &isArray);
510                result = isArray;
511                if (status != JSVM_OK) {
512                    OH_LOG_ERROR(LOG_APP, "JSVM GetTypedArrayInfo fail");
513                } else {
514                    OH_LOG_INFO(LOG_APP, "JSVM GetTypedArrayInfo success, isArrayBuffer: %{public}d", isArrayBuffer);
515                }
516                break;
517            }
518        default:
519            break;
520    }
521    return result;
522}
523// GetTypedArrayInfo注册回调
524static JSVM_CallbackStruct param[] = {
525    {.data = nullptr, .callback = GetTypedArrayInfo},
526};
527static JSVM_CallbackStruct *method = param;
528// GetTypedArrayInfo方法别名,供JS调用
529static JSVM_PropertyDescriptor descriptor[] = {
530    {"getTypedArrayInfo", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
531};
532// 样例测试js
533const char *srcCallNative = R"JS(
534// is JSVM_INT8_ARRAY
535getTypedArrayInfo(new Int8Array(3), 0);
536// length
537getTypedArrayInfo(new Int8Array(5), 1);
538// is_arraybuffer
539getTypedArrayInfo(new Int8Array(5), 2);
540// byteoffset
541getTypedArrayInfo(new Int8Array(1), 3);
542)JS";
543```
544<!-- @[oh_jsvm_get_typedarray_info](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/gettypedarrayinfo/src/main/cpp/hello.cpp) -->
545
546预计的输出结果:
547```
548JSVM GetTypedArrayInfo success, JSVM_INT8_ARRAY: 1
549JSVM GetTypedArrayInfo success, length: 5
550JSVM GetTypedArrayInfo success, isArrayBuffer: 1
551JSVM GetTypedArrayInfo success, byteOffset: 0
552```
553### OH_JSVM_GetDataviewInfo
554
555获取 Dataview 对象的信息。
556
557cpp 部分代码:
558
559```cpp
560// hello.cpp
561#include "napi/native_api.h"
562#include "ark_runtime/jsvm.h"
563#include <hilog/log.h>
564// OH_JSVM_GetDataviewInfo的样例方法
565static JSVM_Value GetDataViewInfo(JSVM_Env env, JSVM_CallbackInfo info)
566{
567    // 获取并解析参数,第一个参数为需要获得的信息的DataView类型数据,第二个参数为需要获得的信息类型的枚举值
568    size_t argc = 2;
569    JSVM_Value args[2] = {nullptr};
570    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
571    // 将第二个参数转为int32类型的数字
572    int32_t infoType = 0;
573    OH_JSVM_GetValueInt32(env, args[1], &infoType);
574    size_t byteLength = 0;
575    void *data;
576    JSVM_Value arrayBuffer = nullptr;
577    size_t byteOffset = 0;
578    // 定义枚举类型与ArkTS侧枚举类型infoType顺序含义一致
579    enum infoTypeEnum { BYTE_LENGTH, ARRAY_BUFFER, BYTE_OFFSET };
580    // 获取dataview信息
581    JSVM_Status status = OH_JSVM_GetDataviewInfo(env, args[0], &byteLength, &data, &arrayBuffer, &byteOffset);
582    JSVM_Value result = nullptr;
583    switch (infoType) {
584        case BYTE_LENGTH:
585            // 返回查询DataView的长度
586            JSVM_Value len;
587            JSVM_CALL(OH_JSVM_CreateInt32(env, byteLength, &len));
588            result = len;
589            if (status != JSVM_OK) {
590                OH_LOG_ERROR(LOG_APP, "JSVM GetDataViewInfo fail");
591            } else {
592                OH_LOG_INFO(LOG_APP, "JSVM GetDataViewInfo success, byteLength: %{public}d", byteLength);
593            }
594            break;
595        case ARRAY_BUFFER:
596            {
597                // 判断DataView的Info里的arraybuffer是否为arraybuffer
598                bool isArrayBuffer = false;
599                JSVM_CALL(OH_JSVM_IsArraybuffer(env, arrayBuffer, &isArrayBuffer));
600                JSVM_Value isArray;
601                OH_JSVM_GetBoolean(env, isArrayBuffer, &isArray);
602                result = isArray;
603                if (status != JSVM_OK) {
604                    OH_LOG_ERROR(LOG_APP, "JSVM GetDataViewInfo fail");
605                } else {
606                    OH_LOG_INFO(LOG_APP, "JSVM GetDataViewInfo success, isArrayBuffer: %{public}d", isArrayBuffer);
607                }
608                break;
609            }
610        case BYTE_OFFSET:
611            // 返回查询DataView的偏移量
612            JSVM_Value offset;
613            JSVM_CALL(OH_JSVM_CreateInt32(env, byteOffset, &offset));
614            result = offset;
615            if (status != JSVM_OK) {
616                OH_LOG_ERROR(LOG_APP, "JSVM GetDataViewInfo fail");
617            } else {
618                OH_LOG_INFO(LOG_APP, "JSVM GetDataViewInfo success, byteOffset: %{public}d", byteOffset);
619            }
620            break;
621        default:
622            break;
623    }
624    return result;
625}
626// GetDataViewInfo注册回调
627static JSVM_CallbackStruct param[] = {
628    {.data = nullptr, .callback = GetDataViewInfo},
629};
630static JSVM_CallbackStruct *method = param;
631// GetDataViewInfo方法别名,供JS调用
632static JSVM_PropertyDescriptor descriptor[] = {
633    {"getDataViewInfo", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
634};
635// 样例测试js
636const char *srcCallNative = R"JS(
637// bytelength
638getDataViewInfo(new DataView(new Int8Array([2,5]).buffer), 0);
639// is arraybuffer
640let data = 'a';
641let isarraybuffer = 1;
642getDataViewInfo(data, isarraybuffer);
643// is arraybuffer
644data = new DataView(new Int8Array([2,5,3]).buffer);
645isarraybuffer = 1;
646getDataViewInfo(data, isarraybuffer);
647// byte_offset
648data = new DataView(new Int8Array([2,5,3]).buffer);
649isarraybuffer = 2;
650getDataViewInfo(data, isarraybuffer);
651)JS";
652```
653<!-- @[oh_jsvm_get_dataview_info](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/getdataviewinfo/src/main/cpp/hello.cpp) -->
654
655预计的输出结果:
656```
657JSVM GetDataViewInfo success, byteLength: 2
658JSVM GetDataViewInfo fail
659JSVM GetDataViewInfo success, isArrayBuffer: 1
660JSVM GetDataViewInfo success, byteOffset: 0
661```
662### OH_JSVM_IsArray
663
664判断一个 JavaScript 对象是否为 Array 类型对象。
665
666cpp 部分代码:
667
668```cpp
669// hello.cpp
670#include "napi/native_api.h"
671#include "ark_runtime/jsvm.h"
672#include <hilog/log.h>
673// OH_JSVM_IsArray的样例方法
674static JSVM_Value IsArray(JSVM_Env env, JSVM_CallbackInfo info)
675{
676    size_t argc = 1;
677    JSVM_Value args[1] = {nullptr};
678    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
679    bool result = false;
680    JSVM_Status status = OH_JSVM_IsArray(env, args[0], &result);
681    JSVM_Value returnValue = nullptr;
682    JSVM_CALL(OH_JSVM_GetBoolean(env, result, &returnValue));
683    if (status != JSVM_OK) {
684        OH_LOG_ERROR(LOG_APP, "JSVM IsArray fail");
685    } else {
686        OH_LOG_INFO(LOG_APP, "JSVM IsArray success, IsArray: %{public}d", result);
687    }
688    return returnValue;
689}
690// IsArray注册回调
691static JSVM_CallbackStruct param[] = {
692    {.data = nullptr, .callback = IsArray},
693};
694static JSVM_CallbackStruct *method = param;
695// IsArray方法别名,TS侧调用
696static JSVM_PropertyDescriptor descriptor[] = {
697    {"isArray", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
698};
699// 样例测试js
700const char *srcCallNative = R"JS(
701let data = [1, 2, 3, 4, 5];
702isArray(data);
703)JS";
704```
705<!-- @[oh_jsvm_is_array](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/isarray/src/main/cpp/hello.cpp) -->
706
707预计的输出结果:
708```
709JSVM IsArray success, IsArray: 1
710```
711### OH_JSVM_SetElement
712
713在给定对象的指定索引处设置元素。
714
715cpp 部分代码:
716
717```cpp
718// hello.cpp
719#include "napi/native_api.h"
720#include "ark_runtime/jsvm.h"
721#include <hilog/log.h>
722// OH_JSVM_SetElement的样例方法
723static int DIFF_VALUE_THREE = 3;
724static JSVM_Value SetElement(JSVM_Env env, JSVM_CallbackInfo info)
725{
726    size_t argc = DIFF_VALUE_THREE;
727    JSVM_Value args[3] = {nullptr};
728    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
729    int32_t index = 0;
730    OH_JSVM_GetValueInt32(env, args[1], &index);
731    JSVM_Status status = OH_JSVM_SetElement(env, args[0], index, args[2]);
732    if (status != JSVM_OK) {
733        OH_LOG_ERROR(LOG_APP, "JSVM SetElement fail");
734    } else {
735        OH_LOG_INFO(LOG_APP, "JSVM SetElement success");
736    }
737    return args[0];
738}
739// SetElement注册回调
740static JSVM_CallbackStruct param[] = {
741    {.data = nullptr, .callback = SetElement},
742};
743static JSVM_CallbackStruct *method = param;
744// SetElement方法别名,供JS调用
745static JSVM_PropertyDescriptor descriptor[] = {
746    {"setElement", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
747};
748// 样例测试js
749const char *srcCallNative = R"JS(
750let data = [1, 2, 3, 4, 5];
751setElement(data, 3, undefined);
752)JS";
753```
754<!-- @[oh_jsvm_set_element](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/setelement/src/main/cpp/hello.cpp) -->
755
756预计的输出结果:
757```
758JSVM SetElement success
759```
760### OH_JSVM_GetElement
761
762获取给定对象指定索引处的元素。
763
764cpp 部分代码:
765
766```cpp
767// hello.cpp
768#include "napi/native_api.h"
769#include "ark_runtime/jsvm.h"
770#include <hilog/log.h>
771// OH_JSVM_GetElement的样例方法
772static JSVM_Value GetElement(JSVM_Env env, JSVM_CallbackInfo info) {
773    // 获取js侧传入的两个参数
774    size_t argc = 2;
775    JSVM_Value args[2] = {nullptr};
776    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
777    // 获取请求元素的索引值
778    uint32_t index = 0;
779    OH_JSVM_GetValueUint32(env, args[1], &index);
780    // 获取请求索引位置的元素值并存储在result中
781    JSVM_Value result = nullptr;
782    JSVM_Status status = OH_JSVM_GetElement(env, args[0], index, &result);
783    if (status != JSVM_OK) {
784        OH_LOG_ERROR(LOG_APP, "JSVM GetElement fail");
785    } else {
786        OH_LOG_INFO(LOG_APP, "JSVM GetElement success");
787    }
788    return result;
789}
790// GetElement注册回调
791static JSVM_CallbackStruct param[] = {
792    {.data = nullptr, .callback = GetElement},
793};
794static JSVM_CallbackStruct *method = param;
795// GetElement方法别名,供JS调用
796static JSVM_PropertyDescriptor descriptor[] = {
797    {"getElement", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
798};
799// 样例测试js
800const char *srcCallNative = R"JS(
801let arr = [10, 'hello', null, true];
802getElement(arr, 3);
803)JS";
804```
805<!-- @[oh_jsvm_get_element](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/getelement/src/main/cpp/hello.cpp) -->
806
807预计的输出结果:
808```
809JSVM GetElement success
810```
811### OH_JSVM_HasElement
812
813若给定对象的指定索引处拥有属性,获取元素。
814
815cpp 部分代码:
816
817```cpp
818// hello.cpp
819#include "napi/native_api.h"
820#include "ark_runtime/jsvm.h"
821#include <hilog/log.h>
822// OH_JSVM_HasElement的样例方法
823static JSVM_Value HasElement(JSVM_Env env, JSVM_CallbackInfo info) {
824    // 获取js侧传入的两个参数
825    size_t argc = 2;
826    JSVM_Value args[2] = {nullptr};
827    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
828    // 获取要判断的元素的索引
829    uint32_t index = 0;
830    OH_JSVM_GetValueUint32(env, args[1], &index);
831    // 判断指定索引位置的元素是否存在
832    bool hasElement = true;
833    JSVM_Status status = OH_JSVM_HasElement(env, args[0], index, &hasElement);
834    // 将boolean结果转换为JSVM_Value并返回
835    JSVM_Value result = nullptr;
836    if (status != JSVM_OK) {
837        OH_LOG_ERROR(LOG_APP, "JSVM hasElement fail");
838    } else {
839        OH_JSVM_GetBoolean(env, hasElement, &result);
840        OH_LOG_INFO(LOG_APP, "JSVM hasElement: %{public}d", hasElement);
841    }
842    return result;
843}
844// HasElement注册回调
845static JSVM_CallbackStruct param[] = {
846    {.data = nullptr, .callback = HasElement},
847};
848static JSVM_CallbackStruct *method = param;
849// HasElement方法别名,供JS调用
850static JSVM_PropertyDescriptor descriptor[] = {
851    {"hasElement", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
852};
853// 样例测试js
854const char *srcCallNative = R"JS(
855let arr = [10, 'hello', null, true];
856hasElement(arr, 0);
857hasElement(arr, 4);
858)JS";
859```
860<!-- @[oh_jsvm_has_element](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/haselement/src/main/cpp/hello.cpp) -->
861
862预计的输出结果:
863```
864JSVM hasElement: 1
865JSVM hasElement: 0
866```
867### OH_JSVM_DeleteElement
868
869尝试删除给定对象的指定索引处的元素。
870
871cpp 部分代码:
872
873```cpp
874// hello.cpp
875#include "napi/native_api.h"
876#include "ark_runtime/jsvm.h"
877#include <hilog/log.h>
878// OH_JSVM_DeleteElement的样例方法
879static JSVM_Value DeleteElement(JSVM_Env env, JSVM_CallbackInfo info) {
880    // 获取js侧传入的两个参数
881    size_t argc = 2;
882    JSVM_Value args[2] = {nullptr};
883    JSVM_CALL(OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr));
884    // 获取要删除的元素的索引
885    uint32_t index = 0;
886    JSVM_CALL(OH_JSVM_GetValueUint32(env, args[1], &index));
887    // 尝试删除请求索引位置的元素
888    bool deleted = true;
889    JSVM_Status status = OH_JSVM_DeleteElement(env, args[0], index, &deleted);
890    // 将boolean结果转换为JSVM_Value并返回
891    JSVM_Value result = nullptr;
892    if (status != JSVM_OK) {
893        OH_LOG_ERROR(LOG_APP, "JSVM DeleteElement fail");
894    } else {
895        OH_JSVM_GetBoolean(env, deleted, &result);
896        OH_LOG_INFO(LOG_APP, "JSVM DeleteElement: %{public}d", deleted);
897    }
898    return result;
899}
900// DeleteElement注册回调
901static JSVM_CallbackStruct param[] = {
902    {.data = nullptr, .callback = DeleteElement},
903};
904static JSVM_CallbackStruct *method = param;
905// DeleteElement方法别名,供JS调用
906static JSVM_PropertyDescriptor descriptor[] = {
907    {"deleteElement", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
908};
909// 样例测试js
910const char *srcCallNative = R"JS(
911let arr = [10, 'hello', null, true];
912deleteElement(arr, 0);
913)JS";
914```
915<!-- @[oh_jsvm_delete_element](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/deleteelement/src/main/cpp/hello.cpp) -->
916
917预计的输出结果:
918```
919JSVM DeleteElement: 1
920```
921### OH_JSVM_IsDataview
922
923判断一个 JavaScript 对象是否为 Dataview 类型对象。
924
925cpp 部分代码:
926
927```cpp
928// hello.cpp
929#include "napi/native_api.h"
930#include "ark_runtime/jsvm.h"
931#include <hilog/log.h>
932// OH_JSVM_IsDataview的样例方法
933static JSVM_Value IsDataView(JSVM_Env env, JSVM_CallbackInfo info) {
934    size_t argc = 1;
935    JSVM_Value args[1] = {nullptr};
936    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
937    // 调用OH_JSVM_IsDataview接口判断给定入参是否为DataView数据。
938    bool result = false;
939    JSVM_Status status = OH_JSVM_IsDataview(env, args[0], &result);
940    JSVM_Value isDataView = nullptr;
941    OH_JSVM_GetBoolean(env, result, &isDataView);
942    if (status != JSVM_OK) {
943        OH_LOG_ERROR(LOG_APP, "JSVM IsDataView fail");
944    } else {
945        OH_LOG_INFO(LOG_APP, "JSVM IsDataView: %{public}d", result);
946    }
947    return isDataView;
948}
949// IsDataView注册回调
950static JSVM_CallbackStruct param[] = {
951    {.data = nullptr, .callback = IsDataView},
952};
953static JSVM_CallbackStruct *method = param;
954// IsDataView方法别名,TS侧调用
955static JSVM_PropertyDescriptor descriptor[] = {
956    {"isDataView", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
957};
958// 样例测试js
959const char *srcCallNative = R"JS(
960let buffer = new ArrayBuffer(16);
961let dataView = new DataView(buffer);
962isDataView(dataView);
963)JS";
964```
965<!-- @[oh_jsvm_is_dataview](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/isdataview/src/main/cpp/hello.cpp) -->
966
967预计的输出结果:
968```
969JSVM IsDataView: 1
970```
971### OH_JSVM_IsTypedarray
972
973判断一个 JavaScript 对象是否为 TypedArray 类型对象。
974
975cpp 部分代码:
976
977```cpp
978// hello.cpp
979#include "napi/native_api.h"
980#include "ark_runtime/jsvm.h"
981#include <hilog/log.h>
982// OH_JSVM_IsTypedarray的样例方法
983static JSVM_Value IsTypedarray(JSVM_Env env, JSVM_CallbackInfo info) {
984    size_t argc = 1;
985    JSVM_Value args[1] = {nullptr};
986    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
987    bool result = false;
988    JSVM_Status status = OH_JSVM_IsTypedarray(env, args[0], &result);
989    JSVM_Value isTypedArray = nullptr;
990    OH_JSVM_GetBoolean(env, result, &isTypedArray);
991    if (status != JSVM_OK) {
992        OH_LOG_ERROR(LOG_APP, "JSVM IsTypedarray fail");
993    } else {
994        OH_LOG_INFO(LOG_APP, "JSVM IsTypedarray: %{public}d", result);
995    }
996    return isTypedArray;
997}
998// IsTypedarray注册回调
999static JSVM_CallbackStruct param[] = {
1000    {.data = nullptr, .callback = IsTypedarray},
1001};
1002static JSVM_CallbackStruct *method = param;
1003// IsTypedarray方法别名,TS侧调用
1004static JSVM_PropertyDescriptor descriptor[] = {
1005    {"isTypedarray", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
1006};
1007// 样例测试js
1008const char *srcCallNative = R"JS(
1009isTypedarray(new Uint16Array([1, 2, 3, 4]));
1010)JS";
1011```
1012<!-- @[oh_jsvm_is_typedarray](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutArray/istypedarray/src/main/cpp/hello.cpp) -->
1013
1014预计的输出结果:
1015```
1016JSVM IsTypedarray: 1
1017```