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

  • 相关阅读:
    nginx
    git命令
    mysql的优化
    nginx下的负载均衡
    IO模式和IO多路复用
    回顾java基础—Java数据类型
    解决jdk1.8上编译dubbo失败
    KB,Kb单位换算,网络带宽中的Kbps和KB/s到底是什么意思? (注:B和b的区别)
    生成器函数_yield_yield from_send
    推导式_集合
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/4318934.html
Copyright © 2011-2022 走看看