如何从 Node.js 调用 C++ 代码?

2024-04-21

我目前正在开发一个在服务器上运行的模拟器,并应在浏览器中显示数据。

对于服务文件、通信和类似的事情,我想使用 Node.js。但是,我不确定它在计算部门是否会像我希望的那样执行,所以我想用 C++ 开发模拟部分。

模拟被划分为单独的“世界”,它们都以一些初始参数开始。

做这个的最好方式是什么?


嗯,V8 允许从 JavaScript 调用 C++ 代码。

所以你的代码可以分为 3 部分:

  • 普通 C++,不知道 Node.js 和 V8。这将是哪里World is.
  • 粘合node.js/V8-C++代码,允许JS“看到”你的部分内容World class.
  • 普通 JavaScript 代码,通过“粘合”层与 C++ 端通信

首先,了解V8和C++如何通信。谷歌为此提供了一个指南:https://developers.google.com/v8/embed https://developers.google.com/v8/embed

然后,您需要 Node.js 特定的粘合剂。看http://www.slideshare.net/nsm.nikhil/writing-native-bindings-to-nodejs-in-c http://www.slideshare.net/nsm.nikhil/writing-native-bindings-to-nodejs-in-c and http://syskall.com/how-to-write-your-own-native-nodejs-extension 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 shell 上,一些设置:

node-waf configure

要构建,请运行:

node-waf

To test:

node demo/demo.js

Output:

Updating World
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Node.js 调用 C++ 代码? 的相关文章

随机推荐

  • 什么是未处理的承诺拒绝?

    为了学习 Angular 2 我正在尝试他们的教程 我收到这样的错误 node 4796 UnhandledPromiseRejectionWarning Unhandled promise rejection r ejection id
  • 如何使用 keywindow 无边框窗口(覆盖)覆盖全屏游戏?

    我创建的应用程序有时会显示带有标签和文本框的叠加层 它工作得很好 但我需要它即使在其他应用程序处于全屏模式且处于活动状态时也能工作 对于覆盖 我创建了自定义窗口类并覆盖canBecomeKeyWindow让无边框窗口成为关键窗口的方法 简单
  • 从项目中删除 Pod - xcode

    我正在尝试从我的项目中删除 pod 在我删除所有文件和所有内容后 我收到此消息 diff Podfile lock No such file or directory diff Manifest lock No such file or d
  • 为什么我在使用 img 标签时收到 403 禁止?

    当尝试使用时 img src Ginger jpeg 我收到 403 错误 这是请求的页面 http laponderosakennels com beagles memories ginger index html http lapond
  • 当舞台处于全屏模式时 JavaFX 弹出窗口隐藏

    I am trying to popup a dialog over my fullscreen primary stage in javafx When I create my popup it is unexpectedly hidde
  • Beautiful Soup 找不到我想要的 HTML 部分

    我使用 BeautifulSoup 进行网页抓取已经有一段时间了 这是我第一次遇到这样的问题 我试图在代码中选择数字 101 172 但即使我使用 find 或 select 输出始终只有标签 而不是数字 我之前曾处理过类似的数据收集工作
  • 可调用和泛型的集合

    我需要在并发线程中启动一堆任务并检索其结果 这是我的代码 List
  • 使用正则表达式解析 select 语句(用于自定义 SQL 解析器)

    我这样做是为了教学目的 构建一个教学数据库 构建它的一部分 就像成熟的数据库一样 这是一个非常简单的查询解析器 我正在尝试使用正则表达式解析简单的 选择 语句 它适用于大多数简单的情况 但我在选择表格之间留有空格的平衡中失去了它 从a b
  • 在 Dynamics ax 中读取逗号分隔值 (csv) 文件

    如何在dynamic ax中打开并解析csv文件 static void TestCommaTextIO Args args File CommaTextIo commaTextIo FileIOPermission permission
  • 共享来自多个 Web 参考的数据类型

    假设供应商提供了两个独立的 Web 服务 它们共享相同的数据类型和相同的命名空间 例如 以下 Web 服务都包含类似的对象 例如 TestCredentials 对象 TestWebservice Testwebservice1 asmx
  • 重载>> istream_iterator 对[重复]

    这个问题在这里已经有答案了 我正在尝试在pair上构造一个ifstream iterator 我的代码如下 typedef pair
  • $_POST 参数被修改/截断

    当我将 POST 中的数据发送到 php 脚本时 此帖子数据被截断 修改 我有一个变量 encrypted 使用 Guzzle 或 Curl 发送到一个端点 该端点以 json 形式返回发布数据 例如 echo json encode PO
  • /var/tmp/rpm-tmp.b1DgAt (%build) 的退出状态错误

    我正在尝试编译 Tizen 源代码 编译工具使用rpm构建环境 在编译特定包时 我遇到 rpm 构建问题 var tmp rpm tmp b1DgAt build 的退出状态错误 这是我的构建日志 Building CXX object C
  • 如何将 Pinterest 集成到 ios 应用程序中

    我想整合兴趣在我的应用程序中 我想在我的应用程序中添加 pinterest 按钮 通过它我可以在我提到的 pinterest 上上传图像他们的开发者网站 http developers pinterest com 但这对我没有帮助 我包含了
  • foo() 缺少 1 个必需的位置参数

    class test def foo self pic path enc path key path return pic path enc path key path if name main s test pic path pic pn
  • 边框颜色的CSS复选框样式[重复]

    这个问题在这里已经有答案了 我的表格中有一个复选框 这是该复选框的 CSS input type checkbox width 20px height 30px margin auto display table row border 5p
  • Bootstrap 按钮活动颜色变化

    我正在使用引导按钮类 更具体地说 如下
  • 如何从WebBrowser控件获取图像

    我有一个 WebBrowser 控件 在浏览页面后我需要下载图像 我使用了以下代码 HtmlElementCollection tagsColl webBrowser1 Document GetElementsByTagName img f
  • SQL插入相关表

    在我看来 这似乎是 SQL 数据库开发中经常出现的问题 但我对这一切都是新手 所以请原谅我的无知 我有 2 张桌子 CREATE TABLE dbo Tracks TrackStringId bigint NOT NULL Id bigin
  • 如何从 Node.js 调用 C++ 代码?

    我目前正在开发一个在服务器上运行的模拟器 并应在浏览器中显示数据 对于服务文件 通信和类似的事情 我想使用 Node js 但是 我不确定它在计算部门是否会像我希望的那样执行 所以我想用 C 开发模拟部分 模拟被划分为单独的 世界 它们都以