• (原)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:仍旧没有弄懂为什么以前的代码可以用,今天就不能用了(当然,以前的代码中还有别的代码,今天的只使用了该部分代码)。

  • 相关阅读:
    第07组 Beta冲刺(2/5)
    第07组 Beta冲刺(1/5)
    第07组 Alpha事后诸葛亮
    第07组 Alpha冲刺(5/6)
    第07组 Alpha冲刺(6/6)
    软工实践个人总结
    第01组 Beta版本演示
    第01组 Beta冲刺(5/5)
    第01组 Beta冲刺(4/5)
    第01组 Beta冲刺(3/5)
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/4318934.html
Copyright © 2020-2023  润新知