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