也不是很確定,前段時間的代碼沒有出問題,但是今天調試了半天,一直崩潰: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:仍舊沒有弄懂為什么以前的代碼可以用,今天就不能用了(當然,以前的代碼中還有別的代碼,今天的只使用了該部分代碼)。