用于访问现有C++功能的node-ffi与节点扩展

我有一些现有的C++代码在独立的C++应用程序中进行数字处理。我现在想要在新的node.js应用程序中使用该代码。用于访问现有C++功能的node-ffi与节点扩展

研究如何从node.js的访问C++代码,有两个选项上来:

  1. 写Node.js的扩展
  2. 使用node-ffi

节点FFI似乎是一个好选项来访问现有的,但我正确的想法,如果我使用node-ffi我将不得不写一个C封装来使我的C++可访问? (这是我可以通过Visual Studio在Windows上运行简单测试用例的唯一方法)。

对于我的情况,我的源代码已经在C++中,而不是C,在上述两个选项之间进行选择时需要考虑什么?

回答:

FFI适用于动态C库。这意味着您必须从外部公开您的动态库。在C++中,你这样做与外部的“C”,像这样:

#ifdef __cplusplus 

extern "C" {

#endif

int foo (int param){

int ret = 0;

// do C++ things

return ret;

}

int bar(){

int ret = 0;

// do C++ things

return ret;

}

#ifdef __cplusplus

}

#endif

这会让你的C++函数可用C-的事情,作为一个动态库的方法。

这里是你如何在JavaScript把这个包,你编译你的C++的lib作为后libmylibrary.dll /的.so:

var ffi = require('ffi'); 

var mylibrary = ffi.Library('libmylibrary', {

"foo": [ "int", ["int"] ],

"bar": [ "int", [] ]

});

有很多事情凉,你可以做。检查出来,here

如果这是一个节点库,只需将你的方法放在module.exports。这里是上面的C++代码的包的一个完整的例子,与同步&异步方法:

var ffi = require('ffi'); 

var mylibrary = ffi.Library('libmylibrary', {

"foo": [ "int", ["int"] ],

"bar": [ "int", [] ]

});

module.exports = {

fooSync : mylibrary.foo,

foo: mylibrary.foo.async,

barSync : mylibrary.bar,

bar: mylibrary.bar.async

};

我没有用过node-ffi-generate,但它看起来产生这些类型的包装为你的很酷。

如果我保存这个文件作为mylibrary.js,我可以用这样的:“?岂不是更好”

var mylib = require('./mylibrary.js'); 

var num = mylib.fooSync(1);

// or

mylib.foo(1, function(er, num){

});

至于问题对于大多数事情我都这么认为。如果你让你的方法是extern C,那么它们就会以几乎所有其他语言工作,其中一些语言也有FFI,所以无论你的目标语言是什么,你都可以写出上面的简单等价物。这意味着除了基本的“加载C++库”以外,还有很少的代码需要维护,并且“混淆了它的签名以适合语言X”。它不是特定于节点。另一个好处是对于常见的共享库(例如在教程示例中给出的sqlite)。您可能并不关心它们具有的版本,或者想要用更多的C++代码包装它,需要编译才能使用它。使用FFI,你可以用JavaScript来封装预编译/安装的库。

以上是 用于访问现有C++功能的node-ffi与节点扩展 的全部内容, 来源链接: utcz.com/qa/265413.html

回到顶部