一、综述
1、java中的返回值void与jni中的void是完全对应的。
2、java中的基本数据类型(byte,short,int,long,float,double,boolean,char)在jni中对应的数据类型在前面加上j (jbyte,jshort,jint,jlong,jfloat,jdouble,jboolean,jchar)。
3、java中的对象,包括类库中定义的类、接口,都对应jni中的jobject。
4、java中基本数据类型的数组对应与jni中的jarray类型(type就是上面说的8中基本数据类型)。
5、java中对象的数组对应于jni中jobjectArray类型。
二、java数据类型与jni类型映射表
Java 类型
|
本地类型
|
描述
|
boolean
|
jboolean
|
C/C++8位整型
|
byte
|
jbyte
|
C/C++带符号的8位整型
|
char
|
jchar
|
C/C++无符号的16位整型
|
short
|
jshort
|
C/C++带符号的16位整型
|
int
|
jint
|
C/C++带符号的32位整型
|
long
|
jlong
|
C/C++带符号的64位整型e
|
float
|
jfloat
|
C/C++32位浮点型
|
double
|
jdouble
|
C/C++64位浮点型
|
Object
|
jobject
|
任何Java对象,或者没有对应java类型的对象
|
Class
|
jclass
|
Class对象
|
String
|
jstring
|
字符串对象
|
Object[]
|
jobjectArray
|
任何对象的数组
|
boolean[]
|
jbooleanArray
|
布尔型数组
|
byte[]
|
jbyteArray
|
比特型数组
|
char[]
|
jcharArray
|
字符型数组
|
short[]
|
jshortArray
|
短整型数组
|
int[]
|
jintArray
|
整型数组
|
long[]
|
jlongArray
|
长整型数组
|
float[]
|
jfloatArray
|
浮点型数组
|
double[]
|
jdoubleArray
|
双浮点型数组
|
三、java数据类型在jni中的使用。
JNI通过JNIEnv提供的操作Java数组的功能。它提供了两个函数:一个是操作java的简单型数组的,另一个是操作对象类型数组的。
因为速度的原因,简单类型的数组作为指向本地类型的指针暴露给本地代码。因此,它们能作为常规的数组存取。这个指针是指向实际的Java数组或者Java数组的拷贝的指针。另外,数组的布置保证匹配本地类型。
为了存取Java简单类型的数组,你就要要使用GetXXXArrayElements函数(见下表),XXX代表了数组的类型。这个函数把Java数组看成参数,返回一个指向对应的本地类型的数组的指针。
函数
|
Java 数组类型
|
本地类型
|
GetBooleanArrayElements
|
jbooleanArray
|
jboolean
|
GetByteArrayElements
|
jbyteArray
|
jbyte
|
GetCharArrayElements
|
jcharArray
|
jchar
|
GetShortArrayElements
|
jshortArray
|
jshort
|
GetIntArrayElements
|
jintArray
|
jint
|
GetLongArrayElements
|
jlongArray
|
jlong
|
GetFloatArrayElements
|
jfloatArray
|
jfloat
|
GetDoubleArrayElements
|
jdoubleArray
|
jdouble
|
当你对数组的存取完成后,要确保调用相应的ReleaseXXXArrayElements函数,参数是对应Java数组和GetXXXArrayElements返回的指针。如果必要的话,这个释放函数会复制你做的任何变化(这样它们就反射到java数组),然后释放所有相关的资源。
为了使用java对象的数组,你必须使用GetObjectArrayElement函数和SetObjectArrayElement函数,分别去get,set数组的元素。GetArrayLength函数会返回数组的长度。
四、java对象类型在jni中的使用
JNI提供的另外一个功能是在本地代码中使用Java对象。通过使用合适的JNI函数,你可以创建Java对象,get、set 静态(static)和实例(instance)的域,调用静态(static)和实例(instance)函数。JNI通过ID识别域和方法,一个域或方法的ID是任何处理域和方法的函数的必须参数。
下表列出了用以得到静态(static)和实例(instance)的域与方法的JNI函数。每个函数接受(作为参数)域或方法的类,它们的名称,符号和它们对应返回的jfieldID或jmethodID。
函数
|
描述
|
GetFieldID
|
得到一个实例的域的ID
|
GetStaticFieldID
|
得到一个静态的域的ID
|
GetMethodID
|
得到一个实例的方法的ID
|
GetStaticMethodID
|
得到一个静态方法的ID
|
如果你有了一个类的实例,它就可以通过方法GetObjectClass得到,或者如果你没有这个类的实例,可以通过FindClass得到。符号是从域的类型或者方法的参数,返回值得到字符串,如下表所示。
Java 类型
|
符号
|
boolean
|
Z
|
byte
|
B
|
char
|
C
|
short
|
S
|
int
|
I
|
long
|
J
|
float
|
F
|
double
|
D
|
void
|
V
|
objects对象
|
Lfully-qualified-class-name;L类名
|
Arrays数组
|
[array-type [数组类型
|
methods方法
|
(argument-types)return-type(参数类型)返回类型
|