Java平台与宿主环境
- Java平台 是一个编程环境,包括一个 Java虚拟机 和一套 Java API 。
- Java虚拟机 可以使得 Java应用程序 不用考虑与 宿主环境(操作系统) 的兼容性问题,保证了 Java应用程序 与 宿主环境(操作系统) 的隔离。
- Java应用程序 使用 Java 编写,被编译为可以在 Java虚拟机 上运行的二进制格式,所以只要 宿主环境(操作系统) 能运行 Java虚拟机 。
- 原生应用使用 C/C++ 这样的原生编程语言编写,编译成为 宿主环境(操作系统) 相关的字节码。
JNI的角色
-
JNI 是一种双向接口,既允许 Java应用程序 调用原生代码,同时也允许原生代码调用 Java 代码。
使用JNI的潜在风险
- 使用了 JNI 的 Java应用程序 便丢失了 可移植性 。
- Java 是类型安全的,但是 C/C++ 则不是,一个原生方法的运行时错误,可能让整个程挂掉。
使用JNI的场景
- 若不选择 JNI ,可以使用以下几种方式来允许 Java应用程序 与其他语言完成的应用程序进行通信:
- 可以通过TCP/IP连接或者通过其他IPC通信机制与原生应用进行通信。
- 可以通过JDBC连接到一个传统的数据库上。
- 可以使用Java IDL API等分布式对象策略的优势。
- 上述几种方式主要利用了 进程隔离 甚至是 设备隔离 来避免了原生程序的错误传递到 Java应用程序 。
- 对于以下几种场景, Java应用程序 和原生代码存在于相同进程空间是有必要的,这也是 JNI 的价值所在:
- 一个应用程序想使用一些 Java API 不支持文件操作,而通过另一个进程操作文件又是繁杂且低效的。
- 一个自身跨进程实现的应用可能导致不可接受的内存占用,尤其是当这些进程需要运行在同一台宿主机器上时候。
- 一个3D应用程序大多数时间都消耗在图形渲染上,你会想要将这部分渲染代码使用汇编语言实现来达到最好的性能。