Mam funkcję w C, który próbuję zadzwonić z Java z JNA:Przechodząc klasy Java do void * parametr z JNA
int myCfunc(void *s, int *ls);
Według JNA documentation pustka * wymaga com.sun.jna.Pointer
być przekazane do funkcji. W Javy JNA wierzę, że powyższa funkcja zostanie zawinięty w następujący sposób:
public interface myWrapper extends Library{
public int myCfunc(Pointer s, IntByReference ls);
}
obiektów, które muszą połączony ze wskaźnikiem i przepuszczono parametru s
będzie klas, które wdrażają jna struktury, takie jak:
public class myClass extends Structure{
public int x;
public int y;
public int z;
}
Niestety, parametr ls
jest liczbą całkowitą reprezentującą długość klasy w bajtach. Java nie ma funkcji sizeof
, więc to dodaje trochę skomplikowania. Innym poważnym problemem, który mam, jest zapewnienie, że poprawnie przekazuję zawartość obiektu do pamięci macierzystej iz powrotem.
mój kod jest podobny do następującego:
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??
}
Dostaję błądże dane przekazywane jest z większego rozmiaru niż oczekuje przez funkcję C.
Powyższy kod z grubsza następujące kroki tego samego rodzaju as provided out in this answer na pytanie dotyczące podobnego problemu, ale w języku C#. Próbowałem i przetestowałem, że działa w języku C#.
Moje pytanie jest podobne do another on Stackoverflow, ale dotyczy raczej wskaźnika do klasy IntByReference niż wskaźnika do klasy.