Android ndk не хватает памяти - PullRequest
0 голосов
/ 03 декабря 2011

Я пытаюсь сделать обработку изображений в реальном времени в Android с помощью JNI. У меня есть собственный метод для декодирования данных изображения, и я вызываю этот метод для каждого кадра. Через несколько секунд мне не хватает памяти, и мое приложение завершает работу.

ВЫХОД ИЗ ЖУРНАЛА:

12-03 20:54:19.780: E/dalvikvm-heap(8119): Out of memory on a 3686416-byte allocation.

МОЙ РОДНОЙ МЕТОД:

JNIEXPORT jintArray JNICALL  Java_net_oyunyazar_arcc_data_FrameManager_processImage(JNIEnv* env, jobject javaThis, jint width, jint height, jbyteArray arr) {

    jint *convertedData;
    convertedData = (jint*)malloc((width*height) * sizeof(jint));

    jintArray result = (*env)->NewIntArray(env, width*height);


    jint y,x;
    jbyte grey;

    jsize len = (*env)->GetArrayLength(env, arr);
    jbyte *YUVData = (*env)->GetByteArrayElements(env, arr, 0);

        for (y = 0; y < height; y++){
            for (x = 0; x < width; x++){

                grey = YUVData[y * width + x];
                convertedData[y*width+x] =(jint) grey & 0xff;

            }
        }

    LOGD("Random [%d]",len);

    (*env)->SetIntArrayRegion(env, result, 0, (width*height),convertedData );

    free(convertedData);
    (*env)->ReleaseByteArrayElements(env, YUVData, (jbyte*)arr, 0);

    return result;
}

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2011

Я решил эту проблему, выпустив параметры.

(*env)->ReleaseByteArrayElements(env, arr, YUVData, 0);

Теперь отлично работает.

0 голосов
/ 04 декабря 2011

У меня такая же проблема, как и у вас.

В вашем конкретном случае, когда вы используете пиксель (и, возможно, растровое изображение), вы можете отправить растровое изображение вместо своего байтового массива и изменить его

void *pixel_bm;
int retValue;

AndroidBitmapInfo info;
if ((retValue = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) return 0;
if ((retValue = AndroidBitmap_lockPixels(env, bitmap, &pixel_bm)) < 0) return 0;

// you can now read an write into pixel_bm

AndroidBitmap_unlockPixels(env, bitmap);

Если вы найдете решение для правильного освобождения результата GetByteArrayElement, я заинтересован этим решением !!!

...