2016-03-02 2 views
1

Я должен вращать каждый буфер изображения yuv, который я получаю от камеры, на 90 градусов против часовой стрелки. Я нашел это post, где используется java. Этот код работает отлично. Но я попытался сделать собственный метод, потому что хотел использовать метод, который имеет ту же логику, но работает быстрее.Использование памяти NDK Android

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) он работает отлично, но когда я запустил приложение на Samsung S3 (v4.3) и Lenovo P-70 (v4.4.2), приложение аварийно завершает работу. И на вкладке Android monitor в Android Studio я увидел, что использование памяти всегда увеличивается, пока мое приложение не вылетает. В моем htc у меня нет проблем с этим. Есть идеи?

ответ

2

Вы делаете двойной GetByteArrayElements для arr с помощью data и yuv, то только освободить yuv. Вы также не проверяете, была ли сделана копия с использованием последнего параметра, вы просто указали в JNI_FALSE. Вы не должны этого делать, вы должны использовать логический параметр для , чтобы получить значение, а не пытаться сообщить системе, следует ли копировать.

Поэтому вы должны отпустить оба указателя в конце.

Также, если этот код работает, это означает, что копии фактически сделаны, так как вы читаете и записываете из одной и той же области памяти, что может привести к повреждению изображения.

Смежные вопросы