调用getXXArrayRegion()时,JNI位图大小超过VM预算

时间:2013-01-24 06:13:51

标签: android jvm java-native-interface

我将位图的颜色数组传递给JNI层,当我尝试调用getIntArrayResion方法时,遇到“位图大小超过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开发教程。

2 个答案:

答案 0 :(得分:0)

您的应用内存不足。你需要少用。如果你使用了很多位图,请确保在完成后回收它们 - 垃圾收集器可能需要很长时间才能运行并清理它们。

答案 1 :(得分:0)

在传递Bitmap之前,JNi调整大小然后传递 实际上,您的堆大小超出了导致VM超出预算的Defind Limit 并导致内存不足错误 调整位图大小编码器片段正在关注

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