本地代码通过调用JNI函数来访问Java VM功能。JNI函数都可以使用一个接口指针来调用。接口指针是一个指向指针的指针。该指针指向一个指针数组,其中的每个指针元素都指向一个接口函数。每一个接口函数都是在接口数组中一个预定义的偏移量位置。下图说明了一个接口指针的组织机构。

 

 

接口指针组织图

JNI接口的组织类似于一个C++虚函数表或COM接口。相比于使用硬连接函数,使用接口表的优点是JNI命名空间是独立于本地代码的。虚拟机可以很容易地提供多个版本的JNI函数表。例如,虚拟机可以支持两个JNI函数表:

1.one performs thorough illegal argument checks, and is suitable for debugging;

2.the other performs the minimal amount of checking required by the JNI specification, and is therefore more efficient.

JNI接口指针只在当前线程中有效。因此,一个本地方法不能将接口指针从一个线程传递到另一个线程中。执行JNI的虚拟机可以在接口指针指向的区域分配并存储线程本地数据。

本地方法以参数的方式接收JNI接口指针。当VM从一个Java线程中多次调用本地方法时会向本地方法传递相同的接口指针。当然,一个本地方法可以被不同的Java线程调用,因此可能会收到不同的JNI接口指针。

posted on 2012-08-22 22:08  DragonDancing  阅读(1285)  评论(0编辑  收藏  举报