Übergabe von Byte [] von Java nach C ++

9

Ich versuche, ein Byte [] param mit binären Daten und einem String-Parameter von Java an C ++ - Code zu übergeben, indem ich SWIG .

Hier sind meine .i und .cpp Dateien:

mein_modul.i

%Vor%

my_module.cpp

%Vor%

Die generierte Methode im Java-Wrapper:

%Vor%

Wie kann ich eine .i-Datei definieren, die einen Java-Wrapper generiert, mit dem ich byte [] anstelle von SWIGTYPE_p_unsigned_char an die compress_buffer_to_file-Methode übergeben kann oder alternativ? Wie verknüpfe ich ein vorhandenes Byte [] auf der Java-Seite mit einem SWIGTYPE_p_unsigned_char?

Ich habe versucht, typemap ohne Erfolg zu verwenden.

    
Black0ut 03.11.2015, 16:46
quelle

1 Antwort

3

SWIG soll eine Konvertierung zwischen Java und C ++ Typen durchführen, nämlich

  1. Java byte[] bis unsigned char * und
  2. String bis char * .

Die allgemeinen Werkzeuge für solche Konvertierungen sind SWIG Typemaps . Praktischerweise werden viele bereits von SWIG bereitgestellt und müssen einfach angewendet werden. Sehen Sie sich die Java typemap-Dokumentation an.

Die letzte Konvertierung ( String in char * ) wird automatisch von SWIG ausgeführt (mit vordefinierten Typmaps, die char * Argumente entsprechen).

Vordefinierte Typmaps verwenden

Eine Standardkonvertierung, die der von Ihnen gewünschten sehr ähnlich ist ( byte[] bis char * ), wird von den in der Datei definierten " char * BYTE " Typemaps übernommen. various.i . Um es zu verwenden, müssen Sie nur

hinzufügen %Vor%

am Anfang der SWIG-Schnittstellendatei, wobei buffer_variable_name der Name der Variablen im Funktionsargument ist (typemaps kann mit dem Namen verglichen werden). Weitere Informationen finden Sie in der allgemeinen typemap-Dokumentation und in der Java typemap-Dokumentation .

Dies ist jedoch nicht genau das, was Sie wollen, da Ihre Funktion ein unsigned char * benötigt. Wenn Sie java.nio.Buffer anstelle von byte[] auf der Java-Seite verwenden (die über allocateDirect zugewiesen werden muss), gibt es in various.i eine andere Gruppe von Typmasken, die über

verwendet werden können %Vor%

Schreiben Sie Ihre "eigenen" Typemaps

In Ihrem Fall möchten Sie im Wesentlichen die gleichen wie die bereitgestellten " char * BYTE " Typemaps, aber für Funktionen, die unsigned char * verwenden. Sie können diese also einfach von various.i in eine neue Datei% co_de kopieren % und passe sie ein wenig an:

ubyte.i

%Vor%

Verwenden Sie diese auf die gleiche Weise, indem Sie oben in der SWIG-Schnittstellendatei hinzufügen:

%Vor%

Wenn Sie diese vordefinierten Typmasken als grundlegendes Beispiel verwenden und die Dokumente lesen, können Sie bei Bedarf eigene benutzerdefinierte Typmasken schreiben.

Hoffe, das hilft.

    
m7thon 05.11.2015, 11:43
quelle

Tags und Links