UDN-企业互联网技术人气社区

板块导航

浏览  : 607
回复  : 3

[Nodejs] 用C++扩展node.js(node-nan版)

[复制链接]
cat77的头像 楼主
发表于 2017-1-3 15:04:24 | 显示全部楼层 |阅读模式
本帖最后由 cat77 于 2017-1-3 15:08 编辑

  0.先安装node.js和python(2.7)。请参考:


  1.新建一个demo项目: 创建demo目录,并进入其中,然后运行下面命令。
  1. mkdir demo
  2. cd  demo
  3. npm init
复制代码

  运行npm init时,之后会生成一个package.json(具体内容与输入参数有关):
  1. {
  2.   "name": "demo",
  3.   "version": "1.0.0",
  4.   "description": "a demo for node call native functions",
  5.   "main": "demo.js",
  6.   "scripts": {
  7.     "test": "echo \"Error: no test specified\" && exit 1"
  8.   },
  9.   "keywords": [
  10.     "node"
  11.   ],
  12.   "author": "Li XianJing",
  13.   "license": "ISC"
  14. }
复制代码

  2.安装编译工具和头文件。
  1. sudo npm install -g node-gyp
  2. npm install nan bindings --save
复制代码

  3.用C++编写原生代码( 为了让目录结构整洁一点,我们把代码放到native只目录下)。

  下面的文件(native/demo.cc),添加一个Add方法,计算两个数之和:
  1. #include <nan.h>

  2. void Add(const Nan::FunctionCallbackInfo<v8::Value>& info) {

  3.   if (info.Length() < 2) {
  4.     Nan::ThrowTypeError("Wrong number of arguments");
  5.     return;
  6.   }

  7.   if (!info[0]->IsNumber() || !info[1]->IsNumber()) {
  8.     Nan::ThrowTypeError("Wrong arguments");
  9.     return;
  10.   }

  11.   double arg0 = info[0]->NumberValue();
  12.   double arg1 = info[1]->NumberValue();
  13.   v8::Local<v8::Number> num = Nan::New(arg0 + arg1);

  14.   info.GetReturnValue().Set(num);
  15. }

  16. void Init(v8::Local<v8::Object> exports) {
  17.   exports->Set(Nan::New("add").ToLocalChecked(),
  18.                Nan::New<v8::FunctionTemplate>(Add)->GetFunction());
  19. }

  20. NODE_MODULE(demo, Init)
复制代码

  4.写一个node-gyp的配置文件(文件名固定为binding.gyp),用来编译C++代码。
  1. {
  2.   "targets": [
  3.     {
  4.       "target_name": "demo",
  5.       "sources": [ "native/demo.cc" ],
  6.       "include_dirs": [
  7.         "<!(node -e \"require('nan')\")"
  8.       ]
  9.     }
  10.   ]
  11. }
复制代码

  5.编写一个JS文件(demo.js)),让它调用原生代码。
  1. var demo = require('bindings')('demo.node')

  2. console.log('add(3, 5) => ', demo.add(3, 5))
复制代码

  6.运行配置脚本(如果没有增删文件,不需要每次运行)
  1. node-gyp configure
复制代码

  7.编译C++程序。
  1. node-gyp build
复制代码

  8.运行JS代码,看看是否工作。
  1. node demo.js
复制代码

相关帖子

发表于 2017-1-3 15:04:56 | 显示全部楼层
个人觉得js是一种解释性语言,它提供了一个非常方便的开发过程,不需要编译,js与HTML标识结合在一起,从而方便用户的使用操作。
使用道具 举报

回复

发表于 2017-1-3 15:04:57 来自手机 | 显示全部楼层
占坑编辑ing
使用道具 举报

回复

发表于 2017-1-3 15:04:57 来自手机 | 显示全部楼层
其实js如果遇到web安全类的项目,那就又要做牺牲了,无法读写文件,访问受限。。。哎。。。
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部