HarmonyOS 鸿蒙Next:对象非基本类型,为自定义实例且含自定义属性

发布于 1周前 作者 gougou168 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:对象非基本类型,为自定义实例且含自定义属性 对象不是number,boolean这种基本类型的,是自定义的实例对象,里面还有自定义的属性

2 回复

一、构造函数绑定

JS与C++ 的class主要通过napi_wrap实现JS对象构造函数与C++进行绑定

JS侧创建对象

import demoTest from 'libdemoTest.so'

Button($r('app.string.createObject')).onClick(()=>{
  
    this.targetClass = new demoTest.classDemo(4, 5); // 创建JS 对象
  
    this.currentContent = `${this.targetClass.num1}, ${this.targetClass.num2}`

 }).margin({top: 20})

C++侧绑定JS构造函数

napi_value ClassBind::JsConstructor(napi_env env, napi_callback_info info)

{
    napi_value targetObj = nullptr;
    void *data = nullptr;
    size_t argsNum = 2;
    napi_value args[2] = {nullptr};

    // 获取构造函数入参
    napi_get_cb_info(env, info, &argsNum, args, &targetObj, &data);
    ClassBind *classBind = new ClassBind();
    napi_get_value_double(env, args[0], &classBind->a);
    napi_get_value_double(env, args[1], &classBind->b);

    // 设置返回JS对象属性num1, num2
    napi_set_named_property(env, targetObj, "num1", args[0]);
    napi_set_named_property(env, targetObj, "num2", args[1]);
    // 绑定JS对象与C++对象
    napi_wrap(
        env, targetObj, classBind, [](napi_env env, void *data, void *hint) {
            ClassBind *bind = (ClassBind *)data;
            delete bind;
            bind = nullptr;
        },
        nullptr, nullptr);
    return targetObj;
}

二、JS类绑定对应的方法

JS侧调用类中注册的方法

Button($r('app.string.classMethod')).onClick(()=>{
  
    this.currentContent = '' + this.targetClass.operator(2)

 }).margin({top: 20})

C++侧注册类对应的实现方法

napi_value ClassBind::JsOperate(napi_env env, napi_callback_info info)
{
    napi_value args[1] = {nullptr};
    size_t argsNum = 1;
    napi_value context = nullptr;

    // 获取context对象以及对应方法的入参
    napi_get_cb_info(env, info, &argsNum, args, &context, nullptr);
    ClassBind *classBind = nullptr;

    // 获取JS对象对应的C++ native对象
    napi_unwrap(env, context, (void **)&classBind);
    uint32_t operateType = 0;
    napi_get_value_uint32(env, args[0], &operateType);
    double result = 0;
    if (operateType == 0) {
        result = classBind->a + classBind->b;
    } else if (operateType == 1) {
        result = classBind->a * classBind->b;
    } else if (operateType == 2) {
        result = classBind->a - classBind->b;
    } else {
        if (classBind->b == 0) {
            result = 0;
        } else {
            result = classBind->a / classBind->b;
        }
    }
    napi_value res = nullptr;
    napi_create_double(env, result, &res);
    return res;
}

三、注册方法到JS侧

主要通过napi_define_class建立JS类与C++侧的映射关系,然后将对应的对象挂载到export上,具体实现如下所示:

EXTERN_C_START

static napi_value ExportFunc(napi_env env, napi_value exports) 
{
    OH_LOG_INFO(LOG_APP, "register c++ method to js engine");

    // 定义对象上的方法
    napi_property_descriptor classProp[] = {
        DECLARE_NAPI_FUNCTION("operator", ClassBind::JsOperate)
    };
    napi_value classBind = nullptr;
    const char *classBindName = "classBind";

    // 建立JS构造函数与C++方法的关联
    napi_define_class(env, classBindName, sizeof(classBindName), ClassBind::JsConstructor, nullptr, 1, classProp, &classBind);

    // 将JS Class挂载到import导入对象上
    napi_set_named_property(env, exports, "classBind", classBind);
    return exports;
}

EXTERN_C_END

更多关于HarmonyOS 鸿蒙Next:对象非基本类型,为自定义实例且含自定义属性的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,当涉及到对象非基本类型,且为自定义实例且含有自定义属性时,通常这些对象是通过类(Class)来定义的。鸿蒙系统支持面向对象编程,允许开发者定义自己的类以及类的属性(成员变量)和方法(成员函数)。

对于自定义对象,你需要做以下几点:

  1. 定义类:使用类关键字(如class,具体语法依赖于鸿蒙的编程语言规范,可能是类似于Java或C++的语法,但非Java或C++本身)来定义一个类。

  2. 声明属性:在类内部声明属性,这些属性可以是基本类型、其他对象类型或者数组等。

  3. 实例化对象:通过类的构造函数创建对象实例。

  4. 访问属性:通过对象实例访问其属性,通常使用点操作符(.)。

  5. 方法操作:可以在类中定义方法来操作这些属性,如设置值(setter)和获取值(getter)。

鸿蒙系统中,对象的管理(如内存分配和垃圾回收)通常由系统运行时环境负责,开发者无需手动管理。

如果在使用自定义对象及其属性时遇到问题,可能是类定义有误、属性访问方式不正确或者对象实例化失败等原因。检查这些方面通常可以解决问题。

如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html

回到顶部