OutOfMemory с YUV-> RGB C-функцией - PullRequest
1 голос
/ 21 марта 2012

Я хочу преобразовать данные YUV с камеры Android в функции onPreviewFrame в изображение / массив в градациях серого с C-функцией (NDK).Но через несколько секунд я получаю «Исключение OutOfMemory».Тот же код в JAVA работает без проблем с памятью (см. Ниже).Кто-нибудь может мне помочь?

Моя C-функция YUV to GrayRGB:

jint  Java_de_htwdresden_trackdetection_app_ImageConverter_YUVtoGrayRGB(
    JNIEnv* env, jobject javaThis, jbyteArray src, jintArray out, jint width, jint height){
jbyte *c_src = (*env)->GetByteArrayElements(env, src, NULL);
jint *c_out = (*env)->GetIntArrayElements(env, out, NULL);

if(c_out == NULL)
    return -1;

int length = width*height;
int i;

for(i=0; i<length; i++)
{
    c_out[i] = 0xFF000000
            | (c_src[i] & 0x000000FF)
            | ((c_src[i] & 0x000000FF) << 8)
            | ((c_src[i] & 0x000000FF) << 16);
}

(*env)->ReleaseByteArrayElements(env, src, c_src, JNI_ABORT);

return 0;}

И функция, которую я вызываю в onPreviewFrame:

public static native int YUVtoGrayRGB(byte[] src, int[] out, int width, int height);

public static Bitmap YUVtoGrayBitmap(byte[] data, int width, int height){

    int[] framebuffer = new int[width * height];
    //works great without memory problems
    /*for (int i = 0; i < framebuffer.length; i++) {
        framebuffer[i] = 0xFF000000 | (data[i] & 0x000000FF)
                | ((data[i] & 0x000000FF) << 8)
                | ((data[i] & 0x000000FF) << 16);
    }*/

    YUVtoGrayRGB(data, framebuffer, width, height);

    return Bitmap.createBitmap(framebuffer, width, height, Config.ARGB_8888);
}
...