首页 > 移动平台 > 详细

(原)JNI中env->GetByteArrayElements和AndroidBitmap_getInfo的冲突

时间:2015-03-06 18:51:47      阅读:2359      评论:0      收藏:0      [点我收藏+]

也不是很确定,前段时间的代码没有出问题,但是今天调试了半天,一直崩溃:vm aborting。

以前的部分代码:

 1 JNIEXPORT void JNICALL XXX
 2   (JNIEnv* env,jobject thiz, jobject bitmap, jbyteArray databuf, jint width, jint height)
 3 {
 4     jboolean* pArraydata = (jboolean*)env->GetPrimitiveArrayCritical(databuf, 0);
 5     AndroidBitmapInfo  info;
 6     int                ret;
 7     if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0)
 8     {
 9        XXX;
10     }
11     if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888)
12     {
13       XXX;
14     }
15     if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0)
16     {
17        XXX;
18     }
19     AndroidBitmap_unlockPixels(env, bitmap);
20     env->ReleasePrimitiveArrayCritical(databuf, pArraydata, 0);
21 }    

后来发现不用bitmap的这些代码程序没错,或者注释掉GetPrimitiveArrayCritical的相关代码程序也没错。但是两者同时出现的话,程序就崩溃。

之后想到不使用GetPrimitiveArrayCritical,换成别的代码试一下。

1     unsigned char isCopy;
2     jbyte* pArrayimgdata = env->GetByteArrayElements(databuf,&isCopy); % 此处是否使用isCopy都没关系,只要和最后release对应上就行。
3   if ((ret = AndroidBitmap_getInfo(env, bitmaps, &info)) < 0)
4   { 5    XXX; 6 } 7 XXX; 8 env->ReleaseByteArrayElements(databuf,pArrayimgdata,isCopy);

 

程序就不会崩溃了。

ps:仍旧没有弄懂为什么以前的代码可以用,今天就不能用了(当然,以前的代码中还有别的代码,今天的只使用了该部分代码)。

(原)JNI中env->GetByteArrayElements和AndroidBitmap_getInfo的冲突

原文:http://www.cnblogs.com/darkknightzh/p/4318934.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!