从Node.js调用C++库(Node附加组件/ node-ffi)

10

我正在尝试将一个外部的C++库(我有访问.so文件和头文件的权限)集成到我的Node.js应用程序中。

在进行了大量研究后,我的选择被缩小为:

  1. 编写Node插件

  2. 使用node-ffi

从node-ffi的gitHub定义中,我无法确定它是否能够直接使用C++库:

node-ffi是一个Node.js插件,用于使用纯JavaScript加载和调用动态库。 它可用于创建与本机库的绑定,而无需编写任何C++代码。

所以我有以下问题:

  • 1)选项是否意味着以某种方式重写外部C++库?
  • 2)node-ffi能否直接调用C++库,而无需编写任何C包装器?

我不是C/C ++方面的专家,因此如果我错过了一些基本信息,请让我知道,以便我可以改进我的问题。


有一个类似的问题:https://dev59.com/p2Qn5IYBdhLWcg3wgnTg?rq=1 但我认为它并没有完全回答我的问题。 - Miki de Arcayne
4个回答

7
node-ffi似乎主要用于C程序。我在过去的一周中经历了这个过程,并且发现使用node插件会更加顺利。您需要在库中的C++代码和node.js之间编写一个shim。在我的情况下,我需要为安全协议编码和解码数据包,因此我创建了包含数据包的node缓冲区,并编写了C++代码从缓冲区中获取数据,然后将数据发送到我的C代码中进行编码和解码数据包。
这个页面:http://luismreis.github.io/node-bindings-guide/docs/returning.html有一些很好的示例,说明如何在C++中进出node.js缓冲区中获取数据。

2
ffi 可以与 C++ 一起使用,只需使用 extern "C" 定义库的接口(就像使用 C++ 编写的任何可能也被 C 使用的东西一样)。有关详细信息,请参阅 https://dev59.com/p2Qn5IYBdhLWcg3wgnTg?rq=1。 - konsumer

3

nbind现在更容易使用外部C++库编写Node.js插件了。您只需创建一个新的源文件,包括库头文件、nbind头文件和一些宏调用,列出库的类和方法。然后nbind会处理其余部分。

libui-node是一个真实的例子,使用nbind调用libui来生成带有本地小部件的用户界面。还有一个简短教程,介绍如何为vg创建绑定,这是一个与生物信息学相关的C++库。


2
其他答案中缺少什么?我很乐意帮忙。那里的代码示例是用C++编写的。我正在说明人们(使用C或C++制作库的人)如何为其他人定义外部接口。ffi的重点在于,您可以使用任何语言编写包装器(在这种情况下为javascript),而不是像node扩展一样使用C/C++。如果您的原始库是其他东西中使用的共享DLL,则已经具有接口,您只需要编写javascript中的包装器代码以告诉node它的工作原理,而不是编写C++中的内容并将其公开在本机nodejs库中。

你可以在这里找到信息:https://github.com/rbranson/node-ffi/wiki/Node-FFI-Tutorial,这是一个包装几个sqlite方法的示例。这个库是C或C++写的并不重要,重要的是它定义了一个接口(就像所有共享库一样)。 - konsumer

1

有一个非常简单的方法可以链接任何你的库(.so .dll .a)。你需要在binging.gyp文件中添加正确路径的库:

{
  "targets": [
    {
      "target_name": "addon",
      "sources": [ "hello.cc" ],
      "libraries": [
            "path/toYourLibrary/yourLibName.dll or yourLibName.so"
          ] 
    }
  ]
}

此外,使用nan编写良好的插件有更简单的方法。请查看链接github link获取更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接