我是Java的新手,并被告知要使用Java Native Interface来运行我在C中编写的一些代码。
现在,这可能是一个愚蠢的问题,但JNI的重点是什么?我不能简单地从Java UI程序执行我的进程并让它的stdout解析吗?
另外,我已经读过使用JNI可能会导致安全问题。这些问题直接取决于调用代码的质量吗?或者这是更深层次的东西?
感谢。
答案 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调用程序,而是库代码。
除此之外,产生新流程相对昂贵,管理多个流程也很复杂。