首页 > 其他分享 >#星计划# OpenHarmony NAPI技术简介

#星计划# OpenHarmony NAPI技术简介

时间:2024-01-18 11:05:15浏览次数:45  
标签:OpenHarmony 简介 nullptr js NAPI env hello napi

作者:廖家兴

简介

NAPI(Native API)是OpenHarmony系统中的一套原生模块扩展开发框架,它基于Node.js N-API规范开发,为开发者提供了JavaScript与C/C++模块之间相互调用的交互能力。可以在NodeJs官网查看各种NAPI接口定义说明。

NAPI作用

  • OpenHarmony系统可以将框架层丰富的模块功能通过js接口开放给上层应用使用
  • 上层应用也可以将一些对性能有要求或者需要调用到系统侧框架的功能使用C/C++封装实现,下探到系统层以提高运行效率

NAPI在系统中的位置

NAPI在OpenHarmony中属于ArkUI框架的一部分。

NAIP框架代码在 foundation\arkui\napi\ 路径下。总体上可分为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应用开发模版。

更多原创内容请关注:中软国际 HarmonyOS 技术团队 入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。

想了解更多关于鸿蒙的内容,请访问:​

​51CTO鸿蒙开发者社区

​https://ost.51cto.com/#bkwz​

标签:OpenHarmony,简介,nullptr,js,NAPI,env,hello,napi
From: https://blog.51cto.com/harmonyos/9304132

相关文章

  • Git必知必会基础(01):Git简介
     本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/10854115.html补充:什么是版本控制系统简介版本控制系统,VersionControlSystem,简称为VCS,是—种记录—个或多个文件的内容变化,以便将来查阅特定版本的内容变化情况的系统。简单来说,就是用来保存文件内容变更记录......
  • 《eslint篇》ESLint简介
    参考链接:https://blog.csdn.net/whl0071/article/details/126544501简介ESLint是一个用来识别ECMAScript并且按照规则给出报告的代码检测工具,使用它可以避免低级错误和统一代码的风格。如果每次在代码提交之前都进行一次eslint代码检查,就不会因为某个字段未定义为undefined或n......
  • SFCGAL简介
    SFCGALisaC++wrapperlibraryaround CGAL withtheaimofsupportingISO 19107:2013and OGCSimpleFeaturesAccess1.2 for3Doperations.SFCGALprovidesstandardcompliantgeometrytypesandoperations,thatcanbeaccessedfromits C or C++ APIs.......
  • 《c++lib篇》lib简介
    lib简介原文链接:https://blog.csdn.net/ucliaohh/article/details/128324744静态链接库,静态链接1、静态链接库,有lib、h二个文件。lib包含函数代码本身,在编译时直接将代码加入程序当中。(这种方式不是很灵活,因为lib被编译到.exe中,写出的程序体积大,但是只需要发布exe即可,不需要dl......
  • 激光雷达技术、数据和应用简介
    激光雷达技术、数据和应用简介介绍光探测和测距(激光雷达)测绘是一种公认的生成关于地球形状和表面特征的精确和直接地理参考空间信息的方法。激光雷达测绘系统及其赋能技术的最新进展使科学家和测绘专业人员能够以比以往任何时候都更高的精度、精度和灵活性,在大范围内检查自然和......
  • (1)Powershell简介
    (1)Powershell简介本文会包含以下三个知识点什么是Powershell?学习Powershell有什么好处?学习Powershell需要哪些条件?什么是Powershell?Powershell(WindowsPowershell)是Microsoft为Windows设计的新的命令行程序,这个Windows内置的命令行shell包括交互式提示和脚本环......
  • 人工智能选股框架及经典算法简介
    人工智能和机器学习并不神秘人工智能和机器学习方法并不神秘,其本质是以数理模型为核心工具,结合控制论、认知心理学等其它学科的研究成果,最终由计算机系统模拟人类的感知、推理、学习、决策等功能。理解常用的机器学习算法,有助于澄清对人工智能的种种误解和偏见,帮助我们更清晰地认......
  • go-micro 简介
    1.go-micro简介GoMicro是一个插件化的基础框架,基于此可以构建微服务,Micro的设计哲学是可插拔的插件化架构在架构之外,它默认实现了consul作为服务发现(2019年源码修改了默认使用mdns),通过http进行通信,通过protobuf和json进行编解码2.go-micro的主要功能服务发现:自动服务注......
  • Bash shell中四种算术运算方式的区别与联系简介
    在bashshell中,整数的运算也会偶尔遇到。为了彻底弄清其中的奥秘,我们通过实例验证的方式来探索一下常见的四种运算中的区别与联系。实例验证之前,我们来定义一组变量,并对其赋值:[root@GeekDevOps~]#a=9;b=13;c=-1;d=+4;e=7.2[root@GeekDevOps~]#echo$a$b$c$d$e913-1+4......
  • 存储进阶:RAID简介
    一、什么是RAID磁盘阵列(RedundantArraysofIndependentDisks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。也就是说把多个磁盘组合起来,组合一个磁盘阵列组,使得性能大幅提高。磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效......