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应用开发模版。更多鸿蒙开发内容,前往主页:

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    55

    文章

    1641

    浏览量

    42123
  • OpenHarmony
    +关注

    关注

    23

    文章

    3322

    浏览量

    15161
收藏 人收藏

    评论

    相关推荐

    鸿蒙开发学习:【OpenHarmony HAR】

    OpenHarmony js/ts三方库使用的是OpenHarmony静态共享包,即HAR(Harmony Archive),可以包含js/ts代码、c++库、资源和配置文件。通过HAR,可以实现
    的头像 发表于 03-18 16:27 263次阅读

    薪资高、青春饭,是不是程序员=青楼?

    模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术Napi组件、OpenHarmony内核、Harmony南向开发、
    发表于 03-06 21:32

    深圳市24年,实现鸿蒙原生应用数占全国总量10%以上

    、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点 高清完整版与笔记请加→mau123789是卫呀 针对鸿蒙成长路线打造的
    发表于 03-04 21:42

    鸿蒙实战项目开发:【短信服务】

    ://gitee.com/openharmony/applications_app_samples.git git pull origin master ​ 最后呢,很多开发朋友不知道需要学习那些鸿蒙
    发表于 03-03 21:29

    鸿蒙这么大声势,为何迟迟看不见岗位?最新数据来了

    。 话不多说,我们直接看详细资料鸿蒙OpenHarmony学习手册(共计1236页)与鸿蒙OpenHarmony )开发入门教学视频
    发表于 02-29 20:53

    鸿蒙NAPI 框架生成工具实现流程

    NAPI 框架生成工具 可以根据用户指定路径下的 ts(typescript)接口文件一键生成 NAPI 框架代码、业务代码框架、GN 文件等。在开发 JS 应用与 NAPI 间接口时,底层框架
    的头像 发表于 02-28 17:00 249次阅读
    【<b class='flag-5'>鸿蒙</b>】<b class='flag-5'>NAPI</b> 框架生成工具实现流程

    学习鸿蒙背后的价值?星河版开放如何学习

    鸿蒙原生内核。 实现了AI框架、大模型、设计系统、编程框架、编程语言、编译器等全栈自研,有核心技术、全栈能力、底座和生态,是真正的操作系统,而非安卓套皮。关键是有了鸿蒙星河版本也就意味着国内市场有了
    发表于 02-22 20:55

    OpenHarmonyNAPI 框架介绍

    环境中的 JS 变量与方法。 OpenHarmony 中的 NAPI OpenAtom OpenHarmony(以下简称 “OpenHarmony”)应用层基于 javascript
    的头像 发表于 02-01 17:34 316次阅读
    <b class='flag-5'>OpenHarmony</b> 之 <b class='flag-5'>NAPI</b> 框架介绍

    盘点那些硬件+项目学习套件:Hi3861鸿蒙开发板及入门常见问题解答

    华清远见20岁了~过去3年里,华清远见研发中心针对个人开发板业务,打造了多款硬件+项目学习套件,涉及STM32单片机、嵌入式、物联网、人工智能、鸿蒙、ESP32、阿里云IoT等多技术方向。 今天我们
    发表于 02-01 16:55

    鸿蒙不再兼容安卓,那么鸿蒙开发者是否会大增?

    ? 应届生/计算机专业:通过学习鸿蒙新兴技术,入行互联网,未来高起点就业。 0基础转型:提前布局新方向,抓住风口。自我提升,获得更多就业机会。 技术提升/进阶跳槽:发展瓶颈期,提升职场
    发表于 01-31 22:17

    鸿蒙开发OpenHarmony组件复用案例

    ) } }, item => item) } } } 本文主要是对鸿蒙开发基础当中的OpenHarmony技术组件复用示例, 更多鸿蒙开发
    发表于 01-15 17:37

    免费学习鸿蒙(HarmonyOS)开发,一些地址分享

    互联网软件工程》课程的核心内容,替换了原有的安卓开发课程。鸿蒙替代安卓成为高校软件“必选课”,受学生热烈追捧。 那么高校开设鸿蒙班,我们社会上的程序员要怎么去学习鸿蒙
    发表于 01-12 20:48

    教程分享!OpenHarmonyNAPI框架介绍

    是 C++语言实现的,这些接口可以帮助 C++代码创建 JS 变量,或访问 JavaScript 运行环境中的 JS 变量与方法。 OpenHarmony 中的 NAPI OpenAtom OpenHarmony(以下简称“
    的头像 发表于 11-30 12:15 687次阅读
    教程分享!<b class='flag-5'>OpenHarmony</b>之<b class='flag-5'>NAPI</b>框架介绍

    OpenHarmonyNAPI框架介绍

    张志成 诚迈科技高级技术专家 NAPI 是什么 NAPI 的概念源自 Nodejs,为了实现 javascript 脚本与 C++库之间的相互调用,Nodejs 对 V8 引擎的 api 做了一层
    发表于 11-23 15:36

    Qt For OpenHarmony

    专家角色,负责图形框架研究院的技术管理工作。 内容来源 第一届开放原子开源基金会OpenHarmony技术峰会——生态与互联分论坛 ​ 正 文 内 容 在全球超过70个行业,8000家公司,100万
    发表于 09-15 15:39