当前位置: 首页 > news >正文

鸿蒙 NDK开发:函数创建与调用(十二)

NDK开发中,函数操作是跨语言交互的核心能力。Node-API提供了3个关键接口用于获取函数调用信息、调用ArkTS函数和创建可在ArkTS中调用的函数。

一、函数

函数是一种非常重要的编程概念,可以执行特定的任务或操作、提高代码的可读性、把复杂任务简化、提高代码复用性以及支持代码的组织与管理。

二、核心接口

接口描述
napi_get_cb_info从给定的callback info中获取有关调用的参数信息和this指针
napi_call_function在Node-API模块中对ArkTS侧函数进行调用
napi_create_function将C/C++函数创建为可在ArkTS中调用的函数

三、使用示例

3.1 napi_get_cb_info

获取有关函数调用的详细信息,包括参数、参数个数和this指针。

cpp部分代码
#include "napi/native_api.h" // 获取ArkTS侧入参的参数信息 static napi_value GetCbArgs(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); return args[0]; } // 获取ArkTS侧入参的参数个数 static napi_value GetCbArgQuantity(napi_env env, napi_callback_info info) { size_t argc = 0; napi_value result = nullptr; napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr); napi_create_int32(env, argc, &result); return result; } // 获取ArkTS侧this参数 static napi_value GetCbContext(napi_env env, napi_callback_info info) { napi_value thisArg = nullptr; napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, nullptr); return thisArg; }
接口声明(index.d.ts)
export const getCbArgs: <T>(arg: T) => T; // napi_get_cb_info export const getCbArgQuantity: (str: string, num: number) => number; export const getCbContext: () => Object;
ArkTS侧示例
import { hilog } from '@kit.PerformanceAnalysisKit'; import testNapi from 'libentry.so'; function summation(arr: Array<number>) { let sum: number = 0; for (let i = 0; i < arr.length; i++) { sum += arr[i]; } return sum; } const str = 'message'; const arr = [0, 1, 2, 3, 4, 5]; const num = 526; class Student { name: string; age: number; score: number; constructor(name: string, age: number, score: number) { this.name = name; this.age = age; this.score = score; } } let student = new Student('Alice', 18, 100); // 获取参数 hilog.info(0x0000, 'testTag', 'get string arg:%{public}s', testNapi.getCbArgs(str)); hilog.info(0x0000, 'testTag', 'get array arg:%{public}s', testNapi.getCbArgs(arr).toString()); hilog.info(0x0000, 'testTag', 'get num arg:%{public}d', testNapi.getCbArgs(num)); hilog.info(0x0000, 'testTag', 'get object arg:%{public}s', JSON.stringify(testNapi.getCbArgs(student))); hilog.info(0x0000, 'testTag', 'get function arg:%{public}d', testNapi.getCbArgs(summation(arr))); // 获取参数个数 hilog.info(0x0000, 'testTag', 'get arg quantity:%{public}d', testNapi.getCbArgQuantity(str, num)); // 获取上下文 hilog.info(0x0000, 'testTag', 'get thisArg:%{public}s', testNapi.getCbContext().toString());

3.2 napi_call_function

在C/C++侧对ArkTS函数进行调用。

注意事项napi_call_function传入的argv的长度必须大于等于argc声明的数量,并且每个元素都应初始化为nullptr。

cpp部分代码
// 在全局上下文中调用ArkTS函数 static napi_value CallFunction(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value argv[1] = {nullptr}; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); // 获取全局对象作为this入参 napi_value global = nullptr; napi_get_global(env, &global); napi_value result = nullptr; // argv长度必须>=argc数量,且每个元素都初始化为nullptr napi_call_function(env, global, argv[0], argc, argv, &result); return result; } // 在指定对象上下文中调用ArkTS函数 static napi_value ObjCallFunction(napi_env env, napi_callback_info info) { size_t argc = 2; napi_value argv[2] = {nullptr}; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); napi_value result = nullptr; // 第一个参数是this对象,第二个参数是要调用的函数 napi_call_function(env, argv[0], argv[1], argc, argv, &result); return result; }
接口声明(index.d.ts)
export const callFunction: (func: Function) => number; // napi_call_function export const objCallFunction: (obj: Object, func: Function) => number;
ArkTS侧示例
function returnNumber() { return 10; } class Person { age(): number { return 11; } } const person = new Person(); hilog.info(0x0000, 'testTag', 'call_function:%{public}d', testNapi.callFunction(returnNumber)); hilog.info(0x0000, 'testTag', 'call_function:%{public}d', testNapi.objCallFunction(person, person.age));

3.3 napi_create_function

将一个C/C++函数包装为可在ArkTS中调用的函数,并返回一个表示该函数的napi_value。

cpp部分代码
// 计算矩形面积 static napi_value CalculateArea(napi_env env, napi_callback_info info) { size_t argc = 2; napi_value args[2] = {nullptr}; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); double width = 0; napi_get_value_double(env, args[0], &width); double height = 0; napi_get_value_double(env, args[1], &height); napi_value area = nullptr; napi_create_double(env, width * height, &area); return area; }
接口声明(index.d.ts)
export const calculateArea: (width: number, height: number) => number; // napi_create_function
ArkTS侧示例
hilog.info(0x0000, 'testTag', 'create_function:%{public}d', testNapi.calculateArea(1.2, 4));

五、注意事项

注意事项说明
argv长度napi_call_function传入的argv长度必须>=argc数量
argv初始化每个元素都应初始化为nullptr
this指针napi_call_function需要传入this对象(通常为global或指定对象)
参数获取napi_get_cb_info中argv可传nullptr先获取参数数量
http://www.jsqmd.com/news/1108177/

相关文章:

  • 科创半导体ETF华夏上半年涨幅居全市场ETF第二:硬科技资产重估推升配置热度
  • 5大核心功能:QKeyMapper打造Windows终极按键映射解决方案
  • 3分钟将手机变身高清摄像头:DroidCam OBS插件完全指南
  • 机器学习驱动的光污染实时监测与治理系统
  • 终极Mac窗口管理神器:Topit窗口置顶工具完整指南
  • 计算机语言发展史
  • 3步实现设计到动画的无缝转换:AEUX如何重构创意工作流程
  • 别再手动启虚拟机了!VMware自动启动配置必须在今晚完成——否则下次计划外宕机将导致RTO超47分钟
  • VMware跑macOS不再玄学(2024最新兼容性实测版):支持Ventura/Sonoma/Monterey全系镜像部署
  • 如何在macOS上使用Topit窗口置顶工具:5分钟快速提升工作效率300%
  • Altair Simlab 2026 下载安装教程 专业多学科仿真CAE软件下载安装步骤
  • APK和AAB有什么区别?为什么要从APK切换到AAB?
  • 【限时技术白皮书】VMware加密虚拟机生产环境落地 checklist(附2024最新KB补丁编号+ESXi 8.0 U2验证清单)
  • PCF80空间单细胞蛋白组在母胎界面研究中的应用
  • 内核设备拒绝响应?VMware虚拟化启动失败的7种真实日志特征,附dmesg+modinfo精准诊断清单
  • CAU校园网接路由器(备忘)
  • 抖音无水印下载终极解决方案:三步掌握高效批量下载技术
  • 【VMware音频失效黄金72小时】:从vSphere 7.0到8.0U2,6类声卡兼容性断点与热修复补丁清单
  • VMware虚拟机UEFI启动失败诊断树(附12个精准日志关键词+对应解决方案,95%问题5分钟定位)
  • WaveTools:解锁《鸣潮》120帧的终极优化方案
  • 中文论文参考文献排版终极指南:GB/T 7714标准完全实现方案
  • 轮廓仪选购预算参考:主流型号价格解析
  • 高效解锁Mediatek设备:mtkclient-gui专业指南
  • 30秒搞定文档下载:告别付费墙与繁琐验证的浏览器脚本神器
  • 【VMware与Hyper-V冲突终结指南】:20年虚拟化专家亲授5大底层冲突根源及秒级规避方案
  • 三步搞定网盘限速:开源直链助手让下载速度飞起来
  • 国内汽车锻件厂集中在哪些产区?
  • 时间漂移引发集群认证失败,日志报错“Clock skew detected”?VMware虚拟机时间不同步全链路排查手册,含vSphere 8.0最新补丁验证数据
  • VMware虚拟化双雄对决:Workstation vs ESXi——从开发测试到生产部署的7个决策红线(运维总监亲授)
  • 如何高效备份CSDN技术博客:三步实现永久离线保存