我已经成为一名Java开发人员已有几年了,并且听说过你可以用JNI做一些非常有用和强大的东西。我不知道我是不是需要使用它,或者它与我的关系不是很相关;但我根本不需要触摸它。
我想知道Java这方面的用处是什么。例子很棒。
答案 0 :(得分:12)
非常有用。我可以看到使用JNI的两个主要原因(可能更多)。
性能。如果您有一段代码,其中Java Runtime无论出于何种原因都无法降低性能。您可以在本机代码中实现该功能,并从Java调用它。如果确实需要,这允许您手动调整实现。这可能是最不常见的原因,但Java通常表现得很好。
访问特定于操作系统的API。这个是个大问题。我有一个案例,我需要用Java做一些事情,但也需要访问Java根本无法提供的东西。在我的例子中,它是UNIX域套接字。由于(通过名称可以看出)它们是特定于UNIX的,因此没有标准的Java方法来使用它们。所以我在C中创建了一个类似于它们的包装器的类,并使用JNI访问它。中提琴,问题解决了。
答案 1 :(得分:4)
我已经为iSeries编写了一个广泛的JNI层来访问DB2,用户队列,数据队列和一些其他OS / 400细节。如果没有JNI,我们在iSeries上的大部分系统都是不可能实现的。所以,是的,JNI有它的位置,当你需要它时,你真的需要它。
相对困难(纯Java旁边),但功能强大而且不可怕。
此外,每当我查看一些JNI代码时,我也会考虑使用JNA。
答案 2 :(得分:2)
我可以想到一些用处:
有些人可能会说它对于创建高度优化的代码段非常有用,但是使用现代JVM,你得到的速度非常快,使用JNI的复杂性可能会超过你可能看到的任何性能优势。
答案 3 :(得分:1)
有一些用于绑定到FFMPeg用于C语言解码(该死的任何近似)视频/音频格式。
还有JNA,这就像你使用图书馆本身一样。从它将所有内容传递给Java开发人员进行管理的角度来看,这是“更容易”的,并且在您必须弄清楚结构映射并执行大量繁琐工作以使所有指针等通过的意义上更难正确。
答案 4 :(得分:1)
我们需要围绕在Suse Linux上运行的旧C应用程序包装新UI。 JNI是工作的完美工具。
总的来说,我认为JNI与Write Once,Run Anywhere等Java概念相矛盾。但是有些用例可以使用JNI。