(原)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:仍舊沒有弄懂為什么以前的代碼可以用,今天就不能用了(當然,以前的代碼中還有別的代碼,今天的只使用了該部分代碼)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM