前言
本文是Oracle官方JNI文档的翻译基础上加上部分个人理解,原文地址 Chapter 1:Introduction
本文介绍JNI(Java Native Interface)。JNI是Native编程接口,它允许运行在JVM(Java Virtual Mechine)上的应用跟使用其他语言(比如C、C++等)实现的库进行交互。
JNI最大的好处在于对底层JVM实现没有强制约束,所以JVM供应商可以在不影响其他JVM功能的基础上支持JNI。开发者可以开发一份Native应用或库,然后运行在所有支持JNI的JVM上。
JNI 概述
当你使用纯Java实现业务逻辑时,会出现一些Java没办法支持的情况。开发者可以使用JNI写native方法去处理纯Java应用没办法解决的问题。
下面是一些典型的JNI应用场景:
- 标准Java库不支持平台相关的特性
- 在已有其他语言实现库的基础上,使用JNI让库在Java上可用
- 实现一些时间关键的逻辑
通过JNI编程,你可以使用Native方法做以下事情:
- 创建、检查、更新Java对象(包括数组与字符串)
- 调用Java方法
- 异常捕获及抛出
- 加载类以及获取类信息
- 进行运行时类型检测
你可以通过JNI开发嵌入到JVM的Native应用,比起链接JNI源码,JNI让Native应用跑在JVM上更容易。
历史背景
不同VM厂商提供不同的Native接口,不同的接口迫使开发者必须为一个特定平台开发、维护多份不同版本Native库。
以下是一些Native接口方案:
- JDK 1.0 native method interface
- Netscape’s Java Runtime Interface
- Microsoft’s Raw Native Interface and Java/COM interface
具体为啥上述方案都没成为标准就不做介绍了,有兴趣的可以查阅原文。
目标
我们相信经过思考的统一接口会给我们带来以下好处:
- 每个VM厂商可以支持大部分Native代码
- Native工具开发者不再需要维护不同版本Native方法接口
- 应用开发者将可以使用一份Native代码,并且它可以在不同VM上运行。
经过一系列讨论,一致认为标准Native接口必须满足以下需求:
- 二进制兼容性。最主要的目标是同一平台下不同JVM实现应该保持二进制兼容性。开发者只需要为特定平台维护一份Native库。
- 效率。为了支持时间紧张代码,Navtie方法必须不能有太大的代价。目前已知技术都有一定的代价,我们必须在性能及VM独立性之间做一些取舍。
- 功能强大。Native接口必须要暴露足够多的VM接口让Native方法可以实现更多有用的任务。
JNI 解决方案
我们希望采用现有的解决方案作为标准接口,因为这对开发者来说负担最小,但不幸的是没有现存的解决方案满足我们的目标。
具体各方案不合适的原因有兴趣地查看原文,这里不做过多介绍。
JNI 编程
作为Native方法开发者你应该使用JNI。JNI编程帮你屏蔽了具体JVM不同实现。通过遵循JNI标准,您将为Native库提供在给定Java VM中运行的最佳机会。
作为JVM开发者你应该使用JNI。JNI已经经过时间验证并且不需要增加额外VM实现的负担及约束,包括对象表达、垃圾回收机制等。
下一节我们将会介绍 JNI设计概述