Java本机接口(JNI)的使用

Java本机接口(JNI)的使用,java,jvm,java-native-interface,Java,Jvm,Java Native Interface,您能帮助我理解从web应用程序开发的角度来看,JNI(或Java本机接口)在什么情况下是有用的吗 我确实读过一些文章,承诺JNI可以让您访问本机应用程序,如菜单栏/滚动栏等,这样用户界面会更吸引人。。。然而,这些事情可以在其他技术而不是Java中完成 我仍然无法找到JNI的实际用途。您在项目/应用程序中使用过JNI吗?对于什么?是JNI,如果你需要从java调用一些低级语言(C++,C++,汇编)函数。许多项目使用JNI,例如: JOGL(用于调用OpenGL的Java库,一个C库) SWT(

您能帮助我理解从web应用程序开发的角度来看,JNI(或Java本机接口)在什么情况下是有用的吗

我确实读过一些文章,承诺JNI可以让您访问本机应用程序,如菜单栏/滚动栏等,这样用户界面会更吸引人。。。然而,这些事情可以在其他技术而不是Java中完成


我仍然无法找到JNI的实际用途。您在项目/应用程序中使用过JNI吗?对于什么?是JNI,如果你需要从java调用一些低级语言(C++,C++,汇编)函数。许多项目使用JNI,例如:

  • JOGL(用于调用OpenGL的Java库,一个C库)
  • SWT(Java UI库,使用JNI调用本机窗口库,例如Linux上的GTK)

有一些工具可以自动生成JNI代码,比如,它可以极大地减轻生成JNI包装器代码的痛苦(这需要编写一些Java和一些底层语言)这对于web开发来说应该是不必要的,因为您需要的任何东西都是用Java编写的——这也是一个糟糕的想法,因为它会使您的应用程序依赖于平台


它有时被用来访问系统API—一个旧的DLL,您必须使用它,而无需出于某些糟糕的管理相关原因进行重写。

或者因为底层库非常庞大且需要重写—这将是一项多年的工程壮举…@sjr—这是通常糟糕的管理相关原因。大多数开发人员都会理解,重写它将在原来的时间的一小部分内为您提供一个更好的集成、更稳定、更简单的解决方案,它将降低维护成本并提高添加功能的灵活性/能力。管理者通常不会认为把所有的东西都扔掉通常是前进的最佳方式。如果大多数开发人员都是这样理解的,那么他们就错了。拥有同一个库的两个实现是一个巨大的负担。即使在您到达之前,对于任何规模的大多数库,在任何合理的时间内重写它都是不可行的。@sjr为什么您会有两个版本?我不是这么说的。通常,在移植和使用遗留内容时会遇到这种问题。为什么支持这两个版本?如果您想为多个平台提供,只需将其移植到java并将旧版本扔到垃圾箱中即可。请记住,这是一个web,使用JNI语言编写的web部分一开始就存在问题(web服务器通常不使用C编写是有原因的)。根据我的经验,您希望使用现有的库,正是因为它不是遗留的,事实上,它正在广泛使用和大量开发中。为什么要重复开发工作?正如这里所示,JNI可以用来获得更好的性能结果,或者不从另一种语言重写库。主要缺点是使用JNI时,程序可能依赖于机器。