会见JNI函数:JNIEnv自变量
操作JNI函数,措施员可从一个固有要领的内部与JVM打交道。正如各人在前面的例子中看到的那样,每个JNI固有要领城市吸收一个非凡的自变量作为本身的第一个参数:JNIEnv自变量——它是指向范例为JNIEnv_的一个非凡JNI数据布局的指针。JNI数据布局的一个元素是指向由JVM生成的一个数组的指针;该数组的每个元素都是指向一个JNI函数的指针。可从固有要领的内部发出对JNI函数的挪用,做法是除掉对这些指针的引用(详细的操纵实际很简朴)。每种JVM都以本身的方法实现了JNI函数,但它们的地点必定位于预先界说好的偏移处。
操作JNIEnv自变量,措施员可会见一系列函数。这些函数可分别为下述种别:
■获取版本信息
■举办类和工具操纵
■节制对Java工具的全局和局部引用
■会见实例字段和静态字段
■挪用实例要领和静态要领
■执行字串和数组操纵
■发生和节制Java异常
JNI函数的数量相当多,这里不再详述。相反,我会向各人展现利用这些函数时背后的一些根基道理。欲相识更具体的环境,请参阅本身所用编译器的JNI文档。
若调查一下jni.h头文件,就会发此刻#ifdef _cplusplus预处理惩罚器条件的内部,当由C++编译器编译时,JNIEnv_布局被界说成一个类。这个类包括了大量内嵌函数。通过一种简朴并且熟悉的语法,这些函数让我们可以从容会见JNI函数。譬喻,前例包括了下面这行代码:
(*jEnv)->ReleaseStringUTFChars(jEnv, jMsg,msg);
它在C++里可改写成下面这个样子:
jEnv->ReleaseStringUTFChars(jMsg,msg);
各人可留意到本身不再需要同时除掉对jEnv的两个引用,沟通的指针不再作为第一个参数通报给JNI函数挪用。在这些例子剩下的处所,我会利用C++气势气魄的代码。
1. 会见Java字串
作为会见JNI函数的一个例子,请思考上述的代码。在这里,我们操作JNIEnv的自变量jEnv来会见一个Java字串。Java字串采纳的是Unicode名目,所以假使收到这样一个字串,并想把它传给一个非Unicode函数(如printf()),首先必需用JNI函数GetStringUTFChars()将其转换成ASCII字符。该函数能吸收一个Java字串,然后把它转换成UTF-8字符(用8位宽度容纳ASCII值,或用16位宽度容纳Unicode;若原始字串的内容完全由ASCII组成,那么功效字串也是ASCII)。
GetStringUTFChars是JNIEnv间接指向的谁人布局里的一个字段,而这个字段又是指向一个函数的指针。为会见JNI函数,我们用传统的C语法来挪用一个函数(通过指针)。操作上述形式可实现对所有JNI函数的会见。