2009-12-09 28 views
5

Nói rằng tôi có một C++ DLL với một phương pháp xuất khẩu duy nhất như:JNA - gọi phương pháp dựa trên C++ ví dụ thông qua trở lại từ DLL

CustomerProcessor* getInstance(); 

tức là nó chỉ đơn giản là trả về một thể hiện của lớp mà thực sự chứa các phương pháp tôi cần gọi.

Tôi biết tôi có thể ánh xạ phương thức getInstance() tới một Lớp trong Java bằng cách sử dụng JNA (mở rộng com.sun.jna.Library), lưu trữ cá thể CustomerProcessor trả về trong com.sun.jna.Pointer.

Sau đó tôi có thể ánh xạ điều này đến lớp CustomerProcessor để tôi có thể gọi các phương thức trên nó (và nếu có, làm thế nào)?

+0

theo câu hỏi này bạn không thể gọi phương thức C++ trong JNA: http://stackoverflow.com/questions/1556421/use-jni-instead-of-jna-to-call-native-code – dfa

Trả lời

2

Đối với bất kỳ định nghĩa tùy ý type* function(), bạn có thể ánh xạ phương thức bằng cách sử dụng JNA như trả về com.sun.jna.Pointer, nhưng bạn sẽ không thể gọi các phương thức trên đối tượng C++ từ JNA.

Cách giải quyết đơn giản này là viết thư viện giao diện C chỉ đơn giản gọi phương thức trên đối tượng cho bạn ... vì vậy nếu bạn có hàm số thành viên foo() bạn có thể xuất phương thức C từ mã C++ của mình:

extern "C" void bar(type* var){ 
    var->foo(); 
} 

Rõ ràng điều này sẽ thêm một số công việc cho bạn ... nhưng tôi nghi ngờ phí chuyển đổi thành JNI sẽ giống nhau.

+0

Tôi đã thực sự đã đi xuống con đường viết một wrapper C++, nhưng đã tự hỏi nếu có anyway để loại bỏ nó. Rất cám ơn vì đã làm rõ. – William

1

JNAerator (http://code.google.com/p/jnaerator/) có thể tạo điều kiện làm những gì bạn yêu cầu. Nó có một số hỗ trợ cho truy cập demangling và vtable (cần thiết để gọi * phương pháp này).

Các vấn đề liên quan