javascript - napi - ¿Cómo puedo usar una biblioteca C++ de node.js?
node-gyp (6)
¿Cómo puedo usar una biblioteca C ++ de node.js?
Cuidado con Swig y C ++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
No se recomienda ejecutar SWIG en archivos fuente C ++ (lo que aparecería en un archivo .C o .cxx). Aunque SWIG puede analizar declaraciones de clases de C ++, ignora las declaraciones que están desacopladas de su definición de clase original (las declaraciones se analizan, pero se pueden generar muchos mensajes de advertencia). Por ejemplo:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
Es raro tener una clase de C ++ limitada a un solo archivo .h.
Además, las versiones de swig que soportan JavaScript son swig-3.0.1 o posterior.
Hay una nueva respuesta a esa pregunta ahora. SWIG , a partir de la versión 3.0 parece proporcionar generadores de interfaz JavaScript para Node.js, Webkit y v8.
He estado usando SWIG extensamente para Java y Python por un tiempo, y una vez que entiendes cómo funciona SWIG, casi no hay esfuerzo (comparado con ffi o el equivalente en el idioma de destino) necesario para interconectar el código C ++ con los lenguajes que SWIG soportes.
Como un pequeño ejemplo, digamos que tiene una biblioteca con el encabezado 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;
}
};
Para usar esta clase en un nodo, simplemente escriba el siguiente archivo de interfaz SWIG (mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Crea el archivo de enlace binding.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
Ejecute los siguientes comandos:
swig -c++ -javascript -node mylib.i
node-gyp build
Ahora, ejecutando el nodo desde la misma carpeta, puede hacer:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
A pesar de que necesitábamos escribir 2 archivos de interfaz para un ejemplo tan pequeño, tenga en cuenta que no tuvimos que mencionar el constructor MyClass
ni el método sayHello
ninguna parte, SWIG descubre estos elementos y automáticamente genera interfaces naturales.
Mira node-ffi .
node-ffi es un complemento Node.js para cargar y llamar bibliotecas dinámicas usando JavaScript puro. Se puede usar para crear enlaces a bibliotecas nativas sin escribir ningún código C ++.
Puede usar emscripten para compilar el código de C ++ en js.
Puede usar una extensión node.js para proporcionar enlaces para su código C ++. Aquí hay un tutorial que cubre eso:
http://syskall.com/how-to-write-your-own-native-nodejs-extension