如何从 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++ 代码? 的相关文章

  • 如何将动态数据写入 MVC 3 Razor 中的页面布局?

    我有带有 Razor 引擎的 MVC 3 C 项目 将动态数据写入 Layout cshtml 的方法和最佳实践是什么 例如 也许我想在网站的右上角显示用户名 该名称来自会话 数据库或基于用户登录的任何内容 更新 我也在寻找将某些数据渲染到
  • 如何在 Asp.Net Core 6 中向类型化 HttpClient 添加承载令牌身份验证

    我正在尝试使用 ASP Net Core 6 设置一个 Web api 以便用户可以到达我的端点 然后我使用特权帐户在幕后的 D365 中执行一些工作 我正在使用类型化的 HTTP 客户端 但我不确定如何插入承载身份验证 以便来自该客户端的
  • 为什么迭代器类型推导失败? [复制]

    这个问题在这里已经有答案了 为什么这在 C 中不起作用 为什么我不能限制foo的参数为std vector
  • 这种对有效类型规则的使用是否严格遵守?

    C99和C11中的有效类型规则规定 没有声明类型的存储可以用任何类型写入 并且存储非字符类型的值将相应地设置存储的有效类型 抛开 INT MAX 可能小于 123456789 的事实不谈 以下代码对有效类型规则的使用是否严格符合 inclu
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • 如何进行Visual Studio格式字典初始化?

    所有 Visual Studio 也包括 2012 不格式化以下内容 messageProcessor new Dictionary
  • C 中的双重否定:是否保证返回 0/1?

    Is x 标准保证返回0 1 请注意 我是not询问 C 其中定义了 bool 类型 是的 在 C99 中 请参阅 6 5 3 3 4 逻辑非运算符的结果 是0如果其操作数的值比较 不等于0 1如果其操作数的值比较等于 0 结果具有类型in
  • 公共基类打破了元组的空基类优化

    gcc 4 7 1 对元组进行空基类优化 我认为这是一个非常有用的功能 然而 这似乎有一个意想不到的限制 include
  • 如何在 C# 中创建 PKCS12 .p12 文件?

    这可能是一个n00b问题 但我在这方面确实没有任何经验 我需要创建一个包含 X509 证书和私钥的 p12 捆绑包 我当前有两个对象 X509Certificate2 和包含关键信息的 RSAParameters 对象 如何将它们合并到 p
  • Xcode 新手无法用 C++ 打开文件?

    我一直在我参加的课程中使用 Windows 但我正在尝试运行基本代码来弄清楚如何从 Xcode 上的文件打开 关闭 输入 输出 而我通常在 Visual Studio 上使用的代码不是不知道为什么 谢谢 include
  • C++ 更改屏幕方向问题 -- DEVMODE dmDisplayOrientation DMDO_90 undefined

    我似乎无法编译一些 C 代码 我正在翻转显示器的方向 但 VS2008 告诉我 DMDO 90 和 DMDO 270 无法识别 error C2065 DMDO 90 undeclared identifier error C2065 DM
  • 使用 C# 的异步 WebRequest

    您好 我有一个函数 它将 url Get 参数传递到网络服务器上的 php 文件 并等待文件的响应 通常需要 10 20 秒 我想将其放入一个循环中 因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件 但是当我尝试将其
  • C# 从今天起 30 天

    我需要我的应用程序从今天起 30 天后过期 我会将当前日期存储在应用程序配置中 如何检查应用程序是否已过期 我不介意用户是否将时钟调回来并且应用程序可以正常工作 用户太愚蠢而不会这样做 if appmode Trial string dat
  • 什么是 C++11 扩展 [-Wc++11-extensions]

    我需要一些帮助来了解此错误发生的位置 警告 非静态数据成员的类内初始化是 C 11 扩展 Wc 11 extensions 这是它来自的代码部分 typedef struct Hand bool straight false bool fl
  • 来自用户定义文字的整数字符序列,以字符串作为参数

    目前 只有双精度数可以在用户定义的文字中生成字符模板 template
  • 为什么 getch 不可移植?

    是什么使得 getch 本质上无法作为标准 C 函数包含在内 对于控制台界面来说 它是如此直观和优雅 如果没有它 要求输入单个字符总是会产生误导 因为用户可以输入多个键 更糟糕的是 您经常需要确保在读取控制台输入后清除标准输入 这甚至不是作
  • SQL Server CE 不兼容的数据库版本

    我有一个 SQL Server CE 4 0 数据库 sdf文件 当我尝试从我的应用程序 WPF 对数据库进行查询时 出现以下错误 数据库版本不兼容 如果这是兼容文件 请运行修复 其他情况请参考文档 数据库版本 4000000 请求的版本
  • NPM 全局标志在 Windows 上似乎不一致

    从控制台运行 gt npm root g 或者以编程方式 var npm require npm npm load null function err npm npm config set global true npm root 我在 W
  • 使用 ImageResizer 获取图像尺寸的最佳方法

    我正在将现有的 MVC 4 网站从自制用户文件上传切换为在上传时使用 ImageResizer 调整文件大小 我在文档中看到我不应该使用 System Drawing 但我无法找出任何其他获取图像尺寸的方法 尺寸是来自原始图像还是调整大小的
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht

随机推荐

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

    为了学习 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 开发模拟部分 模拟被划分为单独的 世界 它们都以