nodejs addon
nodejs和C++配合起来,又能满足前端的快速开发,也能达到核心层的性能要求。
之前也写过用C++写addon的例子。在实际使用过程也遇到了一些问题:
有些场景需要js注册回调函数,供底层调用,这个时候会将回调函数记录v8::Persistent<v8::Function>,实际使用的时候是需要转换为v8::Local<v8::Function>来调用:
auto isolate = v8::Isolate::GetCurrent();
v8::HandleScope handleScope(isolate);
v8::Local<v8::Function> cb = v8::Local<v8::Function>::New(isolate, _disconnectCallback);
cb->Call(isolate->GetCurrentContext(), Null(isolate), 0, NULL);
如上面这般,注意到了需要Isolate,那么在普通的C++函数肯定不能调用了,这个时候就需要借助:
uv_work_t* work = new uv_work_t;
uv_queue_work(uv_default_loop(), work, (uv_work_cb)EmptyFunc, (uv_after_work_cb)JSOnDisconnect);
再来看EmptyFunc:
void EmptyFunc(uv_work_t* work)
{// do nothing
}
这个函数不需要做任何事情,主要是后面的:
void JSOnDisconnect(uv_work_t* work)
{auto isolate = v8::Isolate::GetCurrent();v8::HandleScope handleScope(isolate);v8::Local<v8::Function> cb = v8::Local<v8::Function>::New(isolate,_disconnectCallback);cb->Call(isolate->GetCurrentContext(), Null(isolate), 0, NULL);delete work;
}
在这个函数中调用v8::Isolate::GetCurrent();是可以拿到Isolate的,这样通过uv_queue_work一转发就可以调用实际的js函数了。
还有一个点,如果是直接执行node index.js(自己写的js调用代码),js执行完成之后不会等待C++层的逻辑执行完毕回调js函数直接就退出了。改用先进入node(在命令行执行node),然后.load index.js就可以了。
V8中包含的很多类型和方法还需要深入去了解,留待以后研究。
nodejs addon相关推荐
- 在nodejs addon 环境下抓视频和音频数据包
在node addon 环境下开发音视频,需要用到 gyp .这个配置比较简单,很快可以配置好.比较坑的是,在vscode 开发环境下, 如果装了conda 或者 mini conda . 有可能 ...
- 一个快速使用 Golang 开发和构建生成 NodeJS Addon 扩展的开发工具
GonaCli 一套快速使用 Golang 开发和构建生成 NodeJS Addon 扩展的开发工具 GONACLI 是一个快速使用 Golang 开发 NodeJS Addon 扩展的开发工具,开发 ...
- NodeJS Addon开发
1.环境搭建 npm init npm i --save --dev node-gyp node-addon-api 在package.json中加入如下配置: 在package.json同级目录下创 ...
- nodejs addon实现回调函数事件
封装nodejs的addon接口,在处理回调函数这块走了很多弯路,在此提供一个简单的测试程序,有兴趣的可以研究下. 安装nan模块 npm install nan binding.gyp文件内容如下: ...
- nodejs addon binding osg
绑定过webpage 到osg 窗口,我需要一个回调机制对osg 显示进行后台显示. 具体的做法是osg作为一个状态机, 前台web界面向后台发送命令, 消息 . 后台接收消息,改变状态.我想架在so ...
- electron集成arm64架构的nodejs addon插件
随着macos M1芯片的发布,当前的electron PC应用要适配arm64架构(虽然低版本electron应用也可以在arm64架构上面运行(转译)但是这严重影响电脑性能). 环境搭建 mac上 ...
- Nodejs Native AddOn的编写
本文地址 http://blog.csdn.net/wangjia184/article/details/18940165 如果要在nodejs中调用动态链接库中的导出方法,或者从动态链接库中回调no ...
- 使用napi node_使用Napi / node-addon-api和Cmake的独立于Node.js版本的C ++ Native Addon
使用napi node This is a tutorial for c++ Node-addon-api / Napi addon using cmake.Napi makes it indepen ...
- 我擦!迅雷的代码结构竟然被扒了精光~
作者:jiawen 链接:juejin.im/post/6890344584078721031 # 背景 之前扒过飞书的源码,从代码设计架构层面里里外外学习一把,飞书还是挺"大方" ...
最新文章
- 渡鸦创始人离职百度后的下一个“真相”
- 「不会开会」是个病,这本书能治吗?
- java变量设置_配置环境变量
- 什么是Terraform?
- 第十二篇:实用的关联容器
- 分布式--ActiveMQ 消息中间件(一) https://www.jianshu.com/p/8b9bfe865e38
- 移植madplay到jz2440【学习笔记】
- *PAT_B_1014_Java(20分)
- 如何open一个新tab页面
- Android -- WebView进度条
- [数据库]---nosql,非关系型数据库整理
- ElasticSearch 各模块介绍及参数配置详解
- python元类是什么_谈谈Python中元类Metaclass(一):什么是元类
- 【京东助手】滑稽东试用助手 V1.6.0
- android机顶盒root,[Android]机顶盒root脚本:SupersuSU获取完美Root权限万能方法,解决二进制更新问题 | 樱花庄...
- (JavaScript)浮动广告代码
- Verilog中begin...end和fork....join的区别和用法
- c语言SPF算法代码,SPF 算法具体过程
- 分析技术|3.2透射电子显微技术TEM
- [Error] ld returned 1 exit status
热门文章
- 美团外卖用户评价文本研究
- EasyX 窗口如何最大化,以及拖拽调整大小
- 单元测试用例 php,PHP 单元测试(PHPUnit)(2)
- 最大的成功是成为自己尊重的人
- 由于找不到libgcc_s_dw2-1.dll,无法继续执行代码。重新安装程序可能会解决此问题
- 干货 | CoAP协议例析
- matlab仿真的实例,MATLAB仿真实例
- Intellij IDEA摸鱼插件 看电子书 AndroidStudio 摸鱼插件 摸鱼神器 IdeaTxt
- ubuntu18.04根目录已满造成开机失败报错Fail to start....
- 树莓派上云-天工物接入