C/C和x2B中的跨平台兼容性+;(从Java移植项目)?

C/C和x2B中的跨平台兼容性+;(从Java移植项目)?,java,c++,c,networking,cross-platform,Java,C++,C,Networking,Cross Platform,我用Java/JavaFX编写了一个程序,因为我需要跨平台的支持。随着我的进步,我需要做一些在Java中不可能的低级操作系统联网操作。我从Runtime.exec()开始,移到了JNA/JNI,现在我担心维护Java的操作系统兼容性会比移植到本机应用程序的工作量更大 最好的方法是什么 我知道*nix和windows支持GTK+,所以我想我会在UI中使用它。为每个操作系统维护不同版本的应用程序有多困难?您能推荐一个起点来编写需要跨平台但仍然具有低级别操作系统访问权限的内容吗?我有很多java经验(

我用Java/JavaFX编写了一个程序,因为我需要跨平台的支持。随着我的进步,我需要做一些在Java中不可能的低级操作系统联网操作。我从Runtime.exec()开始,移到了JNA/JNI,现在我担心维护Java的操作系统兼容性会比移植到本机应用程序的工作量更大

最好的方法是什么

我知道*nix和windows支持GTK+,所以我想我会在UI中使用它。为每个操作系统维护不同版本的应用程序有多困难?您能推荐一个起点来编写需要跨平台但仍然具有低级别操作系统访问权限的内容吗?我有很多java经验(以及C++的OpenGL),但我从来没有关心过任何东西,除了Linux。
或者,有没有一种好方法可以从Java构建原始数据包、发送ICMP ping和执行其他低级网络任务?

您的问题非常笼统,因此我将在这里列出一些最佳实践。如果你对你的问题进行相应的修改,我可以缩小范围

1-最重要的是编译器和构建环境。选择这一点可能很简单,所有主要平台都支持ClangGCC。但是,构建环境有点棘手。仅仅一个Makefile并不适合所有平台。相反,选择类似于或的东西。这将帮助您更轻松地管理源代码并在所有系统上生成适当的makefile

2-您可能希望在所有平台上构建相同的GUI。在这种情况下,您可以使用或

3-文件I/O。如果有大量文件I/O,您可能需要查看

4-对于您使用的所有其他库,请确保所有平台都支持它们。一般来说,我建议使用历史上维护良好的库,如Boost

5-最后,使用隐藏特定于平台的代码


<>如果你想深入跨平台的C++编程,这里有一本好书:

。因为你对本机代码的需求似乎与网络包有关,你可以看一下。注意:JPCAP有两个分支:一个托管在SourceForge上(package
net.SourceForge.JPCAP.net
),不支持发送,另一个我链接到这里(package
JPCAP
,它最初托管在
http://netresearch.ics.uci.edu/kfujii
)。我认为这对于大多数“低级”网络操作(包括监听混杂模式、发送非IP数据报、ICMP等)来说已经足够了

  • 尽可能使用跨平台库(例如:boost)
  • 编写特定于平台的代码,并在上面编写良好的抽象层
  • 例如:Windows/信令、Linux/信令、信令 这里,

    • Windows/Signaling是Windows平台特定的信令代码
    • Linux/Signaling是Linux平台特定的信令代码
    • 信令是平台抽象层,编译时我们可以决定平台

    Qt可能是跨平台GUI的最佳选择。我不认为GTK+是一个伟大的选择,如果你想针对Windows(或Mac)。然而,也许这已经改变了。我上次检查已经有一段时间了。另见

    Boost和Poco都是跨平台的C++库。它们还提供网络库(boost asio和Poco Net)

    和都支持发送ICMP ping请求


    我不确定这些库是否允许您构建自己的以太网帧和IP数据包。

    ?您必须更具体一些。C++本身非常便携,甚至在某些方面比java更为出色,但是标准库比较起来是微不足道的。在C++中,你经常需要依赖第三方或平台特定的库来做GUI,如你注意到的。有人提到了一个库,使java代码很容易调用OS API。但是我不记得它的名字了。我想知道你所说的低级别操作系统网络操作是什么意思。Jpcap看起来很有趣,但它已经8年没有更新了,所有的下载链接都断了。我设法通过Fedora repos找到源代码,但它不会在x86_64下编译。你用Jpcap吗?也许你能帮我。很有趣。。。我在2007年下载了它,所以我不知道链接已经死了。我用一个链接编辑了我的答案,链接到github上的一个版本,该版本看起来似乎与发件人的版本相同(请注意,github的
    jpcap/jpcap
    与sourceforge的版本相同)。Clang和GCC都不太支持Windows。