通过本文您将熟悉:如何注册NAPI模块及接口。如何在ArkUI eTS代码中调用扩展的NAPI接口。full-SDK的替换。 }// 注册NAPI模块// 1.先定义NAPI模块,指定当前NAPI模块对应的模块名// 以及模块注册对外接口的处理函数,具体扩展的接口在该函数中声明// nm_modname: NAPI模块名称,对应 napi_value getHelloString(napi_env env, napi_callback_info info) { napi_value result; std::string napi_value registerFunc(napi_env env, napi_value exports){ static napi_property_descriptor desc[] );}napi_module_register(napi_module* mod)是ohos的NAPI组件提供的模块注册函数。
NAPI是什么? , napi_value* result); NAPI_EXTERN napi_status napi_create_uint32 napi_value* result); NAPI_EXTERN napi_status napi_create_int64(napi_env env, napi_value转C/C++NAPI提供了 napiget_value 开头的方法表示把 napi_value 转换成 C/C++ 类型,常见方法如下所示:int类型转换 NAPI_EXTERN napi_status napi_get_value_int32(napi_env env, napi_value
napi_value是NAPI中非常重要的数据结构,定义如下 typedef struct napi_value__* napi_value; 学过c语言的同学应该知道typedef是什么意思,他的作用就是定义类型别名 // 创建一个数组,对应js的数组 napi_status napi_create_array(napi_env env, napi_value* result) { *result = v8impl napi_set_element(env, ret, index, vlaue;) 接着看一下napi_set_element。 // 设置key对应的值,key是数字 napi_status napi_set_element(napi_env env, napi_value <stdio.h>typedef void* napi_value;int main(){ int a = 2; int *p = &a; napi_value ptr = (napi_value
NAPI 是内核网络子系统与网卡驱动之间的收包协作机制。网卡收到数据后先触发硬中断,驱动在中断处理函数中关闭中断并调用 napi_schedule,将处理延后到软中断上下文。
OpenHarmony 提供了 NAPI 框架用于实现 JS 和 C/C++ 互相调用的能力,DevEco Studio 默认支持创建 NAPI 应用,本节笔者简单介绍一下创建的默认 NAPI 工程的相关知识 NAPI工程创建DevEco Studio 默认支持创建 NAPI 工程,在 DevEco Studio 的菜单栏里依次点击 File -> New -> Create Project,如下图所示:在弹出选择工程模版对话框里 工程已经创建完毕,NAPI 工程结构如下图所示:NAPI工程简介NAPI 工程创建完后,在 entry 目录下多了一个 cpp 目录,该目录用来存放 cpp 的源码及相关配置文件,各文件说明如下:hello.cpp NAPI工程签名NAPI 项目目前只能在真机上验证,在真机上运行前需要添加签名,否则无法安装运行,依次点击DevEco Studio 的 File -> Project Structure,如下图所示: 工程,读者有个大致印象即可,后续笔者将继续介绍NAPI 的相关内容,敬请期待。
napi_value是NAPI中非常重要的数据结构,定义如下 typedef struct napi_value__* napi_value; 学过c语言的同学应该知道typedef是什么意思,他的作用就是定义类型别名 // 创建一个数组,对应js的数组 napi_status napi_create_array(napi_env env, napi_value* result) { *result = v8impl napi_set_element(env, ret, index, vlaue;) 接着看一下napi_set_element。 // 设置key对应的值,key是数字 napi_status napi_set_element(napi_env env, napi_value <stdio.h>typedef void* napi_value;int main(){ int a = 2; int *p = &a; napi_value ptr = (napi_value
上节笔者简单介绍了使用 DevEco Studio 创建的默认 NAPI 工程结构,本节笔者简单介绍一下 NAPI 工程下 cpp 目录的源码部分。 include <js_native_api_types.h>static napi_value Add(napi_env env, napi_callback_info info){ size_t 方法定义 EXTERN_C_START static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor 方法实现 static napi_value Add(napi_env env, napi_callback_info info) { // 获取 2 个参数,napi_value // 调用napi_create_double方法把 C++类型转换成 napi_value 类型 napi_value sum; napi_create_double(env
在三方库移植之NAPI开发1—Hello OpenHarmony NAPI一文中,笔者开发的是一个rom包的napi工程。该工程需要编译烧录固件,C ++的动态库会集成到开发板的ROM中。 在本篇文章中,笔者使用三方库移植之NAPI开发1—Hello OpenHarmony NAPI中一样的hellonapi.cpp和index.ets源码,通过IDE开发一个RAM包的NAPI工程(集成C 头文件,#include <string>static napi_value getHelloString(napi_env env, napi_callback_info info) { napi_value result; std::string words = "Hello OpenHarmony NAPI"; //NAPI_CALL(env, napi_create_string_utf8(env 总结:RAM包的NAPI工程和ROM包的NAPI工程的异同以下为个人总结,希望各位老师和同学批评指正动态库的命名方式的不同,RAM包的NAPI工程(通过IDE开发NAPI工程)使用的动态库libhellonapi.so
Init(napi_env env, napi_value exports) { napi_property_descriptor desc[] = { {"add stringType = napi_undefined; if (napi_ok ! (napi_ok ! (napi_ok ! static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor desc[]
Init(napi_env env, napi_value exports){ napi_property_descriptor desc[] = { { "add", nullptr napi_value args[1] = { nullptr }; if (napi_ok ! if (napi_ok ! = napi_typeof(env, args[0], &stringType)) { napi_throw_error(env, "-1001", "napi_typeof error" "[NAPI]"; // 8、把C++数据转成napi_value napi_value value = nullptr; const char* md5 = str.c_str();
NAPI是什么NAPI的概念源自Nodejs,为了实现javascript脚本与C++库之间的相互调用,Nodejs对V8引擎的api做了一层封装,称为NAPI。 它们之间需要一个桥梁来实现两种语言代码之间的相互调用,这个桥梁就是NAPI。这里可能有的小伙伴有疑问了:OpenHarmony的NAPI和NodeJs的NAPI是一回事吗? 是OpenHarmony版本的NAPI实现,想了解内部细节的可以从这里入手:创建一个简单的NAPI工程可以通过DevEco Studio的Native C++模板创建一个包含简单NAPI 实现的样例工程 该方法通过NAPI接口napi_module_register() 向JS引擎注册了一个 napi_module。然后是Init()方法。该方法实现了Add方法的注册。 .x/docs/api/n-api.html)C++程序链接NAPI库OpenHarmony的NAPI接口实现都封装在libace_napi.z.so中,C++程序编译时需链接此库。
注册napi模块先定义一个模块,对应结构体为napi_module,指定当前NAPI模块对应的模块名以及模块注册对外接口的处理函数,具体扩展的接口在该函数中声明,后面说明。 模块定义好后,调用NAPI提供的模块注册函数napi_module_register(napi_module* mod)函数注册到系统中。 ,napi通过napi_define_properties接口将napi_property_descriptor结构体中的2个接口绑定在一起,并通过exports变量对外导出,使应用层可以调用add方法 static napi_value Init(napi_env env, napi_value exports){ napi_property_descriptor desc[] = { ;}接口实现以下为getHelloString接口业务实现代码:static napi_value getHelloString(napi_env env, napi_callback_info info
功能描述napi_load_module_with_info接口的功能是进行模块的加载,当模块加载出来之后,可以使用函数napi_get_property获取模块导出的变量,也可以使用napi_get_named_property loadModule(napi_env env, napi_callback_info info) { napi_value result; //1. static napi_value loadModule(napi_env env, napi_callback_info info) { napi_value result; //1. 使用napi_load_module_with_info加载模块@ohos.hilog napi_value result; napi_status status = napi_load_module_with_info ; napi_value b; napi_create_int32(env, 2, &a); napi_create_int32(env, 3, &b); napi_value args[2]
笔者在上一节讲 napi_module_register() 中讲到过赋值,源码如下所示:NAPI_EXTERN void napi_module_register(napi_module* mod){ napi_env env, napi_value exports);> > typedef napi_value (*RegisterCallback)(napi_env, napi_value);它们都接收两个参数 :一个 napi_env 类型的 env 和一个 napi_value 类型的 exports,并返回一个 napi_value 类型的值,所以它们的函数签名是完全相同的,因此一个 napi_addon_register_func env, napi_value exports) { // 创建一个napi_property_descriptor数组,napi_property_descriptor的每一项只配置了 () 方法,napi_define_properties() 方法源码如下所示:NAPI_EXTERN napi_status napi_define_properties(napi_env env,
笔者在前 6 小结讲述了NAPI 的基本使用,包括同步和异步实现,本节笔者从源码的角度简单讲解一下NAPI 的加载流程,源码版本为 ArkUI 4.0 Release 版本。 GetNativeModulePath(moduleName, path, relativePath, isAppModule, nativeModulePath, NAPI_PATH_MAX)) { 根据 dlopen() 方法的简介,hello.cpp 中添加了一个全局构造函数 RegisterEntryModule(),代码如下所示:#include <node_api.h>static napi_module (&demoModule); }也就是说当调用 dlopen() 方法加载 libentry.so 时,会先调用 RegisterEntryModule() 方法,在该方法内部调用了 napi_module_register (),napi_module_register() 源码如下:NAPI_EXTERN void napi_module_register(napi_module* mod){ NativeModuleManager
Node.js的napi极大地方便了c++ addon的编写,使得用户不再那么需要面对复杂的v8。本文通过一个例子来分析一下napi的使用和napi到底做了什么。 napi_value Init(napi_env env, napi_value exports) { napi_value func; // 创建一个函数并且设置为exports对象的getArray // 创建一个数组,对应js的数组 napi_status napi_create_array(napi_env env, napi_value* result) { // 调用v8接口v8::Array napi_value ret;napi_create_array(env, &ret); 之前分析过napi_value本质上是一个一级指针。接着我们看如何使用从napi中拿到的数组。 // 设置key对应的值,key是数字 napi_status napi_set_element(napi_env env, napi_value
核心代码static napi_value GetDisplaySize(napi_env env, napi_callback_info info) { // 获取arkts侧的系统库路径 char ", &sysModule); napi_value param; napi_create_string_utf8(env, str, NAPI_AUTO_LENGTH, ¶m); = napi_ok) { return; } napi_value resolvedCallback; napi_value rejectedCallback; napi_create_function *>(data); napi_release_threadsafe_function(callbackData->tsfn, napi_tsfn_release); napi_delete_async_work CallAsyncFunc(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value jsCb = nullptr
1.NAPI 类对象导出OpenHarmony NAPI提供了一种“包装”C ++类和实例的方法,以便JS应用可以调用类的构造函数和方法。 NAPI导出类对象流程通过napi_define_class定义一个JS类它包含了与 C++ 类对应的构造函数、静态属性、方法、实例属性和方法。 通过napi_unwrap获取作为调用目标的C++ 实例当 JS调用C++ 类 的方法或属性时,会调用相应的napi_callback C++ 函数。 NAPI 对象的生命周期代表着从对象创建到释放的整个过程,如下图所示:在ArkTS应用启动时会加载NAPI模块,而在NAPI模块加载过程中会创建一个对象A提供给应用使用,在应用退出或者主动释放A对象前, 关于本文提供的样例工程本文提供了一个IDE开发的NAPI工程用来学习NAPI 类对象导出和对象生命周期管理。
); status = napi_call_threadsafe_function(uniContext->selectTsfn, selectParam, napi_tsfn_blocking static napi_value call(napi_env env, napi_callback_info info); }; // step2:convert2NapiValue方法实现 napi_value etswrapper::DocumentViewPickerSelectThenCbWrapper::convert2NapiValue(napi_env env) { ::call(napi_env env, napi_callback_info info) { // ... napi_value thisArg; NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisArg, nullptr
定义NapiTest类及方法Napi.h文件内容如下:#ifndef __NAPI_TEST_H__#define __NAPI_TEST_H__#include "napi/native_api.h" env, napi_callback_info info); // 初始化js类并设置对应属性并将其导出 static napi_value Init(napi_env env, napi_value env, napi_callback_info info); // 定义js结构体时实际的构建函数 static napi_value Constructor(napi_env env, napi_callback_info napi_status napi_get_cb_info(napi_env env, napi_callback_info napi_create_reference函数说明:NAPI_EXTERN napi_status napi_create_reference(napi_env env,