技术开发 频道

通过JNI与汇编程序交互

JNI 结构
当一个Java程序调用本地方法的时候,被调用的方法会被强制接收两个附加在调用方法上的参数。第一个参事是JNIEnv指针,第二个是指向调用者的对象或类的参考引用。 这些是进入JNI世界的钥匙。

JNIEnv是一个指针, 它的值指向另一个指针。这第二个指针指向了一个函数表,它实际上是一个指针数值。在函数表里面的每个指针指向一个JNI接口函数。为了调用一个接口函数,我们必须在函数表里面得到正确的存放位置。让我们看看如何通过两个步骤得到这个值:

首先我们要找到第二个指针的值,换句话说,我们要得到JNIEnv指向的位置里面的内容,我们可以用下面的代码做到:

mov ebx, JNIEnv mov eax, [ebx]
第一个指令把JNIEnv的内容放入ebx寄存器,下面一句把ebx这个地址指向位置存放的值放入eax。因为ebx指向的内容和JNIEnv相同,eax现在有了JNIEnv指向的位置的值,这意味着现在eax有了函数表的起始地址。

下一步我们需要从函数表的项目中取出指向我们想调用的接口函数的值。为了做到这一点,我们必须把函数索引乘以4(参见Sheng Liang的书)— 因为每个指针是四字节长度 –- 然后把结果加上我们在前面存在eax里面的函数表起始地址。下面是实现代码:
mov ebx, eax ; save pointer to function table mov eax, index ; move the value of index into eax mov ecx, 4 mul ecx ; multiply index by 4 add ebx, eax ; ebx points to the desired entry mov eax, [ebx] ; eax points to the desired function
eax寄存器里面的内容现在可以用来调用函数了。
图1显示了存取JNI接口的过程。

图1:存取JNI函数
0
相关文章