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