2009-07-31 39 views
7

Tôi có một chương trình Java chủ yếu là GUI và nó hiển thị dữ liệu được ghi vào tệp xml từ công cụ dòng lệnh C++. Bây giờ tôi muốn thêm một nút vào chương trình java để làm mới dữ liệu. Điều này có nghĩa là chương trình của tôi phải gọi hàm C++.Cách gọi chức năng C++ từ java

Cách tốt nhất để gọi chương trình từ java thông qua cuộc gọi hệ thống? Chương trình C++ sẽ được biên dịch cho hệ điều hành và cửa sổ mac và luôn nằm trong cùng thư mục với chương trình java.

Tôi muốn tạo chương trình thực thi có thể chương trình c được lưu trữ bên trong bình và được gọi từ chương trình của tôi không?

Trả lời

5

Giả sử không có phương pháp giao tiếp tốt hơn có sẵn (SOAP, ICE, ổ cắm, vv), tôi muốn gọi thực thi sử dụng Runtime.exec(). JNI có thể được sử dụng để giao tiếp trực tiếp, nhưng tôi sẽ không khuyến khích nó. Không, bạn không thể đặt một tập tin thực thi trong bình. Vâng, bạn có thể, nhưng bạn không thể chạy nó, kể từ khi vỏ không biết làm thế nào để chạy nó.

+1

Có gì sai với JNI? Nó có lý do, và nó chắc chắn hiệu suất tốt hơn nhiều so với việc bắt đầu một quá trình riêng biệt. –

+0

Vấn đề với JNI là nếu bạn nhầm lẫn, JVM của bạn có trách nhiệm gặp sự cố. Như trong "segfault: code dumped". –

+2

@Pavel: Ít liên kết di động, ít ổn định hơn, chặt chẽ hơn – Draemon

6

Nếu bạn có quyền truy cập vào mã và muốn có trải nghiệm 'tương tác' với chương trình bên ngoài (ví dụ: thực hiện cuộc gọi, nhận kết quả, thực hiện cuộc gọi bổ sung), điều tra JNI, cho phép bạn gọi mã C hoặc C++ từ Ứng dụng Java bằng cách bao gồm & liên kết nước ép JNI với ứng dụng C hoặc C++ của bạn.

Xem:

http://en.wikipedia.org/wiki/Java_Native_Interface

http://www.acm.org/crossroads/xrds4-2/jni.html

Nếu bạn thực sự chỉ cần một "ứng dụng ra mắt và nhận được kết quả" loại dung dịch, hãy kiểm tra Runtime.exec(), cho phép bạn khởi động một chương trình bên ngoài & ghi lại đầu ra của nó.

Xem: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

http://www.rgagnon.com/javadetails/java-0014.html

2

Để trả lời câu hỏi cuối cùng của bạn, bạn không thể chạy tệp thi hành từ bên trong bình của mình.

Tuy nhiên, bạn có thể lưu nó trong bình và giải nén vào thư mục/tệp tạm thời trước khi chạy (kiểm tra lần đầu tiên và trích xuất nếu cần). Điều này sẽ đơn giản hóa phân phối của bạn một chút, trong đó bạn chỉ có jar để phân phối và đảm bảo rằng bạn đang chạy một tệp thực thi khớp với mã Java jarred của bạn.

+0

Tôi đã làm điều tương tự như thế này một lần. Làm việc tốt, nhưng tôi không chắc chắn nếu nó sẽ là khó khăn nếu bạn chương trình cần thiết để làm việc trên các nền tảng khác nhau. – sixtyfootersdude

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