NAPI(Native API)是OpenHarmony系统中的一套原生模块扩展开发框架,它基于Node.js N-API规范开发,为开发者提供了JavaScript与C/C++模块之间相互调用的交互能力。可以在NodeJs官网查看各种NAPI接口定义说明。
NAPI作用
- OpenHarmony系统可以将框架层丰富的模块功能通过js接口开放给上层应用使用
- 上层应用也可以将一些对性能有要求或者需要调用到系统侧框架的功能使用C/C++封装实现,下探到系统层以提高运行效率
NAPI在系统中的位置
NAPI在OpenHarmony中属于ArkUI框架的一部分。
NAIP框架代码在 foundationarkuinapi 路径下。总体上可分为interface、native_engine 和 xxxManager 三部分。
interface 目录为NAPI开发者提供了各种常用功能的API接口及宏定义。
native_engine 目录是NAPI框架的核心部分,interface目录提供的接口对应的功能都在这里实现。C++与Js之间的调用交互最终是要依托JS引擎来完成的,针对系统支持的不同JS引擎,在impl目录中也有对应的4种实现(ark, jerryscript, quickjs, v8)。
此外,还有几个Manager目录,分别负责模块注册、引用对象管理、作用域管理等专项功能。
NAPI使用
假设我们在框架测使用c/c++实现了hello模块,该模块提供了一个接口int hello(const std::string &s),传入一个字符串,打印该字符串。
要使用js调用到如上hello接口,需要解决如下几个问题
- 模块注册(import的模块名称hello,是怎么对应到实际的c++lib库的?) — Module Manager。
- 方法名映射(js调用的hello方法,是怎么对应到native的C/C++的方法的?) — Native Engine。
- 数据传递与转换(js传入的入参、得到的返回结果,需要转换成C/C++代码可以操作的数据类型)
c++方法具体实现:
// hello.h
#ifndef HELLO_H
#define HELLO_H
#include < string >
namespace OHOS {
namespace hello {
int hello(const std::string &s);
} // namespace add
} // namespace OHOS
#endif // HELLO_H
// hello.cpp
#include < iostream >
#include "hello.h"
namespace OHOS {
namespace hello {
int hello(const std::string &s);
{
std::cout < < s < < endl;
return 0;
}
} // namespace add
} // namespace OHOS
此时需要为js提供调用,需要为该接口进行NAPI封装
// helloNapi.cpp
#include "napi/native_api.h"
#include "hello.h"
static napi_value Hello(napi_env env, napi_callback_info info)
{
// 根据环境变量获取参数
// js参数个数
size_t argc = 1;
// 参数定义
napi_value argv[1] = { 0 };
// 入参变量获取
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
// 获取入参的类型
napi_valuetype valueType = napi_undefined;
napi_typeof(env, argv[0], &valueType);
// js类型的入参值转换为C/C++可以操作的数据类型
char value[VALUE_BUFFER_SIZE] = { 0 };
size_t valueLen = 0;
napi_get_value_string_utf8(env, argv[0], value, VALUE_BUFFER_SIZE, &valueLen);
std::string s = value;
// 调用hello接口
int ret = hello(s);
// C/C++数据类型转换为JS数据类型并返回给应用层
// JS字符串对象
napi_value result = nullptr;
retult = napi_create_int32(env, ret, &result);
//返回JS对象
return result;
}
// 方法名映射
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
napi_property_descriptor desc[] = {
{ "hello", nullptr, Hello, nullptr, nullptr, nullptr, napi_default, nullptr }
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END
// nm_modname为提供给应用侧调用的模块名称
static napi_module helloModule = {
.nm_version =1,
.nm_flags = 0,
.nm_filename = nullptr,
.nm_register_func = Init,
.nm_modname = "hello",
.nm_priv = ((void*)0),
.reserved = { 0 },
};
// 注册模块
extern "C" __attribute__((constructor)) void RegisterNative_helloModule(void)
{
napi_module_register(&helloModule);
}
编译生成假设为hello.z.so
js调用代码
// hello.ets
// 引入hello napi模块
import testNapi from '@ohos.hello'
// 调用js接口 hello
testNapi.hello("hello world")
以上就是简单的NAPI简介以及简单的一个NAPI应用开发模版。更多鸿蒙开发内容,前往主页:

审核编辑 黄宇
-
鸿蒙
+关注
关注
60文章
3018浏览量
46172 -
OpenHarmony
+关注
关注
33文章
3974浏览量
21354
发布评论请先 登录
“薪火杯”2026年度OpenHarmony领先商用实践案例征集工作正式启动
技术融合,生态共建——MTSTAR满天星信息发布系统拥抱OpenHarmony
融合AI的OpenHarmony应用软件开发:ai学习自律辅助软件
触觉智能Purple Pi OH开发板率先适配OpenHarmony6.0 Release,鸿蒙明星开发板
【置顶公告】视美泰开源鸿蒙系列产品业务咨询与商务合作通道正式开启!
开源鸿蒙6.0 Release版本重磅发布
触觉智能RK3576开发板OpenHarmony开源鸿蒙系统USB控制传输功能示例
视美泰受邀出席2025鸿蒙生态大会,共绘OpenHarmony商业显示新图景
开鸿开发板深度体验:从开源鸿蒙开发到AI场景实践
四川大学OpenHarmony技术俱乐部正式揭牌成立
触觉智能鸿蒙开发板率先通过OpenHarmony5.0认证(生态产品兼容性证书)
全志科技亮相OpenHarmony开发者大会2025
利尔达RedCap模组通过OpenHarmony 生态兼容性测评!
全新开源鸿蒙电脑开鸿Bot系列即将上市,搭载的KaihongOS桌面版四大体验引期待
鸿蒙OpenHarmony NAPI技术-基础学习
评论