我已经成为一名Java开发者几年了,听说JNI可以做一些非常有用和强大的事情。我不知道是因为我没有需要使用它还是它对我来说不是非常相关;但我从未接触过它。
我想知道Java这个方面的用处是什么。最好能给出一些例子。
我已经成为一名Java开发者几年了,听说JNI可以做一些非常有用和强大的事情。我不知道是因为我没有需要使用它还是它对我来说不是非常相关;但我从未接触过它。
我想知道Java这个方面的用处是什么。最好能给出一些例子。
这非常有用。我可以看到使用JNI的两个主要原因(可能还有更多)。
性能。如果您有一段代码,由于某种原因Java运行时无法满足性能要求,则可以在本地代码中实现该函数并从Java中调用它。如果您真的需要的话,可以手动调整实现。然而这很可能是最不常见的原因,因为Java通常表现良好。
访问操作系统特定的APIs。这个原因非常重要。我曾经遇到一个需要在Java中做一些事情但也需要访问Java无法提供的东西的情况。在我的情况下,这是UNIX域套接字。由于它们是UNIX特定的,没有标准的Java方式来使用它们。所以我创建了一个类,在C中包装套接字并使用JNI进行访问。问题解决了。
我为iSeries编写了一个广泛的JNI层,以便访问DB2、用户队列、数据队列和其他一些OS/400特定功能。如果没有JNI,我们在iSeries上的大部分系统将无法实现。因此,是的,JNI有它的位置,当你需要它时,你确实需要它。
相对于纯Java来说,它相对困难,但功能强大且不可怕。
此外,每当我查看一些JNI代码时,我也会考虑使用JNA。
绑定FFMPeg进行C解码(几乎任何)视频/音频格式有一些用途。
还有JNA,它使您感觉像在使用库本身。从这个角度来看,“更容易”,因为它将所有内容传递给Java开发人员进行管理,但从另一个角度来看,您必须弄清楚结构映射并做大量繁重的工作才能正确传递所有指针等。
我们有一个需求,需要在运行在Suse Linux上的遗留C应用程序周围包装一个新的UI。JNI是完成这项工作的完美工具。
总的来说,我认为JNI与Java的“编写一次,随处运行”的概念相矛盾。然而,在某些情况下,JNI可以很有用。