HarmonyOS鸿蒙Next中如何实现在ohpm的NAPI侧调用ArkTS中的纯函数方法或者类的静态方法
HarmonyOS鸿蒙Next中如何实现在ohpm的NAPI侧调用ArkTS中的纯函数方法或者类的静态方法 我想开发一个公共ohpm,该ohpm引用了一个本地so库(位置在ohpm根目录的main/cpp下),该 ohpm 以后需要发布到OpenHarmony三方仓库,我要如何实现在NAPI中调用该 ohpm 包中其他模块的纯函数或类的静态方法。
- 在
index.d.ts
文件中,提供ArkTS侧的接口方法。
export const nativeCallArkTS: (a: object) => number;
- 实现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;
}
- 在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中的纯函数方法或类的静态方法,可以通过以下步骤实现:
- 定义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;
}
}
- 生成NAPI绑定:使用
napi
工具生成ArkTS方法的NAPI绑定。首先,确保安装了napi
工具,然后运行:
napi bind --target=arkts --output=bindings
- 在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;
}
- 注册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
进行调用。确保函数参数和返回值类型正确匹配,以实现跨语言调用。