2009-04-08 28 views

Trả lời

12

Swig làm cho JNI dễ dàng hơn.

Xét về tốc độ, tôi nghi ngờ sẽ có các biến thể tinh tế - tôi khuyên bạn nên chọn một cuộc gọi mà bạn biết bạn sẽ làm được rất nhiều và chuẩn cho tất cả các giải pháp được cung cấp.

+6

Downvoters: vui lòng giải thích, hoặc downvote là vô nghĩa ... –

10

JNI là nhanh nhất. JNA là rất chậm so với JNI (chi phí cuộc gọi có lẽ là một thứ tự độ lớn), nhưng nó là một thư viện tuyệt vời bởi vì nó làm cho truy cập bản địa dễ dàng như vậy. JNA là tuyệt vời nếu bạn cần thực hiện cuộc gọi không thường xuyên với một số API gốc. Nếu bạn quan tâm đến hiệu suất, tôi sẽ không sử dụng nó trong bất kỳ "vòng lặp chặt chẽ."

Tôi không chắc chắn nơi NativeCall phù hợp với quang phổ.

2

This blog entry tuyên bố rằng do các cơ chế nội quan được JNA sử dụng, nó sẽ chậm hơn đáng kể so với JNI. Tôi nghi ngờ rằng NativeCall sẽ sử dụng các cơ chế tương tự và do đó thực hiện theo cách tương tự.

Tuy nhiên bạn nên có lẽ điểm chuẩn dựa trên các đối tượng cụ thể bạn đang tham khảo và/hoặc marshalling giữa Java và C.

tôi sẽ đề nghị thứ hai của SWIG. Điều đó làm cho cuộc sống trở nên dễ dàng hơn (dễ dàng hơn) đối với giao tiếp Java/C.

+0

JNI không marshall. Tôi không nghĩ rằng JNA cũng vậy. Mã nguồn gốc và Java đều hoạt động với cùng một dữ liệu trong bộ nhớ. – erickson

+0

Bạn phải trải qua một số hình thức chuyển giao đối tượng - ngay cả khi đó chỉ là một tham chiếu con trỏ. –

+0

Phải, tôi không muốn mọi người bối rối rằng một số loại serialization đang diễn ra; nó chỉ là con trỏ. Chi phí chính là trong nội tâm. – erickson

3

Khá nhiều tham số ảnh hưởng đến hiệu suất giao diện giữa các ngôn ngữ lập trình: JVM chạy trên thiết bị nào, người phát triển nó (trong trường hợp nó không phải là Sun JVM thông thường), cho dù bạn cần gọi lại mã Java từ mã gốc , mô hình luồng của JVM trên hệ điều hành của bạn và mã gốc sẽ không đồng bộ như thế nào ...

Bạn không thể tìm thấy điểm chuẩn đáng tin cậy để đo lường chính xác những gì bạn cần, tôi sợ.

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