So definieren Sie eine Swig-Typkarte für die Rückgabe von nicht signierten Zeichen * an Java

Ich habe eine Java-Anwendung, die eine c-Bibliothek zum Ausführen von Kryptofunktionen aufruft. Dies ist eine benutzerdefinierte Bibliothek, die in c implementiert ist und die von einigen Java-Programmen verwendet werden muss. Ich brauche eine Möglichkeit, um eine SWIG-Typkarte zu definieren, mit der ich eine Funktion aufrufen kann, die von Java aus als bytearray übergeben wird, und sie als vorzeichenlosen Zeichenzeiger in einer C-Funktion behandeln kann, in der die c-Funktion Daten füllt und an Java zurückgibt

Auszug aus meiner jetzigen unglücklichen Interface-Datei ist wie folgt

%module  CryptoFacade

%pointer_functions(int, intp);
%pointer_functions(unsigned char, unsigned_charp);

int enCrypt(char* clearText, int clearLen,unsigned char* retCipherText, int *retCipherLen);

Und der Auszug aus meinem unglücklichen Java-Code lautet wie folgt. Im folgenden Code habe ich erwartet, dass der Aufruf der enCrypt-Funktion mir einen Puffer gibt, aber er gibt mir einen "Kurzschluss" gemäß dem generierten Code. (Siehe Kommentare im Code)

class MainLoader {
static {
     System.loadLibrary("dccasecuJ"); //Load my crypto library
}

 public static void main(String[] args) {

 // Define the parameters to be passed by reference 
 SWIGTYPE_p_int retCipherLen=CryptoFacade.new_intp();
 SWIGTYPE_p_unsigned_char retCipherText =
            CryptoFacade.new_unsigned_charp();

CryptoFacade myFacade=new CryptoFacade();   

// Call crypto library function. First two are value parameters, next two are return
myFacade.enCrypt("STRING-TO-ENCRYPT", 17, retCipherText, retCipherLen);

// The length I get back in fourth parameter is just fine 
int gotLen= CryptoFacade.intp_value(retCipherLen); 

//The value I get for the Ciphertext though is a "short" ... no good 
// I need a byte[] in java that has the ciphertext
short gotText= CryptoFacade.unsigned_charp_value(retCipherText);

Ich schätze, ich sollte meine Schnittstellendefinition wie folgt ändern, wo ich meinen dritten Parameter zu einem jbytearray mache und dann eine Typmap implementieren muss, die den Inhalt, auf den der nicht signierte Zeichenzeiger im C-Programm zeigt, in ein java bytearray kopiert.

Ich bin vollkommen in Ordnung, wenn ich die Länge des Inhalts auf 256 Bytes festlegen muss, da der Umgang mit beliebigen Längen schwierig sein kann.

Kann mir jemand einen Hinweis geben, wo ich eine solche Typenkarte finden kann? (Ich bin neu bei SWIG und habe keine Erfahrung mit dem Schreiben von Typenkarten.)

%module  CryptoFacade

%pointer_functions(int, intp);
%pointer_functions(unsigned char, unsigned_charp);

int enCrypt(char* clearText, int clearLen, jbyteArray retCipherText, int *retCipherLen);

Antworten auf die Frage(1)

Ihre Antwort auf die Frage