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

    文章

    2863

    浏览量

    45371
  • OpenHarmony
    +关注

    关注

    31

    文章

    3928

    浏览量

    20728
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

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

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

    DialogHub上线OpenHarmony开源社区,高效开发鸿蒙应用弹窗

    “Gitee官网”,首页搜索“DialogHub”,快速下载集成,并参与代码贡献与问题反馈。共同提升鸿蒙应用的性能与体验。 未来华为也将持续携手生态伙伴共建创新,面向底座技术、通用能力、垂类行业等场景推出系列
    发表于 04-03 17:30

    鸿蒙北向开发OpenHarmony5.0 DevEco Studio开发工具安装与配置

    本文介绍OpenHarmony5.0 DevEco Studio开发工具安装与配置,鸿蒙北向开发入门必备!由触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,支持开源
    的头像 发表于 03-28 18:05 1351次阅读
    <b class='flag-5'>鸿蒙</b>北向开发<b class='flag-5'>OpenHarmony</b>5.0 DevEco Studio开发工具安装与配置

    【北京迅为】itop-3568 开发板openharmony鸿蒙烧写及测试-第2章OpenHarmony v3.2-Beta4版本测试

    【北京迅为】itop-3568 开发板openharmony鸿蒙烧写及测试-第2章OpenHarmony v3.2-Beta4版本测试
    的头像 发表于 03-05 10:53 889次阅读
    【北京迅为】itop-3568 开发板<b class='flag-5'>openharmony</b><b class='flag-5'>鸿蒙</b>烧写及测试-第2章<b class='flag-5'>OpenHarmony</b> v3.2-Beta4版本测试

    【北京迅为】itop-3568 开发板openharmony鸿蒙烧写及测试-第1章 体验OpenHarmony—烧写镜像

    【北京迅为】itop-3568 开发板openharmony鸿蒙烧写及测试-第1章 体验OpenHarmony—烧写镜像
    的头像 发表于 03-04 16:31 881次阅读
    【北京迅为】itop-3568 开发板<b class='flag-5'>openharmony</b><b class='flag-5'>鸿蒙</b>烧写及测试-第1章 体验<b class='flag-5'>OpenHarmony</b>—烧写镜像

    鸿蒙北向开发OpenHarmony4.1 DevEco Studio开发工具安装与配置

    OpenHarmony4.1 DevEco Studio开发工具安装与配置,鸿蒙北向开发入门必备!
    的头像 发表于 02-07 17:35 1359次阅读
    <b class='flag-5'>鸿蒙</b>北向开发<b class='flag-5'>OpenHarmony</b>4.1 DevEco Studio开发工具安装与配置

    AKI跨语言调用库神助攻C/C++代码迁移至HarmonyOS NEXT

    ,真正做到所“键”即所得。 这一创新框架的出现,正是为了解决开发者在迁移C/C++项目到HarmonyOS NEXT时面临的核心痛点。传统的NAPI接口调用复杂,学习成本高,开发者需要耗费大量精力进行适配
    发表于 01-02 17:08

    OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

    本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程,触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙O
    的头像 发表于 12-30 10:08 1537次阅读
    <b class='flag-5'>OpenHarmony</b>源码编译后烧录镜像教程,RK3566<b class='flag-5'>鸿蒙</b>开发板演示

    2024 OpenHarmony年度技术分享会来啦,预约直播有好礼~

    电子发烧友联合开源鸿蒙技术专家、老师、开发者为大家带来OpenHarmony的最新技术进展、开发心得以及应用实践,共同推动OpenHarmony
    的头像 发表于 12-25 09:13 940次阅读
    2024 <b class='flag-5'>OpenHarmony</b>年度<b class='flag-5'>技术</b>分享会来啦,预约直播有好礼~

    2024 OpenHarmony年度技术分享会来啦,预约直播有好礼~

    联合开源鸿蒙技术专家、老师、开发者为大家带来OpenHarmony的最新技术进展、开发心得以及应用实践,共同推动OpenHarmony生态的
    发表于 12-25 09:10

    OpenHarmony怎么修改DPI密度值?触觉智能RK3566鸿蒙开发板演示

    开源鸿蒙OpenHarmony系统下,修改DPI密度值的方法,触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,Laval鸿蒙社区推荐开发板,已适配全
    的头像 发表于 12-24 11:46 1102次阅读
    <b class='flag-5'>OpenHarmony</b>怎么修改DPI密度值?触觉智能RK3566<b class='flag-5'>鸿蒙</b>开发板演示

    鸿蒙原生开源库ViewPool在OpenHarmony社区正式上线

    近日,由伙伴参与共建的鸿蒙原生开源库“ViewPool”在OpenHarmony社区正式上线。这个开发库是基于OpenHarmony技术孵化的成果,充分发挥了平台的
    的头像 发表于 12-20 14:44 855次阅读