c#高级编程
Android NDK开发中,JNI把java中的数组也当是引用数据类型。并且提供了对应的的函数访问java数组。那么你知道都有哪些方法以及如何操作吗?
NDK中使用数组
一、在JNI中创建指定类型的数组
(1)在JNI中创建指定类型的数组
在Native中使用 NewTypeArray函数可以创建数组实例。其中的Type可以是:Boolean、Char、Short、Int、Long、Float、Double,Object。(如图:创建数组的函数.png)。
创建数组的函数.png
(2)使用NewByteArray创建数组
今天我们选择创建NewByteArray数组(如图:创建指定长度的Byte数组.png)。 与上一篇文章中我们讲的创建NewStringUTF函数一样,在内存溢出的情况下,那么headersBytesArr就会是NULL以通知Native代码抛出异常。
jbyteArray headersBytesArr = NULL;/*** 创建长度为10的byte数组*/headersBytesArr = _env ->NewByteArray(10);if(headersBytesArr != NULL){LOGE("===赞,创建byte数组成功了===");} else{LOGE("===很遗憾,创建byte数组失败了,");}
创建指定长度的Byte数组.png
二、如何访问数组元素
开发中访问数组元素可以有两种方式:一种是将数组复制给C数组,另一种是提供直接指向数组元素的指针。
(1)把Java数组区复制到C数组中
Native代码可以和使用普通的C数组一样的方式去使用和修改数组元素。如果是复制到C数组中使用GetByteArrayRegion方法(如图:从Java数组区复制到C数组.png);
从Java数组区复制到C数组.png
如果是Native代码想把修改后的数组提交给Java层的数组,就需要使用SetByteArrayRegion方法(如图:从Native数组区提交到Java数组.png);
从Native数组区提交到Java数组.png
注意:这里说的SetTypeArrayRegion和GetTypeArrayRegion中的Type和上面说的创建中的含义是一致的。
(2)对直接指针进行操作
如果是对直接指针进行操作,Native代码需要使用GetByteArrayElements函数得到指向数组的直接指针。其中第二个参数是可选参数isCopy,可以让我们确定返回的数组地址是指向副本还是指向堆中的固定对象。(如图: 得到指向数组的直接指针.png)。
得到指向数组的直接指针.png
在Native中使用完指针资源以后,一定要记得释放资源,不然很容易出现内存泄漏。释放指针使用ReleaseByteArrayElements(_javaArray, directHeader, 0)方法(如图:释放指向Java层数组的指针.png)。
总结
1.经过上面使用可以知道,当数组很长的时候,如果使用第一种复制数组的方式,将会在性能上面大打折扣。这时我们可以使用复制数组中的一部分元素的方式,尽量不要去复制整个数组。
2.一定要记住:千万要记得释放指针!!!
相关阅读
长的非阻塞write 从标准输入读500000字节,并试图写到标准输出。先将标准输出设置为非阻塞,然后用for循环输出,每次write调用的结果都
【UNIX环境高级编程】UNIX基础知识 1.UNIX体系结构 从严格意义上,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行