JNI有什么意义?

时间:2012-05-31 08:22:59

标签: java java-native-interface

我是Java的新手,并被告知要使用Java Native Interface来运行我在C中编写的一些代码。

现在,这可能是一个愚蠢的问题,但JNI的重点是什么?我不能简单地从Java UI程序执行我的进程并让它的stdout解析吗?

另外,我已经读过使用JNI可能会导致安全问题。这些问题直接取决于调用代码的质量吗?或者这是更深层次的东西?

感谢。

3 个答案:

答案 0 :(得分:6)

  

JNI有什么意义?

它使您能够在同一进程中混合使用C和Java代码

  

我不能简单地从Java UI程序执行我的进程并让它的stdout解析吗?

使用JNI可以实现的许多事情也可以通过使用进程间通信(IPC)来实现。但是,您必须将所有输入数据发送到另一个进程,然后将所有结果发回。这可能相当昂贵,这使得IPC在许多可以使用JNI的情况下不切实际(例如包装现有的C库)。

  

另外,我已经读过使用JNI可能会导致安全问题。这些问题直接取决于调用代码的质量吗?或者这是更深层次的东西?

这里的要点是JVM做了很多工作来确保抛出任何Java代码,缓冲区溢出,堆栈粉碎攻击等等都不会发生。例如,它对所有数组访问执行边界检查(C不执行)。

另一方面,JNI代码是JVM的黑盒子。如果C代码有问题(例如缓冲区溢出),则所有投注均已关闭。

答案 1 :(得分:2)

  

我不能简单地从Java UI程序执行我的进程并让它的stdout解析吗?

您是否认为每次要执行任何本机代码时启动新进程始终是合适的?您真的想在进程之间传输大量数据吗? (想象一下原生图像转换。)

  

另外,我已经读过使用JNI可能会导致安全问题。这些问题直接取决于调用代码的质量吗?

是。基本上,本机代码比在JVM中运行的Java具有更少的安全沙箱。如果代码有安全漏洞(例如缓冲区溢出),那么显然会影响整个应用程序的安全性。

我应该说,Java开发人员需要担心JNI的情况相对相对很少 - 我在职业生涯中肯定只碰了几次。如果需要,您可能还想查看SWIG

答案 2 :(得分:1)

  

我不能简单地从Java UI程序执行我的进程并让它的stdout解析吗?

这取决于你的要求。

请注意,您不能通过JNI调用程序,而是库代码

除此之外,产生新流程相对昂贵,管理多个流程也很复杂。