[JAVA] Mit SWIG können Sie mühelos C ++ - Klassen und -Funktionen aus Node.js verarbeiten

Manchmal möchten Sie mit C ++ - Funktionen und Klassen von Node.js arbeiten. Zum Beispiel, wenn Sie eine GUI mit Code schreiben möchten, der in C ++ in Electron oder Nw.js geschrieben wurde.

Im Allgemeinen scheint es, dass Node-ffi verwendet wird, wenn C ++ - Code von Node aufgerufen wird. Wenn ich jedoch das Tutorial lese, ist es mühsam, etwas zu schreiben.

SWIG ist als Tool zum Erstellen von Bindungen bekannt, das C / C ++ - Funktionen von Python oder Ruby aus aufruft. Tatsächlich können Sie mit diesem SWIG problemlos einen Javascript-Wrapper schreiben.

Installation

Die stabile Version von SWIG ist 3.0.12, dies ist jedoch nicht mit Knoten 7 oder höher kompatibel. Verwenden Sie die Entwicklungsversion von Github. Beachten Sie, dass Node-gyp erforderlich ist, um die Bibliothek zu erstellen. Wenn nicht, installieren Sie sie ab npm.

wget https://github.com/swig/swig/archive/master.zip
unzip master.zip
cd swig-master
./autogen.sh
./configure
make
sudo make install

Schreiben Sie eine Trompete

Lesen Sie zum Üben den folgenden Code vom Knoten.

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

Zum Beispiel wäre es schön, wenn dieser Code von der JS unten aufgerufen werden könnte.

complex.js:

const Complex=require('./complex.node').complex;

let z=new Complex();

console.log (z.abs ()); // Ich möchte, dass Sie 0 anzeigen z.re=3; z.im=4; console.log (z.abs ()); // Ich möchte, dass Sie 5 anzeigen Erwarten Sie eine Anzeige wie console.log (z.to_str ()); // 3 + 4i

Mit SWIG müssen Sie nur so viele Trompeten schreiben.

complex.i:

% Modulkomplex // Definieren Sie ein Modul, das von außen sichtbar ist %{ #include "complex.hpp" // Funktionen in diesem sind von außen sichtbar %}

% include "std_string.i" // Wickle std :: string in JS-String, genau wie beim Schreiben %include "complex.hpp"

Sie müssen lediglich binding.gyp für den Build schreiben und SWIG zum Erstellen ausführen.

binding.gyp:

{ "targets": [ { 
    "target_name": "complex",
    "sources": [ "complex.cpp", "complex_wrap.cxx" ]
} ] }

Lauf.

swig -javascript -node -c++ complex.i
node-gyp configure build

Verschieben Sie den erstellten complex.node an einen geeigneten Ort und führen Sie node complex.js aus ...

0
5
3.000000+4.000000i

Einfach!

Recommended Posts

Mit SWIG können Sie mühelos C ++ - Klassen und -Funktionen aus Node.js verarbeiten
Verknüpfen Sie Java- und C ++ - Code mit SWIG
Schreiben Sie Code mit Ruby-Klassen und -Instanzen