,一旦使用JNI,JAVA程序就丧失了JAVA平台的两个优点:1、程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。2、程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,你应该让本地方法集中在少数几个类当中。这样就降低了JAVA和C之间的耦合性。14什么场合下应该使用JNI当你开始着手准备一个使用JNI的项目时,请确认是否还有替代方案。像上一节所提到的,应用程序使用JNI会带来一些副作用。下面给出几个方案,可以避免使用JNI的时候,达到与本地代码进行交互的效果:1、JAVA程序和本地程序使用TCPIP或者IPC进行交互。2、当用JAVA程序连接本地数据库时,使用JDBC提供的API。3、JAVA程序可以使用分布式对象技术,如JAVAIDLAPI。这些方案的共同点是,JAVA和C处于不同的线程,或者不同的机器上。这样,当本地程序崩溃时,不会影响到JAVA程序。下面这些场合中,同一进程内JNI的使用无法避免:1、程序当中用到了JAVAAPI不提供的特殊系统环境才会有的特征。而跨进程操作又不现实。2、你可能想访问一些己有的本地库,但又不想付出跨进程调用时的代价,如效率,内存,数据传递方面。3、JAVA程序当中的一部分代码对效率要求非常高,如算法计算,图形渲染等。
f总之,只有当你必须在同一进程中调用本地代码时,再使用JNI。15JNI的演化JDK10包含了一个本地方法接口,它允许JAVA程序调用CC写的程序。许多第三方的程序和JAVA类库,如:javala
gjavaiojava
et等都依赖于本地方法来访问底层系统环境的特征。不幸的是,JDK10中的本地方法有两个主要问题:1、本地方法像访问C中的结构(structures)一样访问对象中的字段。尽管如此,JVM规范并没有定义对象怎么样在内存中实现。如果一个给定的JVM实现在布局对象时,和本地方法假设的不一样,那你就不得不重新编写本地方法库。2、因为本地方法可以保持对JVM中对象的直接指针,所以,JDK10中的本地方法采用了一种保守的GC策略。JNI的诞生就是为了解决这两个问题,它可以被所有平台下的JVM支持:1、每一个VM实现方案可以支持大量的本地代码。2、开发工具作者不必处理不同的本地方法接口。3、最重要的是,本地代码可以运行在不同的JVM上面。JDK11中第一次支持JNI,但是,JDK11仍在使用老风格的本地代码来实现JAVA的API。这种情况在JDK12下被彻底改变成符合标准的写法。16例子程序本书包含了大量的代码示例,还教我们如何使用javah来构建JNI程r