var ffi = require('ffi'); var mylibrary = ffi.Library('libmylibrary', { "foo": [ "int", ["int"] ], "bar": [ "int", [] ] });,c++,node.js,node.js-addon,node-ffi,C++,Node.js,Node.js Addon,Node Ffi" /> var ffi = require('ffi'); var mylibrary = ffi.Library('libmylibrary', { "foo": [ "int", ["int"] ], "bar": [ "int", [] ] });,c++,node.js,node.js-addon,node-ffi,C++,Node.js,Node.js Addon,Node Ffi" />

用于访问现有C+的节点ffi与节点扩展+;功能 我有一些C++代码,它在独立的C++应用程序中进行数值处理。我现在想在一个新的node.js应用程序中使用该代码 研究如何从NoDE.js访问C++代码,有两种选择: 编写node.js扩展 使用 节点FFI看起来是一个很好的访问现有库的选项,但是我想如果我使用节点FFI,我就必须编写一个C包装器来让我的C++访问?(这是我用VisualStudio在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 var mylib = require('./mylibrary.js'); var num = mylib.fooSync(1); // or mylib.foo(1, function(er, num){ }); 这将使C++函数可用作一个动态库方法。 这里是如何在JavaScript中封装这个,在您编译了C++ LIB作为LIbMyLab.DLL/SO://P> var ffi = require('ffi'); var mylibrary = ffi.Library('libmylibrary', { "foo": [ "int", ["int"] ], "bar": [ "int", [] ] });

用于访问现有C+的节点ffi与节点扩展+;功能 我有一些C++代码,它在独立的C++应用程序中进行数值处理。我现在想在一个新的node.js应用程序中使用该代码 研究如何从NoDE.js访问C++代码,有两种选择: 编写node.js扩展 使用 节点FFI看起来是一个很好的访问现有库的选项,但是我想如果我使用节点FFI,我就必须编写一个C包装器来让我的C++访问?(这是我用VisualStudio在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 var mylib = require('./mylibrary.js'); var num = mylib.fooSync(1); // or mylib.foo(1, function(er, num){ }); 这将使C++函数可用作一个动态库方法。 这里是如何在JavaScript中封装这个,在您编译了C++ LIB作为LIbMyLab.DLL/SO://P> var ffi = require('ffi'); var mylibrary = ffi.Library('libmylibrary', { "foo": [ "int", ["int"] ], "bar": [ "int", [] ] });,c++,node.js,node.js-addon,node-ffi,C++,Node.js,Node.js Addon,Node Ffi,你可以做很多更酷的事情。看看吧 如果这是一个节点库,只需将方法放在module.exports中。这里是上面C++代码的一个完整示例,具有同步和异步方法: var ffi = require('ffi'); var mylibrary = ffi.Library('libmylibrary', { "foo": [ "int", ["int"] ], "bar": [ "int", [] ] }); module.exports = { fooSync : mylibrary.f

你可以做很多更酷的事情。看看吧

如果这是一个节点库,只需将方法放在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
};
我没有用过,但是为您生成这种包装看起来很酷

如果我将此文件保存为mylibrary.js,我可以这样使用它:

#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
var mylib = require('./mylibrary.js');

var num = mylib.fooSync(1);

// or

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

});

至于“这更好吗?”这个问题,我想大多数情况下都是这样。如果您将方法设置为外部C,那么它们将在几乎所有其他语言中工作,其中一些语言还具有FFI,因此您可以用任何目标语言编写上述方法的简单等价物。这意味着除了基本的“加载C++ LIB”之外,还有很少的代码要维护,以及“围绕它的签名来感觉对语言X的正确”。它不是特定于节点的。另一个好处是共享共享库(如SQLite,在教程示例中给出)。您可能不关心它们到底有什么版本,或者想用更多的C++代码来包装它,需要编译使用它。使用FFI,您可以只使用javascript包装预编译/安装的库。

您在codeNo模板中使用了大量继承、虚拟函数和模板吗。没有虚拟功能。一些继承,虽然我可以修改代码以避免这种情况,如果需要的话。我认为编写包装会相对容易,但我同意,编写包装并不难。我想知道的是,我是否需要为节点ffi编写包装,以及这是否是一个比编写节点扩展更好的方法。看起来你不必这么做,从我刚刚读到的内容来看,你甚至可以使用客观的cGreat详细答案使其工作,非常感谢!我写这个问题已经有一段时间了,现在我同意我认为使用FFI路线可能比写扩展更简单。节点FFI生成看起来很有趣,但您可能需要考虑性能。如果你经常打电话,那么FFI的速度可能会慢一些。以下是一个详细的基准: