[JAVA] Gérez sans effort les classes et fonctions C ++ de Node.js à l'aide de SWIG

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.

Installation

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

Ecrire une trompette

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!

Recommended Posts

Gérez sans effort les classes et fonctions C ++ de Node.js à l'aide de SWIG
Lier le code Java et C ++ avec SWIG
Écrire du code à l'aide de classes et d'instances Ruby