HarmonyOS鸿蒙Next中如何实现在ohpm的NAPI侧调用ArkTS中的纯函数方法或者类的静态方法

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

HarmonyOS鸿蒙Next中如何实现在ohpm的NAPI侧调用ArkTS中的纯函数方法或者类的静态方法 我想开发一个公共ohpm,该ohpm引用了一个本地so库(位置在ohpm根目录的main/cpp下),该 ohpm 以后需要发布到OpenHarmony三方仓库,我要如何实现在NAPI中调用该 ohpm 包中其他模块的纯函数或类的静态方法。

5 回复
  1. index.d.ts文件中,提供ArkTS侧的接口方法。
export const nativeCallArkTS: (a: object) => number;
  1. 实现Native侧的NativeCallArkTS接口,具体代码如下:
static napi_value NativeCallArkTS(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); 

    // 创建一个int,作为ArkTS的入参 
    napi_value argv = nullptr;     
    napi_create_int32(env, 2, &argv ); 

    // 调用传入的callback,并将其结果返回 
    napi_value result = nullptr; 
    napi_call_function(env, nullptr, args[0], 1, &argv, &result); 
    return result; 
}
  1. 在ArkTS侧,通过nativeModule.nativeCallArkTS()方法传入方法。
// entry/src/main/ets/pages/Index.ets 
// 通过import的方式,引入Native能力。 
import nativeModule from 'libentry.so' 
 
@Entry 
@Component 
struct Index { 
  @State message: string = 'Test Node-API nativeCallArkTS result: '; 
  build() { 
    Row() { 
      Column() { 
        // 调用nativeCallArkTS方法,对应到Native的NativeCallArkTS,在Native调用ArkTS function。 
        Text(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            this.message += nativeModule.nativeCallArkTS((a: number) => { 
                return a * 2; 
            }); 
          }) 
      }
      .width('100%') 
    } 
    .height('100%') 
  } 
}

参考文档:

更多关于HarmonyOS鸿蒙Next中如何实现在ohpm的NAPI侧调用ArkTS中的纯函数方法或者类的静态方法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个方案不符诉求,原始诉求是在NAPI中直接使用ArkTS中导出的方法或者类,而不是通过回调的方式实现。api_load_module 可以加载 ArkTS 模块,然后在 NAPI 中调用 ArkTS 中定义好的方法或者类静态方法,这种方案要在 ohpm 中如何应用呢?

Native侧如何获取ArkTS侧Object对象及其成员变量:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V14/faqs-ndk-42-V14

这个里面有直接调方法的,

在HarmonyOS鸿蒙Next中,通过ohpm的NAPI侧调用ArkTS中的纯函数方法或类的静态方法,可以通过以下步骤实现:

  1. 定义ArkTS方法:在ArkTS中定义纯函数或类的静态方法。例如:
export function add(a: number, b: number): number {
    return a + b;
}

export class MathUtils {
    static multiply(a: number, b: number): number {
        return a * b;
    }
}
  1. 生成NAPI绑定:使用napi工具生成ArkTS方法的NAPI绑定。首先,确保安装了napi工具,然后运行:
napi bind --target=arkts --output=bindings
  1. 在NAPI侧调用ArkTS方法:在NAPI侧的C++代码中,通过生成的绑定调用ArkTS方法。例如:
#include "bindings.h"

napi_value CallAdd(napi_env env, napi_callback_info info) {
    napi_value result;
    napi_call_function(env, nullptr, bindings::add, 2, args, &result);
    return result;
}

napi_value CallMultiply(napi_env env, napi_callback_info info) {
    napi_value result;
    napi_call_function(env, nullptr, bindings::MathUtils::multiply, 2, args, &result);
    return result;
}
  1. 注册NAPI方法:将NAPI方法注册到模块中,以便在ArkTS中调用。例如:
napi_value Init(napi_env env, napi_value exports) {
    napi_property_descriptor desc[] = {
        { "callAdd", nullptr, CallAdd, nullptr, nullptr, nullptr, napi_default, nullptr },
        { "callMultiply", nullptr, CallMultiply, nullptr, nullptr, nullptr, napi_default, nullptr }
    };
    napi_define_properties(env, exports, 2, desc);
    return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

通过以上步骤,可以在ohpm的NAPI侧调用ArkTS中的纯函数方法或类的静态方法。

在HarmonyOS鸿蒙Next中,通过ohpm的NAPI调用ArkTS中的纯函数或类的静态方法,可以使用napi_call_function接口。首先在ArkTS中定义纯函数或静态方法,然后在NAPI侧使用napi_get_named_property获取函数对象,再通过napi_call_function进行调用。确保函数参数和返回值类型正确匹配,以实现跨语言调用。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!