2011-12-03 15 views
0

私はjniを使ってアンドロイドでリアルタイム画像処理をしようとしています。私は画像データをデコードするネイティブメソッドを持っており、私はこのメソッドをフレームごとに呼び出します。数秒後に私はメモリがなくなり、私のアプリケーションは終了します。Android ndkメモリ不足問題​​

ログ出力:

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

MY NATIVE METHOD:任意の助け

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; 
} 

感謝。

答えて

0

私はパラメータを解放することでこの問題を解決しました。

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

これはすぐれています。

0

私はあなたと同じ問題があります。あなたの特定のケースで

、あなたはピクセル(そしておそらくビットマップ)を使用している間、あなたの代わりにあなたのByteArrayのビットマップを送信することができますし、あなたが正しくGetByteArrayElement結果を解放するための解決策を見つけた場合

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); 

それを修正し、私は解決策で逮捕された!