2013-01-24 70 views
0

我將位圖的顏色數組傳遞給JNI層,並且當我嘗試調用getIntArrayResion方法時,遇到「位圖大小超出VM預算」錯誤。劑量誰有一個想法如何處理這個問題?當調用getXXArrayRegion()時,JNI位圖大小超過VM預算

JNIEXPORT jint JNICALL Java_com_example_happy_MainActivity_Parsing(JNIEnv* env, 
    jintArray bmapColorArray) 
{ 
    int length = env->GetArrayLength(bmapColorArray); 
    int * buffer; 
    buffer = new int[length]; 
    env->GetIntArrayRegion(bmapColorArray,0,length, buffer); 

    return 0; 
} 

順便說一句,我可以直接使用bmapColorArray,而不是將其複製到緩衝區中。我不知道爲什麼我應該複製它,這真的是時間和空間消耗。我這樣做只是遵循Android開發教程。

回答

0

您的應用程序內存不足。你需要少用。如果您使用了大量的位圖,請確保在完成後回收它們 - 垃圾收集器可能需要很長時間才能運行並清理它們。

0

通過位圖JNI之前調整其大小,然後通過 其實你堆大小超越Defind限制導致VM出來 預算和內存不足錯誤 的結果來調整位圖編碼器片段是繼

/** getResizedBitmap method is used to Resized the Image according to custom width and height 
     * @param image 
     * @param newHeight (new desired height) 
     * @param newWidth (new desired Width) 
     * @return image (new resized image) 
     * */ 
    public static Bitmap getResizedBitmap(Bitmap image, int newHeight, int newWidth) { 
     int width = image.getWidth(); 
     int height = image.getHeight(); 
     float scaleWidth = ((float) newWidth)/width; 
     float scaleHeight = ((float) newHeight)/height; 
     // create a matrix for the manipulation 
     Matrix matrix = new Matrix(); 
     // resize the bit map 
     matrix.postScale(scaleWidth, scaleHeight); 
     // recreate the new Bitmap 
     Bitmap resizedBitmap = Bitmap.createBitmap(image, 0, 0, width, height, 
       matrix, false); 
     return resizedBitmap; 
    } 
相關問題