在 Node.js 中使用C++
来源:互联网 发布:mac 用户主目录在哪里 编辑:程序博客网 时间:2024/05/29 19:50
这几天在看 Node.js 的官方文档,看到了 C++ 插件部分,由于很久没有接触 C/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 结束。
- 在Express中使用html (Node.js)
- 在node中使用protobuf.js
- 在sublim 中 使用 node.js
- 在 Node.js 中使用C++
- 在node.js 中使用async await
- 在 Cocos2d-js 中使用 Node.js 模块
- 在 Cocos2d-js 中使用 Node.js 模块
- 在 Cocos2d-js 中使用 Node.js 模块
- 在Node.js中使用TCP套接字编程
- 在Node.js中使用TCP套接字编程
- [Node.js]在Express3.X中使用EJS
- 在Node.js中使用TCP套接字编程
- 在Node.js中使用supervisor提高调试效率
- 在Node.js中使用promise摆脱回调金字塔
- 翻译:如何在Node.js和Express中使用MySql
- 在Node.js中使用TCP套接字编程
- 在Node.js中使用TCP套接字编程
- 在Node.js中使用RabbitMQ系列二 任务队列
- lesson 9:编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。
- zookeeper基本知识点
- 选择排序-初级排序算法-Java实现
- weblogic 内存溢出解决 java.lang.OutOfMemoryError: PermGen space
- 既然GPU可以加速某些运算,为何应用程序要提供禁用GPU加速的选项
- 在 Node.js 中使用C++
- A06_大文件拷贝
- hibernate关系映射管理(一对多,多对一,一对一,多对多)
- Oracle压缩黑科技(二)—压缩数据的修改
- 如何修改网卡名称由enp0s25为eth0 (by quqi99)
- 在Linux系统下源码安装node.js
- [Shiro入门](一)使用Redis作为缓存管理器
- 2017年12月银行卡跨行ATM取现手续费
- JAVA第一步工作 classpath、path、JAVA_HOME的作用及JAVA环境变量配置等