Ho una funzione in C che sto cercando di chiamare da Java con JNA:Passando una classe Java in un void * parametro con JNA
int myCfunc(void *s, int *ls);
Secondo il JNA documentation il vuoto * richiede un com.sun.jna.Pointer
essere passato alla funzione. In java con JNA Credo suddetta funzione sarà avvolto come segue:
public interface myWrapper extends Library{
public int myCfunc(Pointer s, IntByReference ls);
}
Gli oggetti che devono legata al puntatore, e passato nel parametro s
saranno classi che implementano JNA Struttura quali:
public class myClass extends Structure{
public int x;
public int y;
public int z;
}
Sfortunatamente, il parametro ls
è un numero intero che rappresenta la lunghezza della classe in byte. Java non ha una funzione sizeof
, quindi questo aggiunge un po 'di complessità in più. L'altro problema principale che sto avendo è quello di garantire che sto passando correttamente il contenuto dell'oggetto alla memoria nativa e viceversa.
mio codice è simile al seguente:
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.ptr.IntByReference;
public void foo(){
myWrapper wrapper = (myWrapper) Native.loadLibrary("SomeDllWithLegacyCode", myWrapper.class);
myClass myObj = new myClass();
myObj.x = 1;
myObj.y = 2;
Pointer myPointer = myObj.getPointer();
int size = Native.getNativeSize(myClass.class);
IntByReference len = new IntByReference(size);
myObj.write(); //is this required to write the values in myObj into the native memory??
wrapper.myCfunc(myPointer, len);
myObj.read(); //does this read in the native memory and push the values into myObj??
myPointer.clear(size); //is this required to clear the memory and release the Pointer to the GC??
}
Ricevo un errore di che i dati passati è di dimensioni maggiori rispetto a quanto previsto dalla funzione C.
Il codice sopra riportato segue lo stesso tipo di passaggi as provided out in this answer a una domanda relativa a un problema simile, ma in C#. Ho provato e testato che funziona in C#.
La mia domanda è simile a another on Stackoverflow, ma che riguarda un puntatore a un IntByReference anziché un puntatore a una classe.