我已经java开发了几年,并已听说你可以做一些非常有用的和强大的东西与JNI.我不知道如果我只是不需要使用它,或者如果它是不是非常有关;但是我没有去碰它。

我想知道什么有用的这一方面的Java。例子将是巨大的。

有帮助吗?

解决方案

这是非常有用的。我可以看到2个主要原因使用JNI(有可能)。

  1. 性能。如果你有一段代码在哪Java运行对于任何原因不能把它切表现的智慧。你可以实现这一职能在本机代码,并呼吁它从Java。这可以让你的手为你的落实如果你 真的 需要。这可能是最常见的原因,虽然,Java,通常执行的只是罚款。

  2. 接入操作系统的具体Api。这是一个不算什么。我有一个情况下我需要做些什么Java但还需要获得的东西,Java不能简单地提供。在我的情况下,它是UNIX domain sockets.因为(正如你可以告诉由名),他们是UNIX具体,没有标准Java的方式来使用它们。所以我做了一个类的行为像个包装,他们在C和访问它与JNI.维奥拉,问题的解决。

其他提示

我已经为iSeries编写了一个广泛的JNI层来访问DB2,用户队列,数据队列和一些其他OS / 400细节。如果没有JNI,我们在iSeries上的大部分系统都是不可能的。所以,是的,JNI有它的位置,当你需要它时,你真的需要它。

相对困难(纯Java旁边),但功能强大而且不可怕。

此外,每当我查看一些JNI代码时,我也会考虑使用 JNA

我可以想到一些用处:

  1. 与现有的低级别集成 (C / C ++)没有Java的API 对方
  2. 与方面相结合 没有暴露的系统 通过可用的Java API(直接 硬件访问等。)
  3. 有些人可能会说它对于创建高度优化的代码段非常有用,但是使用现代JVM可以获得相当快的速度,使用JNI的复杂性可能会超过您可能看到的任何性能优势。

有一些用于绑定到FFMPeg用于C语言解码(该死的任何一种)视频/音频格式。

还有JNA,这就像你使用图书馆本身一样。这是“更容易”的从它将所有内容传递给Java开发人员进行管理的角度来看,并且更难以理解你必须弄清楚结构映射并做很多工作以使所有指针等正确传递。

我们需要围绕在Suse Linux上运行的旧C应用程序包装新UI。 JNI是工作的完美工具。

总的来说,我认为JNI与Write Once,Run Anywhere等Java概念相矛盾。但是有些用例可以使用JNI。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top