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