在 Node.js 中使用C++
2017-12-06 12:33
405 查看
这几天在看 Node.js 的官方文档,看到了 C++ 插件部分,由于很久没有接触 C/C++ 了,看起来着实吃力,决定写一个 Hello World 后跳过该部分。
在 Node.js 上使用 C++,需要用 node-gyp 工具对 C++ 文件进行编译,所以首先要安装 node-gyp :
然后在项目目录下写一个 hello.cc 文件:
按照我的理解,Method1、Method2就是我们为这个 C++ 插件提供的功能,其参数是个回调函数,args.GetReturnValue().Set() 方法应该是输出了这个函数的返回值,也就是在 js 中调用这个函数得到相应返回值。
Node.js插件必须导出一个具有如下模式的初始化函数:
官网上说 NODE_MODULE 后面没有分号,因为他不是一个函数(一脸懵逼)。在上面的 hello.cc 文件中,初始化函数是 init,插件模块名为 addon。NODE_SET_METHOD 是对插件输出的函数命名。
接下来就要对这个文件编译成 Node.js 的插件了,首先需要一个配置文件。在项目目录中建立一个 binding.gyp 的文件,这个文件会被 node-gyp 使用到:
然后在项目目录下使用 node-gyp configure 命令,这样在 Windows 上会得到一个 build 文件夹:
然后继续使用 node-gyp build 命令,成功后在 build/Release 文件夹下有个 addon.node 的二进制文件,这就是最终得到的 C++ 插件,可以在 js 中调用下:
输出:
到此一个 Node.js 中 C++ 插件的 Hello World 结束。
在 Node.js 上使用 C++,需要用 node-gyp 工具对 C++ 文件进行编译,所以首先要安装 node-gyp :
npm install -g node-gyp
然后在项目目录下写一个 hello.cc 文件:
#include <node.h> namespace demo{ using v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local; using v8::Object; using v8::String; using v8::Value; using v8::Number; // Method1 实现一个 输出"hello world ONE !" 的方法 void Method1(const FunctionCallbackInfo<Value>& args){ Isolate* isolate = args.GetIsolate(); args.GetReturnValue().Set(String::NewFromUtf8(isolate, "hello world ONE !")); } // Method2 实现一个 加一 的方法 void Method2(const FunctionCallbackInfo<Value>& args){ Isolate* isolate = args.GetIsolate(); // 获取参数,js Number 类型转换成 v8 Number 类型 Local<Number> value = Local<Number>::Cast(args[0]); double num = value->NumberValue() + 1; // double 转 char*,这里我不知道有没有其他办法 char buf[128] = {0}; sprintf(buf,"%f", num); args.GetReturnValue().Set(String::NewFromUtf8(isolate, buf)); } void init(Local<Object> exports){ NODE_SET_METHOD(exports, "hello1", Method1); NODE_SET_METHOD(exports, "addOne", Method2); } NODE_MODULE(addon, init) }
按照我的理解,Method1、Method2就是我们为这个 C++ 插件提供的功能,其参数是个回调函数,args.GetReturnValue().Set() 方法应该是输出了这个函数的返回值,也就是在 js 中调用这个函数得到相应返回值。
Node.js插件必须导出一个具有如下模式的初始化函数:
void Initialize(Local<Object> exports); NODE_MODULE(module_name, Initialize)
官网上说 NODE_MODULE 后面没有分号,因为他不是一个函数(一脸懵逼)。在上面的 hello.cc 文件中,初始化函数是 init,插件模块名为 addon。NODE_SET_METHOD 是对插件输出的函数命名。
接下来就要对这个文件编译成 Node.js 的插件了,首先需要一个配置文件。在项目目录中建立一个 binding.gyp 的文件,这个文件会被 node-gyp 使用到:
{ "targets": [ { "target_name": "addon", "sources": ["hello.cc"] } ] }
然后在项目目录下使用 node-gyp configure 命令,这样在 Windows 上会得到一个 build 文件夹:
build │ addon.vcxproj │ addon.vcxproj.filters │ binding.sln │ config.gypi │ └─Release └─obj └─addon └─addon.tlog
然后继续使用 node-gyp build 命令,成功后在 build/Release 文件夹下有个 addon.node 的二进制文件,这就是最终得到的 C++ 插件,可以在 js 中调用下:
const addon = require('./build/Release/addon.node'); console.log(addon.hello1()); console.log(addon.addOne(2));
输出:
hello world ONE ! 3.000000
到此一个 Node.js 中 C++ 插件的 Hello World 结束。
相关文章推荐
- 使用C++为node.js写扩展模块
- 为什么使用 node.js 分享
- 在Windows Azure中使用Node.js,开启云计算之旅!
- 在Windows Azure中使用Node.js,开启云计算之旅!
- 如何在Node.js中使用npm创建和发布一个模块
- node.js+android(使用HttpURLConnection和HttpClient)实现文件上传
- 为什么使用Node.JS
- 关注Node.js的C++移植版node.native
- Linux(centos6.0)下安装Node.js以及使用
- 服务器端的JavaScript脚本 Node.js 使用入门
- Node.js和Geddy初学者指南 - 第三部分:使用Mongdb持久化你的数据
- Node.js和Geddy初学者指南 - 第三部分:使用Mongdb持久化你的数据
- Node.js和Geddy初学者指南 - 第三部分:使用Mongdb持久化你的数据
- nginx结合node.js安装使用
- 使用Node.js + MongoDB实现一个简单的日志分析系统
- node.js 第三方模块如何安装(使用npm)及介绍
- Node.js集成开发环境Cloud9搭建及CoffeeScript插件使用
- node.js入门甜点,使用node.js建静态博客
- nodejs C/C++ Addons 中的指针操作
- nginx and node.js配合使用 helloworld