0

我将位图的颜色数组传递给 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 开发教程做的。

4

2 回答 2

0

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

于 2013-01-24T06:39:10.703 回答
0

在将位图传递给 JNi 之前调整它的大小然后通过实际上你的堆大小超出了导致 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;
    }
于 2013-01-24T06:42:46.100 回答