tutorial node c++ node.js node.js-addon node-ffi

tutorial - node-ffi vs. extensión de nodo para acceder a la funcionalidad de C++ existente



c++ node js (1)

Tengo un código C ++ existente que realiza el procesamiento numérico dentro de una aplicación C ++ independiente. Ahora quiero usar ese código dentro de una nueva aplicación node.js.

Investigando cómo acceder al código C ++ desde node.js, aparecen dos opciones:

  1. Escribir una extensión de node.js
  2. Utiliza node-ffi

node-ffi parece ser una buena opción para acceder a las bibliotecas existentes, pero ¿estoy seguro de que si uso node-ffi tendría que escribir un contenedor de C para que mi C ++ sea accesible? (Esta era la única forma en que podía obtener un caso de prueba simple para trabajar en Windows con Visual Studio).

En mi caso donde mi código fuente ya está en C ++, no en C, ¿cuáles son las consideraciones al elegir entre las dos opciones anteriores?


FFI trabaja con librerías dinámicas de C Esto significa que tienes que exponer tu biblioteca dinámica externamente. En C ++, haces esto con extern "C", así:

#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

Esto hará que su función de C ++ esté disponible para C-things, como un método de biblioteca dinámica.

Aquí es cómo envuelve esto en javascript, después de haber compilado su lib C ++ como libmylibrary.dll / .so:

var ffi = require(''ffi''); var mylibrary = ffi.Library(''libmylibrary'', { "foo": [ "int", ["int"] ], "bar": [ "int", [] ] });

Hay muchas cosas geniales que puedes hacer. Échale un vistazo, here

Si esta es una biblioteca de nodos, simplemente ponga sus métodos en module.exports. Este es un ejemplo completo de una envoltura del código C ++ anterior, con métodos síncronos y asíncronos:

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 };

No he usado node-ffi-generate , pero se ve muy bien para generar este tipo de envoltorios para ti.

Si guardo este archivo como mylibrary.js, podría usarlo así:

var mylib = require(''./mylibrary.js''); var num = mylib.fooSync(1); // or mylib.foo(1, function(er, num){ });

En cuanto a la pregunta de "¿es mejor?" Creo que sí, para la mayoría de las cosas. Si hace que sus métodos sean externos a C, funcionarán en casi todos los demás idiomas, algunos de los cuales también tienen FFI, por lo que escribiría el equivalente simple de los anteriores en el idioma de destino. Esto significa muy poco código para mantener, aparte de la "carga básica de C ++ lib", y "jugar con su firma para sentirse bien para el lenguaje X". No es específico para el nodo. Otra ventaja es para las bibliotecas compartidas comunes (como sqlite, que se da en el ejemplo del tutorial). Es posible que no le importe exactamente qué versión tienen, o si desea envolverlo con más código C ++, que necesita compilarse para usarlo. Usando FFI, puedes envolver una biblioteca pre-compilada / instalada con solo javascript.