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相关推荐

  1. 在nodejs addon 环境下抓视频和音频数据包

    在node addon 环境下开发音视频,需要用到 gyp .这个配置比较简单,很快可以配置好.比较坑的是,在vscode 开发环境下, 如果装了conda 或者 mini conda .   有可能 ...

  2. 一个快速使用 Golang 开发和构建生成 NodeJS Addon 扩展的开发工具

    GonaCli 一套快速使用 Golang 开发和构建生成 NodeJS Addon 扩展的开发工具 GONACLI 是一个快速使用 Golang 开发 NodeJS Addon 扩展的开发工具,开发 ...

  3. NodeJS Addon开发

    1.环境搭建 npm init npm i --save --dev node-gyp node-addon-api 在package.json中加入如下配置: 在package.json同级目录下创 ...

  4. nodejs addon实现回调函数事件

    封装nodejs的addon接口,在处理回调函数这块走了很多弯路,在此提供一个简单的测试程序,有兴趣的可以研究下. 安装nan模块 npm install nan binding.gyp文件内容如下: ...

  5. nodejs addon binding osg

    绑定过webpage 到osg 窗口,我需要一个回调机制对osg 显示进行后台显示. 具体的做法是osg作为一个状态机, 前台web界面向后台发送命令, 消息 . 后台接收消息,改变状态.我想架在so ...

  6. electron集成arm64架构的nodejs addon插件

    随着macos M1芯片的发布,当前的electron PC应用要适配arm64架构(虽然低版本electron应用也可以在arm64架构上面运行(转译)但是这严重影响电脑性能). 环境搭建 mac上 ...

  7. Nodejs Native AddOn的编写

    本文地址 http://blog.csdn.net/wangjia184/article/details/18940165 如果要在nodejs中调用动态链接库中的导出方法,或者从动态链接库中回调no ...

  8. 使用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 ...

  9. 我擦!迅雷的代码结构竟然被扒了精光~

    作者:jiawen 链接:juejin.im/post/6890344584078721031 # 背景 之前扒过飞书的源码,从代码设计架构层面里里外外学习一把,飞书还是挺"大方" ...

最新文章

  1. 渡鸦创始人离职百度后的下一个“真相”
  2. 「不会开会」是个病,这本书能治吗?
  3. java变量设置_配置环境变量
  4. 什么是Terraform?
  5. 第十二篇:实用的关联容器
  6. 分布式--ActiveMQ 消息中间件(一) https://www.jianshu.com/p/8b9bfe865e38
  7. 移植madplay到jz2440【学习笔记】
  8. *PAT_B_1014_Java(20分)
  9. 如何open一个新tab页面
  10. Android -- WebView进度条
  11. [数据库]---nosql,非关系型数据库整理
  12. ElasticSearch 各模块介绍及参数配置详解
  13. python元类是什么_谈谈Python中元类Metaclass(一):什么是元类
  14. 【京东助手】滑稽东试用助手 V1.6.0
  15. android机顶盒root,[Android]机顶盒root脚本:SupersuSU获取完美Root权限万能方法,解决二进制更新问题 | 樱花庄...
  16. (JavaScript)浮动广告代码
  17. Verilog中begin...end和fork....join的区别和用法
  18. c语言SPF算法代码,SPF 算法具体过程
  19. 分析技术|3.2透射电子显微技术TEM
  20. [Error] ld returned 1 exit status

热门文章

  1. 美团外卖用户评价文本研究
  2. EasyX 窗口如何最大化,以及拖拽调整大小
  3. 单元测试用例 php,PHP 单元测试(PHPUnit)(2)
  4. 最大的成功是成为自己尊重的人
  5. 由于找不到libgcc_s_dw2-1.dll,无法继续执行代码。重新安装程序可能会解决此问题
  6. 干货 | CoAP协议例析
  7. matlab仿真的实例,MATLAB仿真实例
  8. Intellij IDEA摸鱼插件 看电子书 AndroidStudio 摸鱼插件 摸鱼神器 IdeaTxt
  9. ubuntu18.04根目录已满造成开机失败报错Fail to start....
  10. 树莓派上云-天工物接入