Android将位图传递到2.1及更低版本的Native

时间:2011-01-12 03:37:33

标签: java android android-ndk

使用Android 2.2时,在NDK中获取Bitmap数据非常容易,但2.1及更低版本的AndroidBitmap_lockPixels功能不可用。我一直在寻找过去的几个小时,但没有任何效果。

如何在不使用该功能的情况下访问位图的像素数据?

3 个答案:

答案 0 :(得分:1)

使用原始图像尺寸和ARGB_8888格式创建空位图:

int width =  src.getWidth();
int height = src.getHeight();
Bitmap dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

将像素从源位图复制到int数组:

int[] pixels = new int[width * height];
src.getPixels(pixels, 0, width, 0, 0, width, height);

并将这些像素设置为目标位图:

dest.setPixels(pixels, 0, width, 0, 0, width, height);

答案 1 :(得分:1)

在Java代码中创建一个IntBuffer,并将该数组传递给您的本机库:

// this is called from native code
buffer = IntBuffer.allocate(width*height);
return buffer.array();

使用GetIntArrayElements获取jint *并写入数组:

jint * arr = env->GetIntArrayElements((jintArray)bufferArray, NULL);

写入数组,完成后,发布:

env->ReleaseIntArrayElements((jintArray)bufferArray, arr, 0);

通知Java代码数组已更新,并使用Canvas.drawBitmap()绘制IntBuffer:

canvas.drawBitmap(buffer.array(), ....);

要绘制到位图,请使用位图

初始化画布
... new Canvas(bitmap)

答案 2 :(得分:1)

其他人刚问了同样的问题 - 我只是链接到它以避免重复我的回答:

Android rendering to live wallpapers

无论如何,您可能不希望每次需要在Java和JNI代码之间交换时复制位图数据,因此如果您的代码对性能敏感,这可能是您在Android 2.1及更低版本上的唯一选择