3.8 数组操作
3.8.1 jsize KNI_GetArrayLength(jarray arrayHandle)
取得数组长度。
3.8.2 <NativeType> KNI_Get<Type>ArrayElement(<ArrayType>arrayHandle, jint index)
取得<Type>类型数组元素。
3.8.3 void KNI_Set<Type>ArrayElement(<ArrayType>arrayHandle, jint index, <NativeType> value)
设置<Type>类型数组元素。
3.8.4 void KNI_GetObjectArrayElement(jobjectArray arrayHandle, jint index, jobject toHandle)
取得对象数组元素。
3.8.5 void KNI_SetObjectArrayElement(jobjectArray arrayHandle, jint index, jobject fromHandle)
设置对象数组元素。
3.8.6 void KNI_GetRawArrayRegion(jarray arrayHandle, jsize offset, jsize n, jbyte* dstBuffer)
以字节为单位读取一个区域的值。
3.8.7 void KNI_SetRawArrayRegion(jarray arrayHandle, jsize offset, jsize n, const jbyte* srcBuffer)
以字节为单位设置一个区域的值。
3.9 参数传递
KNI的参数传递方式有一些不同的地方,在进行KNI调用时,从Java层传来的参数在本地函数中不能直接读取到。所有本地的函数,不论在Java层声明时有多少个参数,它的参数表都将为空。这是因为KNI在虚拟机的内部,虚拟机在调用Java方法的时候是以堆栈的形式传参的,在调用KNI方法的时候也是用了之种方式。
好在KNI的设计原则之一是“与虚拟机细节相隔离”,所以KNI的使用者不必去学习虚拟机的堆栈式传参,KNI已经封装好了一些方便使用的函数。
同样,函数的返回值也要用专门的函数来传回。
3.9.1 <ReturnType> KNI_GetParameterAs<Type>(jint index)
取得类型为<Type>的第index个参数,index是此参数在Java方法参数表中的位置。
比如:void native func (int i, long l, int j);这个Java方法有三个参数,在它的本地方法中,要得到它的第一个参数就要做如下调用:
KNI_GetParameterAsInt(1);
注意,long和double型的参数比较长,要占两个位置,所以最后一个参数的序号不是3而是4.
3.9.2 void KNI_GetParameterAsObject(jint index, jobject toHandle)
同理,本函数读取index处的对象,并使用toHandle句柄来索引它。
3.9.3 void KNI_GetThisPointer(jobject toHandle)
读取当前类的this对象的句柄。
3.9.4 void KNI_GetClassPointer(jclass toHandle)
读取当前类的句柄。
3.9.5 void KNI_ReturnVoid()
用于void型函数的返回。
3.9.6 void KNI_Return<Type>(<NativeType> value)
用于<Type>型函数的返回。
3.10 名柄操作
KNI中对于Java传来的对象的引用,不能直接使用C语言的指针,这是因为KNI在虚拟机内部,C层的函数中所引用的对象也还是会参与垃圾收集,随时有可能被移动,C层的指针指向的是绝对的内存位置,就会失效。所以KNI使用“句柄”来索引对象,句柄由虚拟机来维护,不会失效。
3.10.1 void KNI_StartHandles(n)
声明在当前函数中所要使用的句柄数,要使用多少句柄,都需要事先声明。
3.10.2 void KNI_DeclareHandle(handle)
声明一个句柄。
3.10.3 jboolean KNI_IsNullHandle(handle)
判断句柄是否为空。
3.10.4 jboolean KNI_IsSameObject(handle1, handle2)
判断两句柄是否指向了同一个对象。
3.10.5 void KNI_ReleaseHandle(handle)
释放句柄。
3.10.6 void KNI_EndHandles()
删除句柄。
3.10.7 void KNI_EndHandlesAndReturnObject(jobject objectHandle)
删除句柄并把句柄所指向的对象作为函数值返回。

