博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GetByteArrayElements和ReleaseByteArrayElements
阅读量:7211 次
发布时间:2019-06-29

本文共 1782 字,大约阅读时间需要 5 分钟。

hot3.png

GetByteArrayElements的官方解释:

Returns the body of the primitive array. The result is valid until

the corresponding Release<Type>ArrayElements function is
called.Since the returned array may be a copy of the original
array, changes made to the returned array will not necessarily
be reflected in the original array until a corresponding
Release<Type>ArrayElementsis called.
IfisCopyis notNULL, then*isCopyis set toJNI_TRUEif a copy
is made; if no copy is made, it is set toJNI_FALSE.

在使用

GetByteArrayElements
时:
byteBuffer = env->GetByteArrayElements(buffer, JNI_FALSE);/*  当第二个参数为0时,个人理解此接口只是一个指针转换。但是,如果你需要确保byteBuffer 指针的数据和buffer同步(参见红色说明),必须调用: env->ReleaseByteArrayElements(buffer, byteBuffer, 0);*/
在使用
ReleaseByteArrayElements
时:

env->ReleaseByteArrayElements(buffer, byteBuffer, JNI_FALSE);/*小心最后一个参数,如果为0是会释放 m 所指向的内存的. 如果M刚好指向一个栈上的数组的话,这样可能在Release 版本中造成内存方面的随机错误.可以用JNI_COMMIT来避免.*/

解决方法摘自:http://blog.csdn.net/rainlight/article/details/818964

其实现代码也许如下

+void

+KaffeJNI_ReleaseByteArrayElements(JNIEnv* env UNUSED, jbyteArray arr, jbyte* elems, jint mode)
+{
+ BEGIN_EXCEPTION_HANDLING_VOID();
+
+ if (elems != unhand_array((HArrayOfByte*)arr)->body) {
+ switch (mode) {
+ case JNI_COMMIT:
+ memcpy(unhand_array((HArrayOfByte*)arr)->body, elems, obj_length((HArrayOfByte*)arr) * sizeof(jbyte));
+ break;
+ case 0:
+ memcpy(unhand_array((HArrayOfByte*)arr)->body, elems, obj_length((HArrayOfByte*)arr) * sizeof(jbyte));
+ KFREE(elems);
+ break;
+ case JNI_ABORT:
+ KFREE(elems);
+ break;
+ }
+ }
+ END_EXCEPTION_HANDLING();
+}

JNI_COMMIT forces the native array to be copied back to the original array in the Java virtual machine.JNI_ABORTfrees the memory allocated for the native array without copying back the new contents

转载于:https://my.oschina.net/chenshouyong/blog/97521

你可能感兴趣的文章
[20161128]关于Little Enddian.txt
查看>>
java中三种常见内存溢出错误的处理方法(good)
查看>>
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint
查看>>
全面剖析Redis Cluster原理和应用 (good)
查看>>
PostgreSQL学习手册(常用数据类型)
查看>>
cms
查看>>
Visual Studio 2013 Xamarin for iOS 环境搭建
查看>>
为什么 Linux Mint 比 Ubuntu好?
查看>>
Android零基础入门第31节:几乎不用但要了解的AbsoluteLayout绝对布局
查看>>
CentOS 6.2 Eclipse CDT 开发环境搭建
查看>>
服务端I/O性能:Node、PHP、Java、Go的对比
查看>>
注解的原理又是怎么一回事
查看>>
nginx开发(二)配置mp4文件在线播放
查看>>
金额逾千万!浪潮智能存储G2中标华中科技大学脑科学研究项目
查看>>
展讯召开2017全球合作伙伴大会,发布两款新平台及新战略
查看>>
Android——DDMS简单介绍
查看>>
SQL error: cannot use the special principal 'sa'
查看>>
写一个简单的实时互动小游戏
查看>>
WIN版的Jenkins Master加入LINUX的SLAVE节点,并作C++程序的集成交付
查看>>
mysql 半同步 5.6及5.7
查看>>