2016-03-02 67 views
1

我應該將每個yuv圖像緩衝區(我從相機接收的)逆時針旋轉90度。我發現這個使用java的地方是post。此代碼工作正常。 但我試圖做一個本地方法,因爲我想要做的方法具有相同的邏輯,但工作更快。Android NDK內存使用情況

JNIEXPORT jbyteArray JNICALL Java_com_ndk_example_utils_NativeUtils_rotateFrameBackward 
     (JNIEnv *env, jobject obj, jbyteArray arr, jint w, jint h){ 

     jint arrSize = w*h*3/2; 
     jbyte *data,*yuv; 

     data = (*env)->GetByteArrayElements(env, arr, JNI_FALSE); 

     yuv = (*env)->GetByteArrayElements(env, arr, JNI_FALSE); 

     int x,y,i = 0; 
     for(x = 0; x < w; x++){ 
     for(y = h-1;y >= 0;y--){ 
      yuv[i] = data[y*w+x]; 
      i++; 
     } 
     } 

     i = arrSize - 1; 
     for(x = w-1;x > 0;x=x-2) 
     { 
     for(y = 0;y < h/2;y++) 
     { 
      yuv[i] = data[(w*h)+(y*w)+x]; 
      i--; 
      yuv[i] = data[(w*h)+(y*w)+(x-1)]; 
      i--; 
     } 
     } 
     (*env)->ReleaseByteArrayElements(env, arr, yuv, JNI_ABORT); 
     yuv = 0; 
     data = 0; 
     return arr; 
    } 

當我啓動了我的HTC 816(V5.1)這個方法,它工作正常,但是當我推出了應用在三星S3(V4.3)和聯想P-70(v4.4.2)該應用程序崩潰。在Android Studio的Android監視器選項卡中,我看到 內存使用情況一直在增加,直到我的應用崩潰。在我的HTC我沒有問題。有任何想法嗎?

回答

2

您使用datayuvarr做雙GetByteArrayElements,然後只發布yuv。您也不檢查是否使用最後一個參數進行了複製,您只需輸入JNI_FALSE即可。你不應該這樣做,你應該使用一個布爾參數得到的值,不要試圖告訴系統是否要複製。

因此,您應該最終釋放這兩個指針。

此外,如果此代碼有效,這意味着副本實際上是由於您正在讀取和寫入相同的內存區域,並會導致圖像損壞。