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