Llame a la biblioteca de C ++ desde Node.js (complementos de nodo / node-ffi)

Estoy tratando de integrar una biblioteca externa de C ++ (tengo acceso al archivo .so, así como a los archivos de encabezado) en mi aplicación Node.js.

Después de mucha investigación mis opciones se reducen a:

  1. Escribiendo un addon de nodo

  2. Utiliza node-ffi

De la definición de gitHub de node-ffi no puedo decir si funcionará o no directamente en las bibliotecas de C ++:

node-ffi es un complemento de Node.js para cargar y llamar bibliotecas dinámicas utilizando JavaScript puro. Puede utilizarse para crear enlaces a bibliotecas nativas sin escribir ningún código C ++.

Así que las preguntas que tengo son:

  • ¿La opción 1) implica reescribir de alguna manera la biblioteca externa de C ++?
  • ¿Puede node-ffi llamar directamente a las bibliotecas de C ++ sin ningún tipo de envoltorio de C que tendría que escribir?

No soy un experto cuando se trata de C / C ++, por lo que si me faltó algo básico para que pueda responder, hágamelo saber para poder mejorar mi pregunta.

node-ffi parece ser principalmente para progtwigs en C. Pasé por esto en la última semana y encontré mucha mejor suerte con los complementos de nodo. Lo que tienes que hacer es escribir un shim entre el código C ++ en la biblioteca y node.js. En mi caso, necesitaba codificar y decodificar paquetes para un protocolo de seguridad, así que hice buffers de nodos que contenían los paquetes, y escribí código C ++ que sacó los datos de los buffers, luego envié los datos a mi código C que codificó y paquetes decodificados.

Esta página: http://luismreis.github.io/node-bindings-guide/docs/returning.html tiene algunos ejemplos excelentes de cómo ingresar y salir datos de los buffers de node.js en C ++.

nbind ahora hace que sea más fácil escribir complementos de Node.js utilizando bibliotecas externas de C ++. Básicamente, creas un nuevo archivo fuente que incluye los encabezados de la biblioteca, los encabezados nbind y algunas llamadas de macro que enumeran las clases y los métodos de la biblioteca. Entonces nbind se encarga del rest.

libui-node es un ejemplo del mundo real que utiliza nbind para llamar a libui para generar interfaces de usuario con widgets nativos desde Node.js. También hay un breve tutorial sobre cómo crear enlaces para vg , una biblioteca de C ++ relacionada con bioinformática.

¿Qué falta en la otra respuesta? Estoy felíz de ayudar. El ejemplo del código allí está escrito en C ++. Estoy ilustrando cómo las personas (que hacen bibliotecas en C o C ++) definen una interfaz externa para que otros la consumn. El punto de ffi es que escribes tu envoltorio en cualquier idioma que estés usando (en este caso, javascript) en lugar de C / C ++ (como en el caso de las extensiones de nodo). ya tiene una interfaz, solo necesita escribir código de envoltorio en javascript para decirle al nodo cómo funciona, en lugar de escribir algo en C ++ y exponerlo en una biblioteca de nodejs nativa.

Hay una forma bastante fácil de vincular cualquier biblioteca ( .so .dll .a ). Debe agregar la biblioteca con la ruta correcta en el archivo binging.gyp :

 { "targets": [ { "target_name": "addon", "sources": [ "hello.cc" ], "libraries": [ "path/toYourLibrary/yourLibName.dll or yourLibName.so" ] } ] } 

También hay una forma más sencilla de escribir buenos complementos usando nan . Compruebe el enlace para más información enlace github

    Intereting Posts