FFI funziona con librerie C dinamiche. Ciò significa che devi esporre esternamente la tua libreria dinamica. In C++, si esegue questa operazione con extern "C", in questo modo:
#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
Questo renderà la vostra funzione C++ a disposizione C-cose, come un metodo libreria dinamica.
Ecco come si avvolgono questo in javascript, dopo aver compilato il vostro lib C++ come libmylibrary.dll/.so:
var ffi = require('ffi');
var mylibrary = ffi.Library('libmylibrary', {
"foo": [ "int", ["int"] ],
"bar": [ "int", [] ]
});
Ci sono un sacco più fredde cose che si possono fare. Controllalo, here
Se questa è una libreria di nodi, inserisci i tuoi metodi in module.exports. Ecco un esempio completo di un involucro del codice C++ sopra, con sincrone & metodi asincroni:
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
};
Non ho usato node-ffi-generate, ma sembra piuttosto fresco per la generazione di questo genere di wrapper per voi.
Se ho salvato questo file come mylibrary.js, ho potuto usare in questo modo: "è meglio"
var mylib = require('./mylibrary.js');
var num = mylib.fooSync(1);
// or
mylib.foo(1, function(er, num){
});
Per quanto riguarda la domanda di Penso di sì, per la maggior parte delle cose. Se rendi i tuoi metodi extern C, funzioneranno in quasi tutte le altre lingue, alcune delle quali hanno anche FFI, quindi dovresti scrivere l'equivalente semplice di quanto sopra in qualsiasi lingua di destinazione. Questo significa pochissimo codice da mantenere, oltre al semplice "caricare C++ lib", e "scherzare con la sua firma per sentirsi bene per il linguaggio X". Non è specifico per il nodo. Un altro bonus è per le comuni librerie condivise (come sqlite, dato nell'esempio tutorial). Forse non ti interessa esattamente quale versione hanno, o vuoi avvolgerla con più codice C++, che deve essere compilato per usarlo. Usando FFI, puoi racchiudere una lib pre-compilata/installata con solo javascript.
Usi un sacco di ereditarietà, funzioni virtuali e modelli nel codice – aaronman
Nessun modello. Nessuna funzione virtuale. Qualche eredità, anche se potrei modificare il codice per evitarlo se necessario. – pancake
Penso che sarebbe relativamente facile scrivere i wrapper di – aaronman