用于访问现有C++功能的node-ffi与节点扩展
我有一些现有的C++代码在独立的C++应用程序中进行数字处理。我现在想要在新的node.js应用程序中使用该代码。用于访问现有C++功能的node-ffi与节点扩展
研究如何从node.js的访问C++代码,有两个选项上来:
- 写Node.js的扩展
- 使用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