0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙OpenHarmony NAPI技术-基础学习

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-01-19 16:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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接口,需要解决如下几个问题

  1. 模块注册(import的模块名称hello,是怎么对应到实际的c++lib库的?) — Module Manager。
  2. 方法名映射(js调用的hello方法,是怎么对应到native的C/C++的方法的?) — Native Engine。
  3. 数据传递与转换(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领先商用实践案例征集工作正式启动

    近年来,开放原子开源鸿蒙(简称“OpenHarmony”或“开源鸿蒙”)携手产业伙伴深耕千行百业,加速技术成果规模化商用落地,构建起全场景分布式智能生态。
    的头像 发表于 04-22 10:49 290次阅读

    技术融合,生态共建——MTSTAR满天星信息发布系统拥抱OpenHarmony

    技术融合,生态共建——MTSTAR满天星信息发布系统拥抱OpenHarmony在数字化浪潮席卷全球的今天,操作系统的自主可控已成为国家科技发展战略的重要基石。开放鸿蒙OpenHarmony
    的头像 发表于 12-04 17:59 1403次阅读
    <b class='flag-5'>技术</b>融合,生态共建——MTSTAR满天星信息发布系统拥抱<b class='flag-5'>OpenHarmony</b>

    融合AI的OpenHarmony应用软件开发:ai学习自律辅助软件

    *附件:ai study.zip*附件:融合AI的OpenHarmony应用软件开发:ai学习自律辅助软件.pdf 基于开源鸿蒙编写的ai辅助学习软件
    发表于 11-12 15:38

    触觉智能Purple Pi OH开发板率先适配OpenHarmony6.0 Release,鸿蒙明星开发板

    2025年9月19日,在官网上线开源鸿蒙OpenHarmony6.0Release仅13天,触觉智能宣布旗下PurplePiOH开发板成功完成OpenHarmony6.0Release系统适配。这一
    的头像 发表于 10-29 08:00 1074次阅读
    触觉智能Purple Pi OH开发板率先适配<b class='flag-5'>OpenHarmony</b>6.0 Release,<b class='flag-5'>鸿蒙</b>明星开发板

    【置顶公告】视美泰开源鸿蒙系列产品业务咨询与商务合作通道正式开启!

    设计。 生态解决方案整合智慧政务、智慧医疗、智慧园区、智慧教育、智慧安平、工业物联网等领域鸿蒙化系统集成与场景落地。 技术授权与联合创新OpenHarmony生态兼容性认证、技术培训及
    发表于 10-20 16:23

    开源鸿蒙6.0 Release版本重磅发布

    近日,在长沙国际会议中心举办的开源鸿蒙技术大会2025上,开放原子开源鸿蒙(即OpenAtom OpenHarmony,简称“开源鸿蒙”)项
    的头像 发表于 10-10 16:49 3103次阅读

    触觉智能RK3576开发板OpenHarmony开源鸿蒙系统USB控制传输功能示例

    本文介绍OpenHarmony开源鸿蒙系统的USB控制传输功能实现及相关代码示例,基于触觉智能RK3576开发板PurplePiOH2演示。OpenHarmony的USB通信介绍实现
    的头像 发表于 09-30 16:31 1804次阅读
    触觉智能RK3576开发板<b class='flag-5'>OpenHarmony</b>开源<b class='flag-5'>鸿蒙</b>系统USB控制传输功能示例

    视美泰受邀出席2025鸿蒙生态大会,共绘OpenHarmony商业显示新图景

    OpenHarmony)的创新解决方案惊艳亮相,以技术深度与落地实力引发行业关注。更有视美泰国产化事业部总经理柏威先生发表主题演讲,揭秘企业在开源鸿蒙领域的战略布局与技术突破。
    的头像 发表于 09-01 16:02 5731次阅读
    视美泰受邀出席2025<b class='flag-5'>鸿蒙</b>生态大会,共绘<b class='flag-5'>OpenHarmony</b>商业显示新图景

    开鸿开发板深度体验:从开源鸿蒙开发到AI场景实践

    开鸿开发板KaihongBoard-3588S-SBCKaihongBoard-3576-SBC体验开源鸿蒙能力学习开源鸿蒙开发●●●搭载KaihongOS
    的头像 发表于 07-03 17:03 1976次阅读
    开鸿开发板深度体验:从开源<b class='flag-5'>鸿蒙</b>开发到AI场景实践

    四川大学OpenHarmony技术俱乐部正式揭牌成立

    成立大会暨鸿蒙公开课”在四川大学望江校区成功举办。 嘉宾合影 四川大学副校长游劲松出席大会并致辞。他表示,四川大学始终关注科技发展的前沿动态,并积极投身相关领域的研究与探索。此次四川大学OpenHarmony技术俱乐部的成立标志
    的头像 发表于 06-16 16:20 1706次阅读
    四川大学<b class='flag-5'>OpenHarmony</b><b class='flag-5'>技术</b>俱乐部正式揭牌成立

    开源鸿蒙开发必备!OpenHarmony替换Full SDK全攻略

    本文介绍开源鸿蒙OpenHarmony替换FullSDK的方法,演示设备为触觉智能PurplePiOH鸿蒙开发板获取FullSD
    的头像 发表于 06-06 18:11 1026次阅读
    开源<b class='flag-5'>鸿蒙</b>开发必备!<b class='flag-5'>OpenHarmony</b>替换Full SDK全攻略

    触觉智能鸿蒙开发板率先通过OpenHarmony5.0认证(生态产品兼容性证书)

    触觉智能PurplePiOH鸿蒙开发板继4.1版本XTS认证火速出圈后,再次狂飙!成功通过OpenHarmony5.0ReleaseXTS认证,成为首批开放原子基金会生态产品之一。这一认证标志着其在
    的头像 发表于 06-06 17:54 1437次阅读
    触觉智能<b class='flag-5'>鸿蒙</b>开发板率先通过<b class='flag-5'>OpenHarmony</b>5.0认证(生态产品兼容性证书)

    全志科技亮相OpenHarmony开发者大会2025

    近日,OpenHarmony开发者大会 2025(OHDC.2025,以下简称“大会”)在深圳举办。大会正式发布了开源鸿蒙5.1 Release版本,举行了“开源鸿蒙应用技术组件共建启
    的头像 发表于 06-04 09:16 2395次阅读
    全志科技亮相<b class='flag-5'>OpenHarmony</b>开发者大会2025

    利尔达RedCap模组通过OpenHarmony 生态兼容性测评!

    。此次认证标志着该NR90模组在鸿蒙系统中的技术适配能力获得官方认可,为工业物联网、智能终端等设备快速融入鸿蒙生态提供了关键支持。本次认证由OpenHarmony兼容
    的头像 发表于 05-23 17:59 1780次阅读
    利尔达RedCap模组通过<b class='flag-5'>OpenHarmony</b> 生态兼容性测评!

    全新开源鸿蒙电脑开鸿Bot系列即将上市,搭载的KaihongOS桌面版四大体验引期待

    在国产操续受到关注的当下,一款面向开发者的全新开源鸿蒙学习系列产品引发热议。由深开鸿推出的,面向开源鸿蒙开发者开发与学习的开鸿Bot系列产品已开启预售,将在本月24日正式发售。它搭载
    的头像 发表于 05-21 17:47 1351次阅读
    全新开源<b class='flag-5'>鸿蒙</b>电脑开鸿Bot系列即将上市,搭载的KaihongOS桌面版四大体验引期待