Java Native Interface (JNI)允许Java应用程序可以调用本地方法(native method),所谓本地方法是指用本地程序设计语言(比如C或者C++)来编写的特殊方法。本地方法在本地语言中可以执行任意的计算任务,并返回到Java程序设计语言。
从历史上看,本地方法主要有三种用途。它们提供了 “访问特定于平台的机制”的能力,比如访问注册表(registry)和文件锁(file lock)。它们还提供了访问遗留代码库的能力,从而可以访问遗留数据(legacy data)。最后,本地方法可以通过本地语言,编写应用程序中注重性能的部分,以提高系统的性能。
使用本地方法来访问特定于平台的机制是合法的,但是随着Java平台的不断成熟,它提供了越来越多以前只有在宿主平台上才拥有的特性。例如,1.4发行版本中新增加的java.util.prefs包,提供了注册表的功能,1.6发行版本中增加了java.awt.SystemTray,提供了访问桌面系统托盘区的能力。使用本地方法来访问遗留代码也是合法的。
使用本地方法来提高性能的做法不值得提倡。在早期的发行版本中(1.3发行版本之前), 这样做往往是很有必要的,但是jvm实现变得越来越快了。对于大多数任务,现在即使不使用本地方法也可以获得与之相当的性能。举例来说,当Java 1.1发行版本中增加了java.math 时,Biglnteger是在一个用C编写的快速多精度运算库的基础上实现的。在当时,为了获得足够的性能这样做是必要的。在1.3发行版本中,Biglnteger则完全用Java重写了,并且进行了 精心的性能调优。即便如此,新的版本还是比原来的版本更快,在这些年间,VM也已经变得更快了。
使用本地方法有一些严重的缺点。因为本地语言不是安全的(见第39条),所以,使用本地方法的应用程序也不再能免受内存毁坏错误的影响。因为本地语言是与平台相关的,使用本地方法的应用程序也不再是可自由移植的。使用本地方法的应用程序也更难调试。在进入和退出本地代码时,需要相关的固定开销,所以,如果本地代码只是做少量的工作,本地方法就可能降低(decrease)性能。最后一点,需要“胶合代码”的本地方法编写起来单调乏味, 并且难以阅读。
总而言之,在使用本地方法之前务必三思。极少数情况下会需要使用本地方法来提高性能。 如果你必须要使用本地方法来访问底层的资源,或者遗留代码库,也要尽可能少用本地代码, 并且要全面进行测试。本地代码中的一个Bug就有可能破坏整个应用程序。
网友评论