Parfois, vous souhaitez travailler avec des fonctions et des classes C ++ de Node.js. Par exemple, lorsque vous souhaitez écrire une interface graphique de code écrit en C ++ dans Electron ou Nw.js.
En général, il semble que Node-ffi soit utilisé lors de l'appel de code C ++ depuis Node. Cependant, quand je lis le Tutoriel, c'est un problème d'écrire quelque chose.
SWIG est connu comme un outil de création de liaison qui appelle des fonctions C / C ++ depuis Python ou Ruby. En fait, avec ce SWIG, vous pouvez facilement écrire un wrapper Javascript.
La version stable de SWIG est la 3.0.12, mais elle n'est pas compatible avec Node 7 ou version ultérieure. Utilisez la version de développement de Github. Notez que Node-gyp est nécessaire pour construire la bibliothèque, donc sinon, installez-la à partir de npm.
wget https://github.com/swig/swig/archive/master.zip
unzip master.zip
cd swig-master
./autogen.sh
./configure
make
sudo make install
Pour vous entraîner, lisez le code suivant de Node.
complex.hpp:
#include <string>
struct complex
{
complex(double r=0,double i=0);
double re;
double im;
double abs()const;
std::string to_str()const;
};
complex.cpp:
#include <cmath>
#include "complex.hpp"
complex::complex(double r,double i): re(r), im(i) {}
double complex::abs()const{ return std::sqrt(re*re+im*im); }
std::string complex::to_str()const{ return std::to_string(re)+"+"+std::to_string(im)+"i"; }
Par exemple, ce serait bien si ce code pouvait être appelé à partir du JS ci-dessous.
complex.js:
const Complex=require('./complex.node').complex;
let z=new Complex();
console.log (z.abs ()); // Je veux que vous affichez 0 z.re=3; z.im=4; console.log (z.abs ()); // Je veux que vous affichez 5 Attendez-vous à un affichage comme console.log (z.to_str ()); // 3 + 4i
Avec SWIG, vous n'avez qu'à écrire autant de trompettes.
complex.i:
% module complex // Définit un module visible de l'extérieur %{ #include "complex.hpp" // Les fonctions de ceci peuvent être vues de l'extérieur %}
% include "std_string.i" // Enveloppe std :: string dans la chaîne JS comme pour écrire ceci %include "complex.hpp"
Tout ce que vous avez à faire est d'écrire binding.gyp pour la construction et d'exécuter SWIG pour la construction.
binding.gyp:
{ "targets": [ {
"target_name": "complex",
"sources": [ "complex.cpp", "complex_wrap.cxx" ]
} ] }
Exécuter.
swig -javascript -node -c++ complex.i
node-gyp configure build
Déplacez le complex.node créé vers un emplacement approprié et exécutez node complex.js
...
0
5
3.000000+4.000000i
Facile!