GetByteArrayElements和ReleaseByteArrayElements

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值