鸿蒙-ArkTS和Native之间的交互使用4使用Node-API接口进行object相关开发

仿佛云烟
发布于 2025-6-28 16:46
浏览
0收藏

引言:

鸿蒙-ArkTS和Native之间的交互使用4使用Node-API接口进行object相关开发-鸿蒙开发者社区


使用Node-API接口进行object相关开发,处理ArkTS对象的基本操作的功能,例如创建对象、获取原型、冻结和密封对象,检查对象的类型等。这些操作是在处理ArkTS对象时非常常见的,提供了一种与ArkTS对象交互的方式。


Node-API接口主要用于操作和管理ArkTS对象:


接口

描述

napi_get_prototype

当需要获取一个ArkTS对象的原型时,可以使用这个接口。通过这个接口可以在C/C++中获取到这个原型对象。

napi_create_object

在Node-API模块中创建一个默认的ArkTS对象。

napi_object_freeze

当需要确保一个对象不会被修改时(immutable),可以使用这个接口来冻结该对象,使其属性不可更改。

napi_object_seal

类似于napi_object_freeze,napi_object_seal用于密封给定的对象,使其属性不可添加或删除,但可以修改属性的值。

napi_typeof

在处理传入的ArkTS值时,可以使用这个接口来获取其类型,以便进行相应的处理。

napi_instanceof

当需要在Node-API模块中确定一个对象是否为特定构造函数的实例时,可以使用这个接口。

napi_type_tag_object

可以将指针的特定值与ArkTS对象关联起来,这对于一些自定义的内部对象标记非常有用。

napi_check_object_type_tag

使用此接口可以检查给定的对象上是否关联了特定类型的标记。

napi_create_symbol

创建一个ArkTS Symbol对象。

napi_create_external

用于创建一个ArkTS外部对象,该对象可以用于将C/C++中的自定义数据结构或对象传递到ArkTS中,并且可以在ArkTS中访问其属性和方法。

napi_get_value_external

用于获得napi_create_external创建的绑定了外部数据的ArkTS值,此函数可以在ArkTS和C/C++之间传递数据。


napi_create_object


用于在Node-API模块中创建一个空的ArkTS对象。


#include "napi/native_api.h"


napi_value NewObject(napi_env env, napi_callback_info info)
{
    napi_value object = nullptr;
    // 创建一个空对象
    napi_create_object(env, &object);
    // 设置对象的属性
    napi_value name = nullptr;
    // 设置属性名为"name"
    napi_create_string_utf8(env, "name", NAPI_AUTO_LENGTH, &name);
    napi_value value = nullptr;
    // 设置属性值为"Hello from Node-API!"
    napi_create_string_utf8(env, "Hello from Node-API!", NAPI_AUTO_LENGTH, &value);
    // 将属性设置到对象上
    napi_set_property(env, object, name, value);
    return object;
}


接口声明


// index.d.ts
export const createObject: () => { name: string };


ArkTS侧示例代码


import hilog from '@ohos.hilog';
import testNapi from 'libentry.so';
try {
  const myObject = testNapi.createObject();
  hilog.info(0x0000, 'testTag', 'Test Node-API napi_create_object: %{public}s', myObject.name);
} catch (error) {
  hilog.error(0x0000, 'testTag', 'Test Node-API napi_create_object errorCode: %{public}s, errorMessage: %{public}s', error.code, error.message);
}


napi_get_prototype


可以获得给定ArkTS对象的prototype。


#include "napi/native_api.h"


static napi_value GetPrototype(napi_env env, napi_callback_info info)
{
    // 获取并解析传参
    size_t argc = 1;
    napi_value args[1] = {nullptr};
    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
    napi_value result = nullptr;
    // 获取此对象的原型对象,将结果返回到napi_value类型的变量result中
    napi_get_prototype(env, args[0], &result);
    return result;
}


接口声明


// index.d.ts
export const getPrototype: (object: Object) => Object;


ArkTS侧示例代码


import hilog from '@ohos.hilog';
import testNapi from 'libentry.so';
// 定义一个类
class Person {
  // 属性
  name: string;
  age: number;
  // 构造函数
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}
// 创建类的实例
const person = new Person('Alice', 30);
// 传入实例对象,获取该对象的原型
let applePrototype = testNapi.getPrototype(person);
// 判断通过testNapi.getPrototype()函数获取到的原型是不是apple的原型
// 在DevEco Studio 4.1及以后的版本中,由于ArkTS没有原型的概念,因此尝试进行原型赋值或相关操作时,将会触发错误提示'Prototype assignment is not supported (arkts-no-prototype-assignment)',以下代码需在ts文件中执行
if (applePrototype === Person.prototype) {
  hilog.info(0x0000, 'Node-API', 'get_prototype_success');
} else {
  hilog.info(0x0000, 'Node-API', 'get_prototype_fail');
}


  • 接口(API):接口定义了组件之间的交互协议,包括输入参数、输出结果以及可能的错误处理。通过接口,组件可以相互调用和交换数据,而无需了解对方的内部实现细节。
  • 对象(Object):在ArkTS,对象是一种复合数据类型,允许存储多个不同类型的值作为一个单独的实体。对象是属性和方法的集合。属性是与对象相关联的值,而方法则是对象可以执行的操作。


还有其他数据结构可以去开发文档上查看:​​Node-API使用指导-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者​



分类
收藏
回复
举报
回复
    相关推荐