2012-11-22 13 views
6

Sto cercando di chiamare la funzione C++ presente in un file dll, la funzione C++ accetta l'oggetto struttura come parametro per riferimento e la funzione assegnerà i valori in tale funzione,JNA: qual è lo scopo di getFieldOrder() nella classe di struttura

Così nel mio applicazione java per passare oggetto la struttura ad una funzione l'ho scritto in questo modo:

interface someinterface extends Library{ 
public static class strctclass extends Structure 
{ 
    public static class ByReference extends tTIDFUDeviceInfo implements Structure.ByReference {} 
    public short xxx=0; 
    public char yyy='0'; 
    public boolean zzz=false 
    public String www=new String(); 
    protected ArrayList getFieldOrder() { 
     // TODO Auto-generated method stub 
     ArrayList fields = new ArrayList(); 
    fields.add(Arrays.asList(new short{xxx})); 
    fields.add(Arrays.asList(new char{yyy})); 
    fields.add(Arrays.asList(new boolean{zzz})); 
    fields.add(Arrays.asList(new String{www})); 
    return fields; 
} 
someinterface instance=(someinterface) Native.loadLibrary("mydll", someinterface.class); 
int somefunction(strctclass.ByReference strobject); 
} 

mia classe principale

public class Someclass 
{ 
public static void main(String args[]) 
{ 
someinterface.strctclass.ByReference sss=new someinterface.strctclass.ByReference(); 
someinterface obj=someinterface.instance; 
obj.somefunction(sss); 
} 
} 

quando ho provato questo è dandomi la funzione

java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.Comparable 

così che cosa devo fare? c'è qualche problema in getFieldOrder()?

qualcuno può spiegarmi come esattamente JNA convertirà l'oggetto di classe in Java per strutturare l'oggetto in C++?

in realtà si sta verificando un'eccezione nel chiamare la funzione, ma non capisco perché succede così.

risposta

1

From the JavaDoc:

Return nomi dei campi di questa struttura nel loro giusto ordine

Tuttavia, si sta per eseguire rapidamente contro il fatto che si sta tentando di mappare un JNA Structure su un Classe C++, che semplicemente non funzionerà. JNA non fornisce alcuna traduzione automatica tra le classi JNA e C++.

EDIT

essere espliciti:

protected List<String> getFieldOrder() { 
    return Arrays.asList(new String[] { "xxx", "yyy", "zzz", "www" }); 
} 
+0

che è l'unico modo che conosco struttura del C++ è rappresentata in Java utilizzando JNA e inviare quell'oggetto struttura come parametro di funzione, quindi qual è il soluzione a tale eccezione, l'unico arraylist che sto usando nel mio codice è in ** getfieldoreder() ** funzione quindi ho pensato che l'implementazione della funzione è il problema e ho chiesto chiarimenti –

+0

L'ho provato ma mi sta dando errore di compilazione dicendo Tipo mancata corrispondenza: impossibile convertire da breve a stringa ... come la mia variabile xxx i s di tipo short ma lo stiamo assegnando alla stringa array.so ho assegnato separatamente ciascuna variabile come mostrato nel codice in post. quindi non risolve il mio problema. –

+0

Si prega di leggere l'addendum alla risposta sopra. – technomage

Problemi correlati