[Android Pro] 小心ReleaseByteArrayElements 中的参数问题

referen to : http://blog.csdn.net/rainlight/article/details/818964

在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

时间: 2024-10-19 19:28:13

[Android Pro] 小心ReleaseByteArrayElements 中的参数问题的相关文章

[Android Pro] http请求中传输base64出现加号变空格的解决办法

reference to : http://blog.csdn.net/jsjwbxzy/article/details/45970231 try { des = URLEncoder.encode(des, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }

Android开发中Flag参数的讲解

Android开发中Flag参数的讲解: Intent对象在Android开发中起着举足轻重的作用,其内置了丰富的常量,用于传递数据, 下面本文将介绍跟Task有关的一些Flag参数,各参数的理解均来自Android API和本人在实际项目中的体验,如果有描述不当之处,还请各位不吝赐教. 1.FLAG_ACTIVITY_BROUGHT_TO_FRONT:不在程序代码中设置,在launchMode中设置singleTask模式时系统帮你设定. 2.FLAG_ACTIVITY_CLEAR_TOP:清

[Android Pro] Android应用性能测试之CPU和内存占用(转载)

首先稍做分析一下测试环境:我们知道CPU和内存占用是一个实时变化的状态,而市面上还没有具体的哪款android应用能做到实时监控CPU和内存占用并使用log日志保存.考虑到android的底层框架是基于Linux的平台,所有我们可以通过Linux的资源监控命令来实现对android平台的资源实时监控. 要做到上边的测试环境的实现,需要具备以下几点: 1.被测试的手机具备root权限:因为涉及到底层的linux命令,需要读取或执行相应的文件.至于如何root你的手机,不同型号的手机root的方法不

[Android Pro] Android--Sensor传感器

Android提供了对设备传感器的支持,只要Android设备的硬件提供了这些传感器,Android应用可以通过传感器 来获取设备的外界条件,包括手机的运行状态.当前摆放的方向等.Android系统还提供了驱动程序去管理这些传感器硬件,可以通过监听器的方式监听传感 器硬件感知到的外部环境的变化.本篇博客主要讲解如何简单的使用Android下的传感器,最后将以一个简单的Demo演示. 开发传感器应用步骤 开发一个对于传感器支持的应用十分简单,开发人员只要在传感器管理器SensorManager中为

[Android Pro] 内容提供者ContentProvider的基本使用

一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.ContentProvider为存储和获取数据提供了统一的接口.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.而使用ContentProvider共享数据的

[Android Pro] Android权限设置android.permission完整列表

android.permission.ACCESS_CHECKIN_PROPERTIES允许读写访问"properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded) android.permission.ACCESS_COARSE_LOCATION允许一个程序访问Cel

android屏幕分类与屏幕相关参数定义

android设备运行在各种不同的屏幕中,这些屏幕有着不同的screen sizes(屏幕大小)和screen densities(屏幕密度).screen sizes表示屏幕的实际物理大小,比如5寸手机,7寸平板,8寸平板.而screen densities表示屏幕的像素密度,比如同样5寸的手机,有720p的,有1080p的.screen sizes和screen densities从两个维度表示了屏幕的属性,他们互不影响. Screen Sizes 屏幕的真实物理尺寸,以屏幕的对角线测量,一

我们来一探究竟 Android 7.0 适配中 FileProvider 部分

本文标签: Android7.0 FileProvider 由于 Android 7.0 或更高版本的系统在国内手机市场上的占比不是很高,很多 Android 开发人员并没有做 7.0 适配工作,同时测试人员也容易忽视这方面的兼容问题.这导致 7.0 及以上版本的手机用户在使用到应用部分功能时可能出现 App 崩溃闪退.其中,大部分原因都是由项目中使用到 file:// 类型的 URI 所引发的.本文我们便来一探究竟. Android 7.0 权限变更 为了提高私有目录的安全性,防止应用信息的泄

android之在view中内嵌浏览器的方法

我要做的一个东西是在一个页面的中间嵌入浏览器,一开始不知道从哪里开始,因为以前用的都是Textveiw或者editVeiw之类的控件,而它们并不能用来显示网页的内容,怎么办呢? 首先想到的是:是不是有一个用来显示网页的View呢,于是我就在eclipse里xml编辑器里输入<web,哈哈,果然下面有个提示是webVeiw,那么能不能用它呢?于是到网上搜一下它的资料,果然可以的,下面就开始吧. 先在xml里把webview建好,在代码里用findViewById()将其取出来.我的代码是: Web