zoukankan      html  css  js  c++  java
  • (原)JNI中env->GetByteArrayElements和AndroidBitmap_getInfo的冲突

    也不是很确定,前段时间的代码没有出问题,但是今天调试了半天,一直崩溃: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:仍旧没有弄懂为什么以前的代码可以用,今天就不能用了(当然,以前的代码中还有别的代码,今天的只使用了该部分代码)。

  • 相关阅读:
    September 17th 2016 Week 38th Saturday
    【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
    September 16th 2016 Week 38th Friday
    September 11th 2016 Week 38th Sunday
    September 12th 2016 Week 38th Monday
    September 10th 2016 Week 37th Saturday
    September 9th 2016 Week 37th Friday
    c++暂停
    八皇后问题
    ( 转转)Android初级开发第九讲--Intent最全用法(打开文件跳转页面等)
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/4318934.html
Copyright © 2011-2022 走看看