从Node.js调用C ++库(Node addons / node-ffi)

时间:2013-09-05 12:13:23

标签: node.js node.js-addon node-ffi

我正在尝试将外部C ++库(我可以访问.so文件以及头文件)集成到我的Node.js应用程序中。

经过大量研究后,我的选择被简化为:

  1. 撰写Node addon

  2. 使用node-ffi

  3. 从node-ffi的gitHub的定义我无法判断它是否会直接在C ++库上运行:

      

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

    所以我的问题是:

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

    在C / C ++方面我不是专家所以如果我错过了一些基本的能够回答的问题请告诉我,以便我能改进我的问题。

4 个答案:

答案 0 :(得分:4)

node-ffi似乎主要用于C程序。我在上周经历了这个问题,发现节点插件运气好多了。你要做的是在库中的C ++代码和node.js之间编写一个垫片。在我的情况下,我需要对安全协议的数据包进行编码和解码,因此我创建了包含数据包的节点缓冲区,并编写了从缓冲区中获取数据的C ++代码,然后将数据发送到我编码的C代码中。解码后的包。

此页面:http://luismreis.github.io/node-bindings-guide/docs/returning.html有一些很好的例子,说明如何在C ++中将数据输入和输出node.js缓冲区。

答案 1 :(得分:3)

nbind现在可以更轻松地使用外部C ++库编写Node.js插件。您基本上创建了一个新的源文件,包括库头,nbind头和一些列出库的类和方法的宏调用。然后nbind处理剩下的事情。

libui-node是一个真实的例子,使用nbind调用libui来生成Node.js中的本机小部件的用户界面。还有一个short tutorial如何为vg创建绑定,这是一个与生物信息学相关的C ++库。

答案 2 :(得分:2)

其他答案缺少什么?我很乐意提供帮助。那里的代码示例是用C ++编写的。我将说明人们(使用C或C ++创建库)如何定义其他人使用的外部接口。 ffi的要点是你用你正在使用的任何语言编写你的包装器(在这种情况下是javascript)而不是C / C ++(如节点扩展的情况。)如果你的原始库是在其他东西中使用的共享DLL,它已经有了一个接口,你只需要在javascript中编写包装代码来告诉节点它是如何工作的,而不是用C ++编写代码并在原生nodejs库中公开它。

答案 3 :(得分:0)

可以很方便地链接任何图书馆(.so .dll .a)。您应该在binging.gyp文件中添加具有正确路径的库:

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

还有更简单的方法来使用nan编写好的插件。查看链接以获取更多信息github link