JNI学习笔记——数组操作
来源:互联网 发布:tableview性能优化 编辑:程序博客网 时间:2024/05/20 14:14
Java语言中的数组一般有两种:基本数据类型的数组和引用类型的数组。同样在JNI中也有这两种类型的数组。
Java中基本的数据类型有byte、short、int、long、float、double、char、boolean等8种基本数据类型,基本数据类型的数组就是这些基本数据类型的一维数组。
引用类型的数组是指数组元素非基本数据类型的数组,如二维数组,string数组等。
一、处理基本类型的数组
处理基本数组跟处理字符串类似,有相似的函数。
a)Get<TYPE>ArrayElements(<TYPE>Arrayarr , jboolean* iscopy);
这类函数可以把java基本类型的数组转换成C/C++中的数组,有两种处理方式,一是拷贝一份传回本地代码,二是把指向java数组的指针直接传回本地代码。处理完本地化的数组后,需要通过Release<TYPE>ArrayElements来释放数组。
b)Release<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++的数组。
c)GetPrimitiveArrayCritical (jarray arr , jboolean* isCopied);
ReleasePrimitiveArrayCritical ( jarray arr ,void* array ,jint mode);
这两个函数也是为了增加直接传回指向java数组的指针而加入的函数。同样的,也会有GetStringCritical的死锁的问题。
d)Get<TYPE>ArrayRegion(<TYPE>Array arr , jsize start ,jsize len , <TYPE>* buffer);
这个函数在C/C++中预先开辟一段内存,然后把java基本类型的数组拷贝到这段内存中,跟GetStringRegion原理类似。
e)Set<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);
返回数组中元素的个数,该数组既可以是基本数据类型的数组也可以是对象的数组。
- JNI学习笔记——数组操作
- JNI学习笔记——字符串操作
- Jni学习之数组操作
- 学习笔记——数组的操作和遍历数组
- JNI学习4——访问数组(JNI)
- JNI学习笔记5——本地方法处理java数组/引用问题/缓存jfieldID/jmethodID
- JNI学习笔记(四)——基础类型、Strings和数组
- JNI学习笔记——int数组赋值要注意的问题
- Android NDK (学习笔记六) —— JNI交互间数组的处理
- JNI学习笔记(二)——JNI
- JNI学习笔记1——开篇
- NDK开发学习笔记—JNI入门
- JNI操作数组
- JNI操作数组
- jni数组操作
- android jni操作数组
- JNI操作数组代码
- android jni操作数组
- backlight misc驱动范例 及应用程序范例
- log4j简单使用
- ArcGIS 学习笔记-创建graticule shapefile
- OpenGL二 - 画一个五角星 pentagram
- 使用opencv作物件识别(一) —— 积分直方图加速HOG特征计算
- JNI学习笔记——数组操作
- Dialog点击其他区域消失
- Java volatile关键字
- 算法导论--分治法
- 如何将Eclipse的中文版本转换成英文版本
- 建图方式一 之 “邻接链表”
- Apache Log4j配置说明
- Java动态绑定机制的内幕
- 经典问题石子合并(环形)DP