鸿蒙-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开发者
 
 




















