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