HarmonyOS 鸿蒙Next 是否有demo可演示NAPI中js与c++方法调用互传结构体或类对象的使用方式

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

HarmonyOS 鸿蒙Next 是否有demo可演示NAPI中js与c++方法调用互传结构体或类对象的使用方式 有没有demo可以演示NAPI中js和c++方法调用互传结构体或者类对象的使用方式

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 是否有demo可演示NAPI中js与c++方法调用互传结构体或类对象的使用方式的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙Next 提供了NAPI(Native API)用于JavaScript与原生代码(如C++)之间的交互。关于NAPI中JavaScript与C++方法调用互传结构体或类对象的使用方式,HarmonyOS确实支持这种场景,但具体实现依赖于鸿蒙系统的NAPI框架和相关的绑定机制。

在HarmonyOS中,你可以通过NAPI定义特定的接口,使得JavaScript能够调用C++代码,并传递或接收结构体或类对象。这通常涉及到以下几个步骤:

  1. 定义结构体或类:在C++中定义需要传递的结构体或类。
  2. NAPI接口封装:使用NAPI提供的接口(如napi_define_propertiesnapi_create_object等)将C++结构体或类对象封装为JavaScript可识别的对象。
  3. 数据传递:在JavaScript中调用封装好的NAPI接口,实现与C++代码的交互,包括传递和接收封装好的结构体或类对象。

由于NAPI框架的复杂性和特定性,这里无法给出具体的代码示例。但你可以参考HarmonyOS官方文档或示例代码,了解如何定义和使用NAPI接口进行JavaScript与C++之间的数据传递。

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

回到顶部