🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Java应用程序与原生代码协作这个需求很早以前就被发现了,在Java 平台的JDK release 1.0版本的时候就包含了一系列允许Java应用程序调用其他语言的接口.很多第三方应用程序,包括Java类库(如java.lang, java.io, java.net)都依赖这些原生方法接口去访问底层宿主环境. 不幸的是,JDK release 1.0中的原生方法接口又两个主要问题: * 第一,原生代码以C结构体成员的方式访问对象属性,然而,Java虚拟机规范并没有定义对象在内存中如何布局,如果一个Java虚拟机实现中对象的内存布局与原生库中假设的内存布局不同,那么你就不得不重新编译原生库了. * 第二,在JDK release 1.0中原生方法可以持有一个直接指向虚拟机中对象的指针,所以它不得不依赖一种保守的垃收集器.任何一个Java虚拟机实现如果使用了比较高级的垃圾收集器,就不能支持原生方法调用了. JNI的设计就是为了解决这些问题.它是一个可以被各种宿主环境上的所有Java虚拟机支持的接口.有了JNI: * 每一个虚拟机实现可以支持更大体积的原生代码. * 开发工具提供商可以不在需要处理不同类型的原生方法接口了. * 更重要的是应用程序开发者能够只编写一个版本的原生代码就可以在不同的Java虚拟机实现上运行了. JNI被JDK release 1.1支持,但当时的JDK release 1.1本身仍然是使用旧版本的原生方法实现Java API的. 之后版本的JNI实现都是向后兼容的,所有未来JNI版本的演进都会保证完整的二进制兼容性.