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

  • 相关阅读:
    hiveserver2 with kerberos authentication
    python Basic usage
    python Quicksort demo
    Python HeapSort
    mrunit for wordcount demo
    CCDH证书
    Hadoop question list
    Hadoop Yarn core concepts
    Hadoop Resource
    Hadoop could not find or load main class
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/4318934.html
Copyright © 2011-2022 走看看