• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用JSVM-API接口进行private相关开发
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
11JSVM-API 提供操作私有属性的接口。
12
13## 基本概念
14
15JSVM-API提供创建private key的能力,并支持在对象上使用该key进行属性的创建与删除,同时持久化保存private key symbol。
16
17## 接口说明
18
19| 接口                                    | 功能说明                       |
20|----------------------------------------|--------------------------------|
21| OH_JSVM_CreateDataReference            | 在JSVM中创建一个带有指定引用计数的数据引用。 |
22| OH_JSVM_GetReferenceData               | 检查指定的引用是否有效, 返回该引用关联的JavaScript数据, 无效result设置为NULL。|
23| OH_JSVM_CreatePrivate                  | 创建一个js private key对象。   |
24| OH_JSVM_SetPrivate                     | 为传入的object设置一个private属性。   |
25| OH_JSVM_GetPrivate                     | 获取传入的object中private key对应的private属性。   |
26| OH_JSVM_DeletePrivate                  | 删除传入的object中private key对应的private属性。   |
27
28## 使用示例
29
30JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](use-jsvm-process.md),本文仅对接口对应C++相关代码进行展示。
31
32### 使用接口创建 private key 并添加对应 private property,随后删除
33
34cpp部分代码
35
36```cpp
37static JSVM_Value privateTest(JSVM_Env env, JSVM_CallbackInfo info) {
38    JSVM_VM vm;
39    JSVM_HandleScope outerScope;
40    OH_JSVM_GetVM(env, &vm);
41    OH_JSVM_OpenHandleScope(env, &outerScope);
42
43    JSVM_HandleScope handleScope;
44    JSVM_Data privateKey;
45    JSVM_Value object;
46    JSVM_Value property;
47    JSVM_Ref privateRef;
48    {
49        OH_JSVM_OpenHandleScope(env, &handleScope);
50        OH_JSVM_CreateObject(env, &object);
51        OH_JSVM_CreatePrivate(env, nullptr, &privateKey);
52        OH_JSVM_CreateInt32(env, 1, &property);
53        OH_JSVM_SetPrivate(env, object, privateKey, property);
54        OH_JSVM_GetPrivate(env, object, privateKey, &property);
55        int propertyValue = 0;
56        OH_JSVM_GetValueInt32(env, property, &propertyValue);
57        OH_LOG_INFO(LOG_APP, "private property set: %{public}d\n", propertyValue);
58        OH_JSVM_DeletePrivate(env, object, privateKey);
59        OH_JSVM_GetPrivate(env, object, privateKey, &property);
60        bool isUndefined = false;
61        OH_JSVM_IsUndefined(env, property, &isUndefined);
62        OH_LOG_INFO(LOG_APP, "private property deleted is undefined: %{public}d\n", isUndefined);
63        OH_JSVM_CreateDataReference(env, privateKey, 1, &privateRef);
64        OH_JSVM_CloseHandleScope(env, handleScope);
65    }
66    {
67        OH_JSVM_OpenHandleScope(env, &handleScope);
68        OH_JSVM_GetReferenceData(env, privateRef, &privateKey);
69        OH_JSVM_CreateObject(env, &object);
70        OH_JSVM_CreateInt32(env, 2, &property);
71        OH_JSVM_SetPrivate(env, object, privateKey, property);
72        OH_JSVM_GetPrivate(env, object, privateKey, &property);
73        int propertyValue = 0;
74        OH_JSVM_GetValueInt32(env, property, &propertyValue);
75        OH_LOG_INFO(LOG_APP, "second private property set: %{public}d\n", propertyValue);
76        OH_JSVM_CloseHandleScope(env, handleScope);
77    }
78
79    OH_JSVM_CloseHandleScope(env, outerScope);
80    return nullptr;
81}
82
83static JSVM_CallbackStruct param[] = {
84    {.data = nullptr, .callback = privateTest},
85};
86
87static JSVM_CallbackStruct *method = param;
88
89// wrapperObject方法别名,供JS调用
90static JSVM_PropertyDescriptor descriptor[] = {
91    {"privateTest", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
92};
93
94// 样例测试JS
95const char *srcCallNative = R"JS(privateTest();)JS";
96```
97
98## 预期输出结果
99```
100private property set: 1
101private property deleted is undefined: 1
102second private property set: 2
103```
104