Cómo definir un mapa de tipos de swig para devolver caracteres sin firmar * a java
Tengo una aplicación Java que llama a una biblioteca c para realizar funciones criptográficas. Esta es una biblioteca personalizada implementada en c que necesitamos usar desde algunos programas de Java. Necesito una forma de definir un mapa de tipo SWIG que me permita llamar a una función que pasa bytearray desde Java y tratarlo como un puntero de carácter sin signo en la función C, donde la función c llena los datos y los devuelve a java
Extracto de mi presente archivo de interfaz infeliz es el siguiente
%module CryptoFacade
%pointer_functions(int, intp);
%pointer_functions(unsigned char, unsigned_charp);
int enCrypt(char* clearText, int clearLen,unsigned char* retCipherText, int *retCipherLen);
Y un extracto de mi infeliz código de Java es el siguiente. En el código a continuación, esperaba que la función de llamada a enCrypt me diera un búfer, pero me da un "corto" según el código generado. (Ver comentarios en el código)
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);
Supongo que debería cambiar la definición de mi interfaz a algo como a continuación, donde hago que mi tercer parámetro sea jbytearray y luego tengo que implementar un mapa de tipo que copiará el contenido apuntado por el puntero de carácter no firmado en el programa C a un bytearray Java.
Estoy perfectamente bien si tengo que especificar la longitud del contenido a 256 bytes, porque manejar longitudes arbitrarias puede ser complicado.
Alguien me puede indicar el lugar donde puedo encontrar un mapa de tipo de este tipo (soy nuevo en SWIG y no tengo experiencia en escribir mapas de tipos)
%module CryptoFacade
%pointer_functions(int, intp);
%pointer_functions(unsigned char, unsigned_charp);
int enCrypt(char* clearText, int clearLen, jbyteArray retCipherText, int *retCipherLen);