2012-11-22 27 views
6

Tôi đang cố gắng gọi hàm C++ có trong tệp dll, hàm C++ lấy đối tượng cấu trúc làm tham số bằng tham chiếu và hàm sẽ gán giá trị trong hàm đó,JNA: mục đích của getFieldOrder() trong lớp cấu trúc

Vì vậy, trong ứng dụng java của tôi để vượt qua đối tượng cấu trúc cho một chức năng tôi đã viết như thế này:

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

lớp học chính của tôi

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

khi tôi đã cố gắng này, nó là cho tôi

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

vì vậy tôi phải làm gì? Có vấn đề gì với hàm getFieldOrder()?

bất cứ ai có thể giải thích cho tôi chính xác JNA sẽ chuyển đổi đối tượng lớp trong java thành đối tượng cấu trúc trong C++ như thế nào?

thực sự ngoại lệ đang xảy ra khi gọi hàm nhưng tôi không hiểu tại sao nó lại xảy ra như vậy.

Trả lời

1

From the JavaDoc:

Return tên trường của cấu trúc này theo đúng thứ tự của họ

Tuy nhiên, bạn sẽ nhanh chóng chạy lên chống lại một thực tế rằng bạn đang cố gắng để ánh xạ một JNA Structure lên một Lớp C++, mà chỉ đơn giản là sẽ không hoạt động. JNA không cung cấp bất kỳ bản dịch tự động nào giữa các lớp JNA và C++.

EDIT

Để được rõ ràng:

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

đó là cách duy nhất tôi biết làm thế nào cấu trúc của C++ được đại diện trong java sử dụng JNA và gửi đối tượng cấu trúc như tham số chức năng, như vậy là những gì chỉ arraylist tôi đang sử dụng trong mã của tôi là trong ** getfieldoreder() ** chức năng vì vậy nghĩ rằng thực hiện chức năng là vấn đề và yêu cầu làm rõ –

+0

Tôi đã thử nó nhưng nó là cho tôi biên dịch lỗi thời gian nói Loại không khớp: không thể chuyển đổi từ ngắn thành Chuỗi ... dưới dạng biến số i của tôi s của loại ngắn nhưng chúng tôi đang gán nó vào mảng array.so i riêng biệt được giao mỗi biến như thể hiện trong mã trong bài. vì vậy nó không giải quyết được vấn đề của tôi. –

+0

Vui lòng đọc phụ lục cho câu trả lời ở trên. – technomage