2013-03-15 24 views
9

Tôi đã viết một chương trình bằng Java/JavaFX vì tôi cần hỗ trợ nền tảng chéo. Khi tôi tiến triển, tôi cần thực hiện một số hoạt động mạng OS ở mức thấp mà không thể thực hiện được trong Java. Tôi bắt đầu với Runtime.exec(), chuyển sang JNA/JNI, và bây giờ tôi lo lắng rằng việc duy trì tính tương thích của hệ điều hành cho Java sẽ kết thúc được nhiều công việc hơn là chỉ chuyển sang một ứng dụng gốc.Khả năng tương thích nền tảng chéo trong C/C++ (chuyển một dự án từ Java)?

Cách tốt nhất để làm điều này là gì?

Tôi biết GTK + được hỗ trợ bởi * nix và cửa sổ nên tôi nghĩ tôi sẽ sử dụng giao diện người dùng đó cho giao diện người dùng của mình. Sẽ khó khăn như thế nào để duy trì các phiên bản ứng dụng khác nhau của tôi cho mỗi hệ điều hành? Bạn có thể đề xuất một điểm bắt đầu để viết một cái gì đó mà cần phải được nền tảng chéo nhưng vẫn có quyền truy cập hệ điều hành cấp thấp? Tôi có rất nhiều kinh nghiệm Java (và một số lượng tốt của C + + với OpenGL) nhưng tôi đã không bao giờ phải quan tâm về bất cứ điều gì nhưng Linux trước.

Ngoài ra, có cách nào tốt để tạo gói dữ liệu thô, gửi ping ICMP và thực hiện các tác vụ mạng cấp thấp khác từ Java không?

+2

http://www.savarese.com/software/rocksaw/ ?? – Thihara

+0

Bạn sẽ phải cụ thể hơn. C++ chính nó là rất di động, thậm chí nhiều hơn so với Java theo một số cách, nhưng thư viện chuẩn là trừ đi so sánh. Trong C++, bạn thường cần phải dựa vào các thư viện của bên thứ ba hoặc nền tảng cụ thể để làm những việc như GUI như bạn đã nhận thấy. – congusbongus

+0

ai đó đã đề cập đến một thư viện để làm cho nó rất dễ dàng cho mã java để gọi API OS. nhưng tôi không nhớ tên. – ZhongYu

Trả lời

2

Câu hỏi của bạn khá chung chung, vì vậy tôi sẽ liệt kê một số phương pháp hay nhất tại đây. Tôi có thể thu hẹp mọi thứ, nếu bạn chỉnh sửa câu hỏi của bạn cho phù hợp.

1- Điều nhập nhiều nhất là trình biên dịch và môi trường xây dựng. Điều này có thể không đáng kể để chọn, cả hai ClangGCC được hỗ trợ trên tất cả các nền tảng chính. Tuy nhiên, môi trường xây dựng hơi phức tạp một chút. Chỉ một Makefile duy nhất sẽ không tốt cho tất cả các nền tảng. Thay vào đó, hãy tìm một số thứ như CMake hoặc SCons. Điều này sẽ giúp bạn quản lý nguồn của bạn và tạo các makefiles phù hợp trên tất cả các hệ thống dễ dàng hơn.

2- Bạn có thể muốn xây dựng cùng một GUI trên tất cả các nền tảng. Trong trường hợp đó, bạn có thể sử dụng Qt hoặc GTK+ như bạn đã đề cập.

3- File I/O. Nếu bạn có nhiều File I/O, bạn có thể muốn xem Boost File System.

4- Đối với tất cả thư viện bổ sung bạn sử dụng, hãy đảm bảo chúng được hỗ trợ trên tất cả các nền tảng. Nói chung, tôi khuyên bạn nên sử dụng các thư viện được duy trì tốt về mặt lịch sử, chẳng hạn như Boost.

5- Cuối cùng, ẩn mã nền tảng cụ thể bằng cách sử dụng PIMPL Idiom.

Nếu bạn muốn đi sâu hơn trong chương trình Nền tảng C++, đây là một cuốn sách hay: Cross-Platform Development in C++: Building Mac OS X, Linux, and Windows Applications.

+0

Cả Clang lẫn GCC đều không hỗ trợ Windows. –

3

Vì yêu cầu mã gốc của bạn có vẻ liên quan đến gói mạng, bạn có thể xem JPCAP. Lưu ý: có hai nhánh của JPCAP: một nhánh được lưu trữ trên SourceForge (gói net.sourceforge.jpcap.net), không hỗ trợ gửi và miền tôi đã liên kết tại đây (gói jpcap, được lưu trữ ban đầu tại http://netresearch.ics.uci.edu/kfujii). Tôi nghĩ rằng nó sẽ là đủ cho hầu hết các hoạt động mạng "cấp thấp" (bao gồm cả nghe trên chế độ promiscuous, gửi datagram không IP, ICMP, vv).

+1

Jpcap trông rất intresting, nhưng nó đã không được cập nhật trong 8 năm và tất cả các liên kết tải xuống bị hỏng. Tôi mange để tìm mã nguồn thông qua repos Fedora, nhưng nó sẽ không biên dịch theo x86_64. Bạn có sử dụng Jpcap không? Có lẽ bạn có thể giúp tôi. – beardedlinuxgeek

+1

Thú vị ... Tôi đã tải xuống nó vào năm 2007, vì vậy tôi không biết các liên kết đã chết. Tôi đã chỉnh sửa câu trả lời của mình bằng một liên kết đến một phiên bản trên github trông giống như là một liên kết với người gửi (lưu ý rằng 'jpcap/jpcap' của github giống như của sourceforge). – Javier

0

Nó là nhiều hơn những thứ thiết kế,

  1. Cố gắng sử dụng các thư viện nền tảng chéo bất cứ nơi nào có thể (ví dụ: tăng) mã cụ thể
  2. Viết nền tảng và viết lớp trừu tượng tốt trên đầu trang của nó.

ví dụ: Windows/báo hiệu, Linux/báo hiệu, tín hiệu Ở đây,

  • Windows/tín hiệu là nền tảng cửa sổ đang phát tín hiệu cụ thể
  • Linux/tín hiệu là Linux nền tảng tín hiệu cụ thể mã
  • Báo hiệu là lớp trừu tượng nền tảng, thời gian biên dịch chúng tôi có thể quyết định nền tảng
1

Qt có lẽ là lựa chọn tốt nhất cho GUI đa nền tảng. Tôi không nghĩ rằng GTK + là một lựa chọn tuyệt vời nếu bạn muốn nhắm mục tiêu Windows (hoặc Mac). Tuy nhiên, có lẽ điều này đã thay đổi. Đã đến lúc tôi kiểm tra lần cuối. Xem thêm this post.

Tăng cường và Poco là cả hai thư viện C++ đa nền tảng tốt. Họ cũng cung cấp cả hai thư viện mạng (tăng asio và Poco Net).

Gửi yêu cầu ping ICMP được hỗ trợ bởi cả hai boostPoco.

Tôi không chắc liệu các thư viện này có cho phép bạn xây dựng các khung Ethernet và gói IP của riêng bạn hay không.

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