Как вызвать код C ++ из Node.js?

В настоящее время я разрабатываю симулятор, который работает на сервере и должен отображать данные в браузере.

Для обслуживания файлов, общения и тому подобного я бы хотел использовать Node.js. Но я не уверен, что он будет работать так же хорошо, как я хотел бы, чтобы в отделе вычислений, поэтому я хотел бы разработать часть моделирования в C ++.

Симуляция разделена на отдельные «миры», которые все начинаются с некоторых начальных параметров.

Каков наилучший способ сделать это?

14

Решение

Ну, V8 позволяет вызывать код C ++ из JavaScript.

Таким образом, вы можете иметь 3 части вашего кода:

  • Нормальный C ++, не подозревающий о node.js и V8. Это было бы где World является.
  • Склейте код node.js / V8-C ++, чтобы JS «видел» части вашего World учебный класс.
  • Обычный код JavaScript, который связывается со стороной C ++ через слой «glue»

Во-первых, понять, как V8 и C ++ общаются. Google предоставляет руководство для этого: 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.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
34

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]