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

发布时间:2026/10/19 10:38:33
鸿蒙 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.tsexport 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: Arraynumber) { 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.tsexport 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.tsexport const calculateArea: (width: number, height: number) number; // napi_create_functionArkTS侧示例hilog.info(0x0000, testTag, create_function:%{public}d, testNapi.calculateArea(1.2, 4));五、注意事项注意事项说明argv长度napi_call_function传入的argv长度必须argc数量argv初始化每个元素都应初始化为nullptrthis指针napi_call_function需要传入this对象通常为global或指定对象参数获取napi_get_cb_info中argv可传nullptr先获取参数数量

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询