2.4 字符串类型、类描述符、字段描述符:
这三项内容都是在本地方法中对于Java层对象的描述,比如用“[Ljava/lang/String;”来描述String数组,这些内容与JNI规范以及Java虚拟机规范中所定义的都完全一致,所以这里不再多说。
3. KNI函数
本节分类简介各种KNI函数的功能。大部分的函数功能比较容易理解,只有“参数传递”和“句柄操作”是比较特别的内容,将作详细讲解。
3.1 版本信息:
3.1.1 jint KNI_GetVersion()
得到KNI的版本号。
3.2 类和接口操作:
3.2.1 void KNI_FindClass(const char* name, jclass classHandle)
初始化一下指向某种对象的名柄,对象名字在name中。
3.2.2 void KNI_GetSuperClass(jclass classHandle, jclass superclassHandle)
取得超类的句柄。原类的句柄在classHandle中,调用后超类的名柄将被存放在superclassHandle中。如果classHandle指向一个java.lang.Object对象,则superclassHandle应为NULL.
3.3.3 jboolean KNI_IsAssignableFrom(jclass classHandle1, jclass classHandle2)
判断classHandle1类的对象是否能安全转换为classHandle2类的对象。
3.3 异常:
3.3.1 jint KNI_ThrowNew(const char* name, const char* message)
抛异常,name是异常类的名字,message是所附带的信息。
3.3.2 void KNI_FatalError(const char* message)
出现致命错误时使用,向标准输出打印出错信息,并终止虚拟机。
3.4 对象操作
3.4.1 void KNI_GetObjectClass(jobject objectHandle, jclass classHandle)
取得某对象所对属的类,objectHandle是对象句柄,调用后,类句柄将被存入classHandle中。
3.4.2 jboolean KNI_IsInstanceOf(jobject objectHandle, jclass classHandle)
判断句柄objectHandle所指向的对象是否是句柄classHandle所指向的类的实例。
3.5 对象字段操作
3.5.1 jfieldID KNI_GetFieldID(jclass classHandle, const char* name, const char* signature)
取得类classHandle中由name和signature所指定的字段名。这个字段名的作用与JNI中的相同,是于在其它函数中读写字段的值。
3.5.2 <NativeType> KNI_Get<Type>Field(jobject objectHandle, jfieldID fieldID)
3.5.3 void KNI_Set<Type>Field(jobject objectHandle, jfieldID fieldID, <NativeType> value)
上面两个方法分别用于读写<Type>类型字段的值,<Type>为基本类型。
3.5.4 void KNI_GetObjectField(jobject objectHandle, jfieldID fieldID, jobject toHandle)
3.5.5 void KNI_SetObjectField(jobject objectHandle, jfieldID fieldID, jobject fromHandle)
上面两个方法分别用于读写对象。
3.6 静态字段操作
3.6.1 jfieldID KNI_GetStaticFieldID(jclass classHandle, const char* name, const char* signature)
取得静态字段名。
3.6.2 <NativeType> KNI_GetStatic<Type>Field(jclass classHandle, jfield fieldID)
3.6.3 void KNI_SetStatic<Type>Field(jclass classHandle, jfieldID fieldID, <NativeType>value)
上面两个方法分别用于读写<Type>类型静态字段的值,<Type>为基本类型。
3.6.4 void KNI_GetStaticObjectField(jclass classHandle, jfield fieldID, jobject toHandle)
3.6.5 void KNI_SetStaticObjectField(jclass classHandle, jfield fieldID, jobject fromHandle)
上面两个方法分别用于读写静态对象。
3.7 字符串操作
3.7.1 jsize KNI_GetStringLength(jstring stringHandle)
取得字符串长度。
3.7.2 void KNI_GetStringRegion(jstring stringHandle, jsize offset, jsize n, jchar* jcharbuf)
读取字符串内容。
3.7.3 void KNI_NewString(const jchar* uchars, jsize length, jstring stringHandle)
使用Unicode序列创建String.
3.7.4 void KNI_NewStringUTF(const char* utf8chars, jstring stringHandle)
使用UTF-8序列创建String.

