Answers:
看一下node-ffi。
node-ffi是一个Node.js插件,用于使用纯JavaScript加载和调用动态库。它可以用来创建到本机库的绑定,而无需编写任何C ++代码。
现在对该问题有了新的答案。从版本3.0开始,SWIG似乎为Node.js,Webkit和v8 提供了JavaScript接口生成器。
我已经在Java和Python上广泛使用SWIG一段时间了,一旦您了解SWIG的工作原理,就几乎不需要花力气(相比于ffi或目标语言中的等效语言)将C ++代码与SWIG语言连接支持。
举一个小例子,假设您有一个标头为myclass.h的库:
#include<iostream>
class MyClass {
int myNumber;
public:
MyClass(int number): myNumber(number){}
void sayHello() {
std::cout << "Hello, my number is:"
<< myNumber <<std::endl;
}
};
为了在节点中使用此类,您只需编写以下SWIG接口文件(mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
创建绑定文件binding.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
运行以下命令:
swig -c++ -javascript -node mylib.i
node-gyp build
现在,从同一文件夹运行节点,您可以执行以下操作:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
即使我们需要为这样一个小示例编写2个接口文件,也请注意我们不必MyClass
在sayHello
任何地方提及构造函数或方法,SWIG会发现这些内容并自动生成自然接口。
std::vector<>
例如,just %include "std_vector.i"
),并且您可以在javascript方面以某种尴尬的方式对其进行操作。请注意,与您自己编写FFI相比,此方法仍然更容易,更安全。
您可以使用node.js扩展为您的C ++代码提供绑定。这是一个涵盖了这一点的教程:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
您可以使用emscripten将C ++代码编译为js。
这是一篇有关通过Node.js将C ++投入网络的有趣文章。
将C ++代码与Node.js应用程序集成的三种通用方法-尽管每个类别中都有很多变体:
- 自动化-在子进程中将C ++作为独立应用程序调用。
- 共享库-将C ++例程打包到共享库(dll)中,然后直接从Node.js调用这些例程。
- Node.js插件-将您的C ++代码编译为本地Node.js模块/插件。
谨记swig和C ++:http : //www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
不建议在C ++源文件(会在.C或.cxx文件中显示)上运行SWIG。即使SWIG可以解析C ++类声明,它也会忽略与其原始类定义解耦的声明(对声明进行了解析,但是可能会生成许多警告消息)。例如:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
很少将C ++类限制为仅一个.h文件。
另外,支持JavaScript的swig版本是swig-3.0.1或更高版本。
foo::bar
无论如何,我不知道SWIG将如何处理。类成员的定义全与实现有关。SWIG生成的包装都与接口有关。
extension
。Google c ++ nodejs扩展