赞
踩
本系列文章主要是记录笔者在鸿蒙南向的学习与工作中的知识点笔记记录,其中不止会针对鸿蒙中的学习问题进行思考与记录,也会对涉及到的一些嵌入式等其他领域知识,自我学习的心得进行记录。
本篇内容主要是黄同学最近在OpenHarmony 南向开发学习中对NAPI框架以及一些代码中的接口,异步实现等机制的学习。
NAPI
其实是最早应该是来自node.js
中的一个拓展库(也可以说是一整套API接口),叫Node-API
,叫做N-API
。是用来构建本地插件的API,将所有的nodejs底层数据结构黑盒化,封装成二进制接口,这样就可以实现不同版本的Node.js使用同样的接口,其目的是为了简化开发和维护。
Native API
,是OpenHarmony系统中的一套原生模块拓展开发框架,基于Nodejs中的N-API开发,为开发者提供了JS与C/C++不同语言模块之间的相互访问,交互的能力。它可以用于规范化封装IO、OS底层等,并可以提供相应的JS接口供开发者调用。当然。N-API
也可以做到这一点。N-API
,主要在于NAPI针对OpenHarmony 系统做了 一些适配化和优化。但二者的目的都是为了简化和统一原生模块的开发和维护,提高跨平台和跨版本的兼容性。鄙人浅谈一下这个东西,欢迎各位斧正!
napi_value
类型做封装和转换(计算机网络协议既视感),而像函数等接口则采用如 napi_create_function()
以及 napi_call_function()
等来进行创建和调用。主要是记录一下在读以及编写Code时的遇到的问题的以及自己积累的心得体会。
大多是一些代码中的接口的解释和个人结合相关资料后的一点理解。
extern "C"
来提示编译器在将cpp文件转为汇编时将该处对接口的调用方式由Cpp方式改为C方式,从而可以正确链接。__attribute__((destructor))
可以修饰函数,使得这个函数在共享库卸载或者程序退出时执行。static
__attribute__((constructor))
是在全局变量初始化之前执行,这样可以避免依赖问题。__attribute__((constructor))
可以在不同文件或者动态链接库中使用。这是NAPI的一个宏,看名字大家都知道这个是用来声明一个函数的,黄同学在很多使用NAPI的Cpp代码都能看到这个宏。
宏定义原型(参数),有两种形式
// 不传回调
#define DECLARE_NAPI_FUNCTION(modname,name)
// 传递回调
#define DECLARE_NAPI_FUNCTION_EX(modname, name, func)
两种形式
实现原理
实现原理的流程图,不包括框架初始化
napi的一个函数,用于获取回调函数的参数和其他信息下面是它的原形
napi_status napi_get_cb_info(napi_env env, napi_callback_info cbinfo,
size_t* argc, napi_value* argv,
napi_value* this_arg, void** data);
参数解释:
这是一条使用框架编写一些C/C++代码作为JS的接口的时需要注意的事情。
黄同学在做一个板子的sample的时候发现,某个smaple的样例源码无法跑通,除了一些简单的语法错误,最主要的是函数定义时的参数类型。
在本身数据是没有NAPI类型的数据的,但是框架中很多接口的定义都是用napi类型,所以我们在定义的时候,传递参数可以用void*
,即空类型传递,然后在函数体内再对应修改即可。否则调用时会不符合NAPI中接口的定义。
以下内容只讨论计算机方面,不要和我听异步电机啥的,黄同学表示考完控制后,看到电机这个东西真的头很大。
在NAPI
中,有两种实现异步操作:**Calllback
**和 Promise
。
// 定义一个异步的除法函数,接受两个数字和两个回调函数作为参数 function divisionAPI(number, divider, successCallback, errorCallback) { if (divider == 0) { return errorCallback(new Error("Division by zero")); } successCallback(number / divider); } // 调用异步的除法函数,传入两个数字和两个回调函数 divisionAPI(10, 2, function(result) { // 成功的回调函数,打印结果 console.log("The result is " + result); }, function(error) { // 失败的回调函数,打印错误 console.error("Something went wrong: " + error.message); });
pending
,等待fulfilled
,已成功rejected
,已失败then
或者 catch
操作来处理异步操作结果成功或者失败的情况。all
方法等待所有异步操作的完成,也可以用race
方法来获取最先完成的异步操作的结果。await
关键字在async函数中,等待一个Promise对象,实际过程就是再那个时间段代码调用到异步操作,此时async不执行,有点类似于同步操作,或者说我们一开始学习编程时最简单的函数调用,详见asynchronous - Why use promise or async/await on child processes in Node.js? - Stack Overflow 和 How to use promises - Learn web development | MDN (mozilla.org))。// 定义一个异步的除法函数,返回一个Promise对象 function divisionAPI(number, divider) { return new Promise(function(resolve, reject) { if (divider == 0) { return reject(new Error("Division by zero")); } resolve(number / divider); }); } // 调用异步的除法函数,返回一个Promise对象 divisionAPI(10, 2) .then(function(result) { // 成功的回调函数,打印结果 console.log("The result is " + result); }) .catch(function(error) { // 失败的回调函数,打印错误 console.error("Something went wrong: " + error.message); });
黄同学写这篇blog的一些参考资料,有需要的可以看看。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。