所以我有一个Java程序,用于在缓冲区中捕获原始以太网数据,以及一个C程序(实际上是一系列C程序),它将该数据解码为可用格式并将其粘贴到稍后要分析的文件中。我想运行Java,将数据发送到C,附加一个文件并控制返回原始程序以侦听更多数据。
我的问题是我真的需要使用JNI来调用这个C程序,因为我将向它发送数据,或者我可以只使用JConfic或exec吗?我的文件不是.exec文件,所以我真的没看到后者工作,但我想尽可能简单。你们都在想什么?
答案 0 :(得分:2)
您有以下选择:
到目前为止,最简单的方法是创建一个CLI可执行文件,您可以从Java调用它并解析其输出。作为额外的好处,您还可以使用任何其他语言的CLI可执行文件。
使用JNA的方法不太简单。 JNA非常直接使用,但并不是每个设备都支持它。例如,Android不支持JNA。检查支持的设备的规格,了解是否可以使用JNA。另请查看this tutorial以获取对JNA的基本介绍。
困难的方法是使用JNI。 JNI一点也不直接使用。您需要编写大量的胶水代码来处理JVM调用,然后使用其他一些胶水代码来编写JVM友好输出。然而,这是最广泛支持的方法(也适用于Android)。再次,请检查支持的设备的规格,以确定是否可以使用JNI。如果您想采用JNI路线,可以查看this tutorial以获得基本介绍。
因此,如果您没有非常复杂的事情要做(没有很多功能要支持,而不是很多数据类型),请使用JNI。否则,尝试更高级的方法。
答案 1 :(得分:1)
检查JNA,这比JNI简单得多。
答案 2 :(得分:1)
是的,您可以从Java运行C程序作为单独的进程。
使用java.lang.ProcessBuilder制作java.lang.Process,并与流程的输入,输出和错误流进行交互。请注意,如果您不读取其输出流,则Process将挂起。
答案 3 :(得分:0)
这是一个非常直接的例子,使用JNA(由@lexicore提到)从Java调用C函数
http://stuf.ro/calling-c-code-from-java-using-jna/
如果您的Java和C程序可以重组,以便C程序调用Java程序,那么下面的文章提供了一个很好的示例,可以下载代码。它基本上通过使用Java代理类和调用所需Java功能的C外观来抽象出使用JNI的复杂性。
答案 4 :(得分:0)
当然,您可以使用C程序进程的输入和输出流从Java与C程序进行通信。
这将取决于您的问题,这是否比使用JNI(或JNA)更容易编写。
答案 5 :(得分:0)
你可以使用JNA作为你的目的,因为你只需要调用C代码,但是将来如果你必须包含对C ++的调用,JNA将无法工作,所以最好使用JNI,这在两种情况下都很有用, JNI也有明显的优势。