需要JNI还是更简单的东西?

时间:2011-06-17 13:50:16

标签: java c java-native-interface multilingual

所以我有一个Java程序,用于在缓冲区中捕获原始以太网数据,以及一个C程序(实际上是一系列C程序),它将该数据解码为可用格式并将其粘贴到稍后要分析的文件中。我想运行Java,将数据发送到C,附加一个文件并控制返回原始程序以侦听更多数据。

我的问题是我真的需要使用JNI来调用这个C程序,因为我将向它发送数据,或者我可以只使用JConfic或exec吗?我的文件不是.exec文件,所以我真的没看到后者工作,但我想尽可能简单。你们都在想什么?

6 个答案:

答案 0 :(得分:2)

您有以下选择:

  • 您可以为C代码创建CLI接口,然后为所有支持的平台编译该接口并从Java执行
  • 您可以使用JNAJNI创建一个从Java调用库代码的桥梁,但您仍需要为所有支持的平台编译C代码,只需要提供它现在是一个图书馆

到目前为止,最简单的方法是创建一个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的复杂性。

http://java.sys-con.com/node/45840

答案 4 :(得分:0)

当然,您可以使用C程序进程的输入和输出流从Java与C程序进行通信。

这将取决于您的问题,这是否比使用JNI(或JNA)更容易编写。

答案 5 :(得分:0)

你可以使用JNA作为你的目的,因为你只需要调用C代码,但是将来如果你必须包含对C ++的调用,JNA将无法工作,所以最好使用JNI,这在两种情况下都很有用, JNI也有明显的优势。