JNI学习笔记——数组操作

来源:互联网 发布:tableview性能优化 编辑:程序博客网 时间:2024/05/20 14:14

Java语言中的数组一般有两种:基本数据类型的数组和引用类型的数组。同样在JNI中也有这两种类型的数组。

Java中基本的数据类型有byte、short、int、long、float、double、char、boolean等8种基本数据类型,基本数据类型的数组就是这些基本数据类型的一维数组。

引用类型的数组是指数组元素非基本数据类型的数组,如二维数组,string数组等。

一、处理基本类型的数组

处理基本数组跟处理字符串类似,有相似的函数。

aGet<TYPE>ArrayElements(<TYPE>Arrayarr , jboolean* iscopy);

这类函数可以把java基本类型的数组转换成C/C++中的数组,有两种处理方式,一是拷贝一份传回本地代码,二是把指向java数组的指针直接传回本地代码。处理完本地化的数组后,需要通过Release<TYPE>ArrayElements来释放数组。

bRelease<TYPE>ArrayElements(<TYPE>Array arr ,<TYPE>* array ,jint mode);

用这个函数可以选择如何处理Java跟C++的数组,是提交还是撤销等,内存释放还是不释放等。

mode可以取下面的值:

0——对java数组进行更新并释放C/C++数组,

JNI_COMMIT——对java数组进行更新但不释放C/C++的数组,

JNI_ABORT——对java的数组不更新,释放C/C++的数组。

cGetPrimitiveArrayCritical (jarray arr , jboolean* isCopied);

   ReleasePrimitiveArrayCritical ( jarray arr ,void* array ,jint mode);

这两个函数也是为了增加直接传回指向java数组的指针而加入的函数。同样的,也会有GetStringCritical的死锁的问题。

dGet<TYPE>ArrayRegion(<TYPE>Array arr , jsize start ,jsize len , <TYPE>* buffer);

这个函数在C/C++中预先开辟一段内存,然后把java基本类型的数组拷贝到这段内存中,跟GetStringRegion原理类似。

eSet<TYPE>ArrayRegion (<TYPE>Array arr , jsize start , jsize len , const <TYPE>* buffer);

把java基本类型的数组中的指定范围的元素用C/C++的数组中的元素来赋值。

f<TYPE>ArrayNew<TYPE>Array (jsize sz);

用于创建指定长度的基本数据类型的数组。

二、处理引用类型数组( Object [ ] )

Jni没有提供直接把java对象类型数组直接转到C/C++中的函数,而是通过Get/SetObjectArrayElement这样的函数来对Java的Object[ ]数组进行操作。

a)jobject GetObjectArrayElement( jobjectArray array , jsize index );

b) void SetObjectArrayElement ( jobjectArrayarray ,jsize index , jobject val);

使用上述函数也不用释放任何资源。

c)NewObjectArray可以通过指定长度跟初始值来创建某个类的数组。

三、其他方法

       一个能用于两种不同数组的函数:

       jsize GetArrayLength(jarray array);

       返回数组中元素的个数,该数组既可以是基本数据类型的数组也可以是对象的数组。

0 0
原创粉丝点击