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

  • 相关阅读:
    SQL Server 数据库定时自动备份
    SQL SERVER 2012设置自动备份数据库
    SyncNavigator 数据库同步软件怎么用?
    SyncNavigator下载|SyncNavigator数据库同步软件 v8.4.1
    关于数据同步的几种实现
    课堂练习-找水王:
    软件工程第十四周总结
    Alpha版(内部测试版)发布
    软件工程第十三周总结
    意见评论汇总
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/4318934.html
Copyright © 2011-2022 走看看