文档管理中心
指南NDK开发代码开发使用Node-API实现ArkTS/JS与C/C++语言交互Node-API典型使用场景使用扩展的Node-API接口创建对ArkTS对象的强引用

使用扩展的Node-API接口创建对ArkTS对象的强引用

HarmonyOS提供的API优化了强引用的创建效率,保留了Node-API的强引用特性,相较于napi_ref,napi_strong_ref具有更快的创建效率。

场景介绍

开发者可以通过napi_create_strong_reference接口创建指向ArkTS对象的强引用,并通过napi_get_strong_reference_value获取引用的ArkTS对象。

强引用对象关联接口

展开
接口 描述
napi_create_strong_reference 创建指向ArkTS对象的强引用
napi_delete_strong_reference 删除强引用
napi_get_strong_reference_value 根据强引用对象获取其关联的ArkTS对象值

示例代码

  • 模块注册

    收起
    自动换行
    深色代码主题
    复制
    1. // napi_init.cpp
    2. #include "napi/native_api.h"
    3. #include <vector>
    4. // napi_strong_ref 不支持跨线程使用。示例为单线程场景。请勿在业务代码中使用此方式声明。
    5. static napi_strong_ref g_strongRef {};
    6. static napi_value NAPI_Global_saveOrReplaceObject(napi_env env, napi_callback_info info)
    7. {
    8. napi_value args[1]{};
    9. size_t argc = 1;
    10. napi_get_cb_info(env, info, &argc, args, /* thisVar */ nullptr, /* data */ nullptr);
    11. if (argc < 1) {
    12. return nullptr;
    13. }
    14. if (g_strongRef != nullptr) {
    15. napi_delete_strong_reference(env, g_strongRef);
    16. g_strongRef = nullptr;
    17. }
    18. napi_create_strong_reference(env, args[0], &g_strongRef);
    19. return nullptr;
    20. }
    21. static napi_value NAPI_Global_releaseObject(napi_env env, [[maybe_unused]] napi_callback_info info)
    22. {
    23. if (g_strongRef != nullptr) {
    24. napi_delete_strong_reference(env, g_strongRef);
    25. g_strongRef = nullptr;
    26. }
    27. return nullptr;
    28. }
    29. static napi_value NAPI_Global_queryObject(napi_env env, [[maybe_unused]] napi_callback_info info)
    30. {
    31. napi_value result {};
    32. napi_get_strong_reference_value(env, g_strongRef, &result);
    33. return result;
    34. }
    35. // 模块注册
    36. EXTERN_C_START
    37. static napi_value Init(napi_env env, napi_value exports)
    38. {
    39. std::vector<napi_property_descriptor> desc{
    40. {"saveOrReplaceObject", nullptr, NAPI_Global_saveOrReplaceObject, nullptr, nullptr, nullptr, napi_default, nullptr},
    41. {"releaseObject", nullptr, NAPI_Global_releaseObject, nullptr, nullptr, nullptr, napi_default, nullptr},
    42. {"queryObject", nullptr, NAPI_Global_queryObject, nullptr, nullptr, nullptr, napi_default, nullptr},
    43. };
    44. napi_define_properties(env, exports, desc.size(), desc.data());
    45. return exports;
    46. }
    47. EXTERN_C_END
    48. static napi_module demoModule = {
    49. .nm_version = 1,
    50. .nm_flags = 0,
    51. .nm_filename = nullptr,
    52. .nm_register_func = Init,
    53. .nm_modname = "entry",
    54. .nm_priv = ((void *)0),
    55. .reserved = {0},
    56. };
    57. extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
    58. {
    59. napi_module_register(&demoModule);
    60. }
  • 接口声明

    收起
    自动换行
    深色代码主题
    复制
    1. // index.d.ts
    2. export const saveOrReplaceObject: <T>(val: T) => void;
    3. export const queryObject: <T>() => T;
    4. export const releaseObject: () => void;
  • ArkTS代码示例

    收起
    自动换行
    深色代码主题
    复制
    1. // index.ets
    2. import testNapi from "libentry.so"
    3. const makeTest = <T>(val: T) => {
    4. testNapi.saveOrReplaceObject(val);
    5. const result = testNapi.queryObject<T>();
    6. testNapi.releaseObject();
    7. if (val !== result) {
    8. throw new Error("result not equals to input");
    9. }
    10. }
    11. // 预期以下调用无异常
    12. makeTest(0);
    13. makeTest("0");
    14. makeTest(true);
    15. makeTest(BigInt("0"));
    16. makeTest([]);
    17. makeTest(new Object());
    18. makeTest(undefined);
    19. makeTest(null);
在 指南 中进行搜索
请输入您想要搜索的关键词