小心ReleaseByteArrayElements 中的参数问题

原创 2006年06月21日 16:59:00

在Sun的官方文档中,关于该函数的用法如下

The array is returned to the calling Java language method, which in turn, garbage collects the reference to the array when it is no longer used. The array can be explicitly freed with the following call.

  (*env)-> ReleaseByteArrayElements(env, jb, 
                                        (jbyte *)m, 0);

The last argument to the ReleaseByteArrayElements function above can have the following values:

  • 0: Updates to the array from within the C code are reflected in the Java language copy.

     

  • JNI_COMMIT: The Java language copy is updated, but the local jbyteArray is not freed.

     

  • JNI_ABORT: Changes are not copied back, but the jbyteArray is freed. The value is used only if the array is obtained with a get mode of JNI_TRUE meaning the array is a copy.

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

其实现代码也许如下

+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_ABORT frees the memory allocated for the native array without copying back the new contents

相关文章推荐

JNI编程经验(JNI Tips)

翻译原文来自:http://developer.android.com/intl/zh-cn/training/articles/perf-jni.html JNI全称是Java Native In...

Jni Byte数组传递异常

JNI jbyteArray jobjectArray Crash pin count is 1024 JNI:pin count on array 0x... ([B) ReleaseByteArr...
  • sz66cm
  • sz66cm
  • 2016年11月04日 11:11
  • 899

Android开发实践:Java层与Jni层的数组传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni...

jni使用深入分析

想要查看jni函数的具体说明,可以查看百度文库的 jni此常用函数 1.部分类型转换及常用函数说明 1) 本地方法对Java字符串的操作 const jchar *GetStringChars(...

Android NDK之JNI陷阱

背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台。这就涉及到Android NDK(native develop kit)内容。这里只想记录下JNI...
  • goof
  • goof
  • 2013年09月30日 21:54
  • 9194

JNI 实战全面解析

项目决定移植一款C++开源项目到Android平台,开始对JNI深入研究。 JNI是什么? JNI(Java Native Interface)意为JAVA本地调用,它允许Java代码和其他语言写的代...

jni调用GetByteArrayElements

你的例子是否是书上/网上抄来的  jbyte   *arr   =   env-> GetByteArrayElements(jarr,   0);  只有C++是才用  在C中的写法应该是  ...
  • wletv
  • wletv
  • 2011年10月16日 01:41
  • 20519

JNI中参数的传递与操作(中)

文章参自:http://wenku.baidu.com/view/0b78684669eae009581bec73.html                   http://wenku.baidu...
  • hudashi
  • hudashi
  • 2011年12月10日 09:19
  • 14106

android opencv 环境搭建

个人博客原文地址 www.zalezone.cn简介android studio自从1.3以后开始对android的ndk进行支持了,所以现在基本android开发可以废弃eclipse了,毕竟跟着...

vlc学习总结(一)

因工作需要学习vlc已经有一段时间了,现在对vlc的总体框架做一个大概的总结。有许多vlc的细节依旧不是了解,如有理解错误之处还请见谅。   一、整体架构 vlc是一个开源的播放器,支持各种平台及各种...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:小心ReleaseByteArrayElements 中的参数问题
举报原因:
原因补充:

(最多只允许输入30个字)