2010-06-25 11 views
1

J'ai eu du mal à trouver des exemples sur l'exemple de void * dans JNA. J'essaie de comprendre comment utiliser Pointer dans la JNA.Void * exemple pour JNA

Par exemple

EN C:

int PTOsetApiOpt(int iOpt,void* lpValue,int iLen) 

Parameters: iOpt: int 
lpData: address from which data should be read. 
iLen: length of data 
returns int values : 0 as success or -1 as failure. 

Comment pouvons-nous écrire que Java à l'aide de la JNA? Je l'ai essayé en JAVA

public MyTest{ 

public interface MyLibrary extends Library { 
    public int PTOsetApiOpt(int iOpt,Pointer lpValue,int iLen); 

} 
public static void main(String[] args) { 
    MyLibrary myLib = (MyLibrary)MyLibrary.INSTANCE; 
    int result = myLib.PTOsetApiOpt(1,new Pointer(0),1024); 
} 

Je reçois accident JVM lorsque myLib.PTOsetApiOpt est invoquée. Je suppose que c'est à cause de la nouvelle déclaration Pointer. Comment puis-je créer un pointeur et l'utiliser comme paramètre sans crash JVM? J'ai été coincé dessus pendant 2 jours. Tous les conseils seraient super. Merci d'avance.

Cordialement, -Vid-

Répondre

1

Je pense que je l'ai compris.

Voilà comment je l'ai écrit en Java ..

void * lpValue peut être tout type. Donc, en C, il attend l'adresse de la valeur int.

public MyTest{ 

public interface MyLibrary extends Library { 
    public int PTOsetApiOpt(int iOpt,Pointer lpValue,int iLen); 

} 
public static void main(String[] args) { 
    MyLibrary myLib = (MyLibrary)MyLibrary.INSTANCE; 
    IntByReference ir = new IntByReference(1); 
    //got a result as 0 instead of -1. 
    int result = myLib.PTOsetApiOpt(1, ir.getPointer() , ir.getPointer().SIZE); 
} 
2

Déclarez votre méthode pour prendre IntByReference comme un argument, alors vous ne devez pas appeler ByReference.getPoint() lorsque vous appelez la méthode.