小心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...
  • nicebooks
  • nicebooks
  • 2014年01月06日 19:30
  • 12105

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
  • 1102

Android NDK之JNI陷阱

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

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

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

GetByteArrayElements和ReleaseByteArrayElements

GetByteArrayElements的官方解释: Returns the body of the primitive array. The result is valid until th...
  • kemengli
  • kemengli
  • 2015年07月01日 10:08
  • 277

JNI中的常用方法总结

1、 用来获取数组元素的JNI函数集 GetBooleanArrayElements, GetByteArrayElements, GetCharArrayElements, GetShortA...
  • dengxu11
  • dengxu11
  • 2012年09月16日 01:29
  • 3235

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

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

JNI学习积累之一 ---- 常用函数大全

本文原创,转载请注明出处:http://blog.csdn.net/qinjuning                最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间...
  • qinjuning
  • qinjuning
  • 2012年05月23日 17:40
  • 45190

jni使用深入分析

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

C/C++中GetByteArrayElements使用区别

jbyte   *arr   =   env-> GetByteArrayElements(jarr,   0); 只有C++时才用 在C中的写法应该是 jbyte   *   arr  ...
  • haoruifly
  • haoruifly
  • 2012年02月24日 12:51
  • 9124
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:小心ReleaseByteArrayElements 中的参数问题
举报原因:
原因补充:

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