6

我是 Java 新手,有人告诉我使用 Java Native Interface 来运行我用 C 编写的一些代码。

现在,这可能是一个愚蠢的问题,但是 JNI 的意义何在?我不能简单地从 Java UI 程序执行我的进程并让它的标准输出解析吗?

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

谢谢。

4

3 回答 3

6

JNI 有什么意义?

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

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

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

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

这里的重点是 JVM 做了很多工作来确保无论向其抛出什么 Java 代码,诸如缓冲区溢出、堆栈粉碎攻击等事情都不会发生。例如,它对所有数组访问执行边界检查(C 没有)。

另一方面,JNI 代码是 JVM 的黑匣子。如果 C 代码有问题(例如缓冲区溢出),那么所有的赌注都会被取消。

于 2012-05-31T08:25:31.987 回答
2

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

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

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

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

我应该说,Java 开发人员需要担心 JNI 的情况相对较少——在我的职业生涯中,我当然只接触过几次。如果需要,您可能还想查看SWIG

于 2012-05-31T08:25:47.963 回答
1

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

这将取决于你在打电话。

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

除此之外,产生新进程的成本相对较高,管理多个进程也很复杂。

于 2012-05-31T08:25:55.847 回答