如何从Node.js调用C++代码
How to call C++ code from Node.js?
我目前正在开发一个在服务器上运行的模拟器,它应该在浏览器中显示数据。
对于服务文件、通信之类的东西,我想使用Node.js。但是,我不确定它是否会像我在计算部门希望的那样好,所以我想用C++开发模拟部分。
模拟被划分为不同的"世界",所有这些世界都从一些初始参数开始。
最好的方法是什么?
好吧,V8允许从JavaScript调用C++代码。
所以你可以有三部分代码:
- 普通C++,不知道node.js和V8。这将是
World
所在的位置 - 粘合node.js/V8-C++代码,允许js"查看"
World
类的部分内容 - 普通JavaScript代码,通过"粘合"层与C++端通信
首先,了解V8和C++是如何通信的。谷歌为此提供了一个指南:https://developers.google.com/v8/embed
然后,您需要node.js特定的胶水。看见http://www.slideshare.net/nsm.nikhil/writing-native-bindings-to-nodejs-in-c和http://syskall.com/how-to-write-your-own-native-nodejs-extension
从上面的幻灯片链接:
#include <v8.h>
#include <node.h>
using namespace v8;
extern "C" {
static void init(Handle<Object> target) {}
NODE_MODULE(module_name, init)
}
我们可以将其扩展为更接近您想要的东西:
src/world.h
#ifndef WORLD_H_
#define WORLD_H_
class World {
public:
void update();
};
extern World MyWorld;
#endif
src/world.cpp
#include "world.h"
#include <iostream>
using std::cout;
using std::endl;
World MyWorld;
void World::update() {
cout << "Updating World" << endl;
}
src/bind.cpp
#include <v8.h>
#include <node.h>
#include "world.h"
using namespace v8;
static Handle<Value> UpdateBinding(const Arguments& args) {
HandleScope scope;
MyWorld.update();
return Undefined();
}
static Persistent<FunctionTemplate> updateFunction;
extern "C" {
static void init(Handle<Object> obj) {
v8::HandleScope scope;
Local<FunctionTemplate> updateTemplate = FunctionTemplate::New(UpdateBinding);
updateFunction = v8::Persistent<FunctionTemplate>::New(updateTemplate);
obj->Set(String::NewSymbol("update"), updateFunction->GetFunction());
}
NODE_MODULE(world, init)
}
demo/demo.js
var world = require('../build/Release/world.node');
world.update();
wscript
def set_options(opt):
opt.tool_options("compiler_cxx")
def configure(conf):
conf.check_tool("compiler_cxx")
conf.check_tool("node_addon")
def build(bld):
obj = bld.new_task_gen("cxx", "shlib", "node_addon")
obj.cxxflags = ["-g", "-D_FILE_OFFSET_BITS=64", "-D_LARGEFILE_SOURCE", "-Wall"]
# This is the name of our extension.
obj.target = "world"
obj.source = "src/world.cpp src/bind.cpp"
obj.uselib = []
在Linux外壳上,一些设置:
node-waf configure
要构建,请运行:
node-waf
测试:
node demo/demo.js
输出:
Updating World
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用