参考:
<<JNI编程指南>>
1. 系统环境和本地程序
系统环境代指本地操作系统环境,它有自己的本地库和CPU指令集。本地程序通过使用C/C++这样的语言来编写,并被编译成只能在与本地系统兼容的环境下运行的二进制代码,并和本地库链接在一起。
本地程序和本地库通过会依赖一个特定的本地系统,比如,一个系统编译出来的C程序可能不能在另一个系统中运行。
2. JNI的角色
JNI的强大特性使用我们在使用Java平台的同时,还可以重用原来的本地代码。作为虚拟机实现的一部分,JNI允许Java代码和本地代码间的双向交互。
3. JNI的副作用
一旦使用JNI,Java程序就丧失了Java平台的两个优点:
程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分;
程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。
4. 避开JNI使用的方案:
Java程序和本地程序使用TCP/IP或IPC进行交互;
当用Java程序连接本地数据库时,使用JDBC提供的API;
Java程序可以使用分布式对象技术,如Java IDL API。
总之,Java和本地程序处于不同进程或不同的机器。这样,当本地程序崩溃时,也不会影响到Java程序。
5. 下面场合无法避免使用Java JNI:
程序中用到了Java没提供的特殊系统环境才有的特性,而跨进程操作又不现实;
想访问已有的本地库,但又不想付出跨进程调用时的代价,如效率、内存和数据传递等;
Java程序当中的一部分代码效率要求非常高,如算法计算、图形渲染等。
总之,只有当必须在同一进程中调用本地代码时,才使用Java JNI。