ben JNA ile Java dan aramaya çalışıyorum C bir işlevi var olan * bir boşluğa parametreyi bir Java sınıfı geçme: JNA documentation göreJNA
int myCfunc(void *s, int *ls);
boşluk * Bir com.sun.jna.Pointer
olmak gerektirir işleve geçti.
s
geçirilen gereken
public interface myWrapper extends Library{
public int myCfunc(Pointer s, IntByReference ls);
}
nesneleri: JNA Java ile aşağıdaki gibi yukarıdaki fonksiyon sarılacak inanıyoruz
public class myClass extends Structure{
public int x;
public int y;
public int z;
}
Maalesef, ls
parametresi, sınıfın bayt cinsinden uzunluğunu temsil eden bir tamsayıdır. Java'nın bir sizeof
işlevi yoktur, bu yüzden fazladan bir karmaşıklık ekler. Yaşadığım diğer önemli sorun, nesnenin içeriklerini doğal belleğe ve geriye doğru şekilde iletiyorum.
benim kod aşağıdaki benzer:
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??
}
Ben iletilen verileri bir hata alıyorum C işlevi tarafından beklenen daha büyük boyutta olduğunu. Yukarıdaki kod, benzer bir sorunla ilgilenen bir soruya, ancak C# 'da aynı şekilde as provided out in this answer adımlarını izleyen yukarıdaki kodları takip eder. C# 'de çalıştığını denedim ve test ettim.
Soruma benzer another on Stackoverflow, ancak bir sınıf için bir işaretçi yerine bir IntByReference bir Pointer ile ilgilenir. arasında