2012-11-22 10 views
6

में getFieldOrder() का उद्देश्य क्या है, मैं एक डीएलएल फ़ाइल में मौजूद सी ++ फ़ंक्शन को कॉल करने का प्रयास कर रहा हूं, सी ++ फ़ंक्शन संदर्भ वस्तु पैरामीटर को संदर्भ के अनुसार पैरामीटर के रूप में लेता है, और फ़ंक्शन उस फ़ंक्शन में मान निर्दिष्ट करेगा,जेएनए: संरचना वर्ग

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); 
} 

अपने मुख्य वर्ग

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

जब मैं इस की कोशिश की है: क्रम में एक समारोह के लिए संरचना वस्तु पारित करने के लिए मैं इस तरह लिखा मेरी जावा आवेदन में

तो मुझे

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

तो मैं क्या करूँ? क्या getFieldOrder() फ़ंक्शन में कोई समस्या है?

क्या कोई मुझे बता सकता है कि वास्तव में जेएनए क्लास ऑब्जेक्ट को जावा में संरचना ऑब्जेक्ट में सी ++ में कैसे परिवर्तित करेगा?

वास्तव में फ़ंक्शन को कॉल करने में अपवाद हो रहा है लेकिन मुझे यह नहीं लगता कि ऐसा क्यों हो रहा है।

उत्तर

1

From the JavaDoc:

वापसी उनके उचित क्रम

हालांकि इस संरचना के क्षेत्र के नाम, आप जल्दी से तथ्य यह है कि आप एक पर एक JNA Structure मैप करने के लिए प्रयास कर रहे हैं के खिलाफ चलाने के लिए जा रहे हैं सी ++ वर्ग, जो बस काम नहीं करेगा। जेएनए जेएनए और सी ++ कक्षाओं के बीच कोई स्वचालित अनुवाद प्रदान नहीं करता है।

संपादित

स्पष्ट होने के लिए:

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

एक ही रास्ता मैं कैसे सी ++ की संरचना JNA का उपयोग कर जावा में प्रतिनिधित्व किया और समारोह पैरामीटर के रूप में है कि संरचना वस्तु भेज रहा है पता है कि, तो क्या है उस अपवाद का समाधान? मेरे कोड में उपयोग की जाने वाली एकमात्र सरणी सूची ** getfieldoreder() ** फ़ंक्शन में है, इसलिए सोचा गया कि फ़ंक्शन कार्यान्वयन समस्या है और स्पष्टीकरण के लिए पूछा –

+0

मैंने कोशिश की लेकिन यह मुझे संकलन समय त्रुटि कह रहा है मिस्चैच: छोटे से स्ट्रिंग में कनवर्ट नहीं कर सकता ... मेरे xxx वैरिएबल i के रूप में एस प्रकार का छोटा है लेकिन हम इसे स्ट्रिंग सरणी के लिए असाइन कर रहे हैं। इसलिए मैंने पोस्ट में कोड में दिखाए गए प्रत्येक वैरिएबल को अलग से असाइन किया है। इसलिए यह मेरी समस्या का समाधान नहीं करता है। –

+0

कृपया उपरोक्त उत्तर में परिशिष्ट पढ़ें। – technomage

संबंधित मुद्दे