Java JNI的有用性

Java JNI的有用性,java,interop,java-native-interface,Java,Interop,Java Native Interface,我已经做了几年java开发人员,听说你可以用JNI做一些非常有用和强大的事情。我不知道我是否只是不需要使用它,或者它是否与我无关;但我根本不必去碰它 我想知道Java这方面的用处是什么。举个例子就好了 它非常有用。我可以看到使用JNI的两个主要原因(可能还有更多) 表演。如果您有一段代码,其中Java运行时无论出于何种原因都无法从性能角度对其进行裁剪。您可以在本机代码中实现该函数,并从Java调用它。这允许您在确实需要时手动调整实现。不过,这可能是最不常见的原因,Java通常表现良好 访问特定于

我已经做了几年java开发人员,听说你可以用JNI做一些非常有用和强大的事情。我不知道我是否只是不需要使用它,或者它是否与我无关;但我根本不必去碰它


我想知道Java这方面的用处是什么。举个例子就好了

它非常有用。我可以看到使用JNI的两个主要原因(可能还有更多)

  • 表演。如果您有一段代码,其中Java运行时无论出于何种原因都无法从性能角度对其进行裁剪。您可以在本机代码中实现该函数,并从Java调用它。这允许您在确实需要时手动调整实现。不过,这可能是最不常见的原因,Java通常表现良好

  • 访问特定于操作系统的API。这是个大人物。我曾经遇到过这样的情况,我需要用Java做一些事情,但也需要访问Java无法提供的东西。在我的例子中,它是UNIX域套接字。因为(从名称可以看出)它们是特定于UNIX的,所以没有标准的Java方法来使用它们。所以我在C中创建了一个类似于包装器的类,并使用JNI访问它。维奥拉,问题解决了


  • 我可以在脑海中想出一些用法:

  • 与现有的低级别系统集成 (C/C++)没有Java接口的API 对应物
  • 与方面相结合 未公开的系统的 通过可用的Java API(直接 硬件访问等)

  • 有人可能会说,它对于创建高度优化的代码段非常有用,但是使用现代JVM,您的速度非常快,使用JNI的复杂性可能会超过您可能看到的任何性能优势。

    我为iSeries编写了一个扩展的JNI层,用于访问DB2、用户队列、,数据队列和其他一些OS/400细节。如果没有JNI,我们在iSeries上的许多系统都是不可能的。所以,是的,JNI有它的位置,当你需要它的时候,你真的需要它

    它相对来说比较困难(仅次于纯Java),但功能强大,并不可怕


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

    结合FFMPEG来对(几乎任何一个)视频/音频格式的C译码有一些用途。


    还有JNA,它使您看起来就像在使用库本身。从它将所有内容传递给Java开发人员来管理的角度来看,这“更容易”,而从你必须弄清楚结构映射和做大量繁重的工作来正确传递所有指针等的意义上来说,这更难。

    我们需要围绕运行在Suse Linux上的遗留C应用程序包装一个新的UI。JNI是完成这项工作的完美工具


    总的来说,我认为JNI与Java的“一次编写,随时随地运行”的概念是矛盾的。然而,在一些用例中,JNI是有用的

    我同意,但事实上,你的理由1和理由2实际上是一样的,因为像直接硬件访问这样的任何东西都可以通过C/C++API获得。你不能完全用Java编写驱动程序,所以你必须像C一样访问它:-P.For#1我想更多的是第三方(或传统)API,它们没有Java实现,甚至没有源代码(只是一个链接到的库)。对于#2,我考虑的更多是您的#2,即符号链接支持。。。你的第二个答案让我想起了我在大学里的汇编课程——我们必须结合汇编和C函数来完成一项作业。真的很棒。你可以把你的第二点推广到Java软件必须依赖的所有外部C/C++库。我想我以前没见过JNA,哇,我真是个笨蛋!嘿,谢谢:不客气;我从未使用过它,因为我对本机支持的需求是(a)iSeries,和(b)多年前完成并稳定的。。。但我对它很感兴趣,如果我需要Windows或Linux的本机访问权限,我会尝试使用它。我使用JNI绑定了一个swing应用程序,以便携式方式解码MPEG(想想Linux、x64、Windows和os x)。这是一个混乱的过程,但最终一切正常。ffmpeg也有JNI绑定。我使用JNA,因为我需要访问那些绑定没有通过JNI层的结构。在大多数实际的用例中,java(-server版本)的速度确实比C++还慢得多,调用特殊的系统API也是非常具体的情况。最实际的用法是当您需要使用一些库(数学或任何特定的库)时,这些库很久以前是用C/C++编写的,现在仍然受支持,但是没有用Java编写的这个库的版本。