J'ai une fonction en C que je suis en train d'appeler à partir de Java avec JNA:Le passage d'une classe Java dans un vide * paramètre avec la JNA
int myCfunc(void *s, int *ls);
Selon le JNA documentation le vide * nécessite un com.sun.jna.Pointer
être passé à la fonction. En java avec la JNA, je crois que la fonction ci-dessus sera enveloppé comme suit:
public interface myWrapper extends Library{
public int myCfunc(Pointer s, IntByReference ls);
}
Les objets qui doivent lié au pointeur, et passé en paramètre s
seront classes qui mettent en œuvre la structure de la JNA, telles que:
public class myClass extends Structure{
public int x;
public int y;
public int z;
}
Malheureusement, le paramètre ls
est un entier représentant la longueur de la classe en octets. Java n'a pas de fonction sizeof
, ce qui ajoute un peu de complexité. L'autre problème majeur que j'ai est de m'assurer que je passe correctement le contenu de l'objet à la mémoire native et vice-versa.
mon code est similaire à ce qui suit:
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??
}
Je reçois une erreur qui les données transmises est d'une taille plus grande que devrait par la fonction C.
Le code ci-dessus suit à peu près le même type d'étapes as provided out in this answer à une question traitant d'un problème similaire, mais en C#. J'ai essayé et testé que cela fonctionne en C#.
Ma question est similaire à another on Stackoverflow, mais cela concerne un pointeur vers un IntByReference plutôt qu'un pointeur vers une classe.