Java Android在2.1及更低版本中将位图传递到本机

Java Android在2.1及更低版本中将位图传递到本机,java,android,android-ndk,Java,Android,Android Ndk,在使用Android 2.2时,在NDK中获取位图数据非常容易,但在使用Android 2.1及更低版本时,AndroidBitmap_lockPixels功能不可用。在过去的几个小时里,我一直在寻找,但什么都没找到 如何在不使用该功能的情况下访问位图的像素数据 使用原始图像的尺寸和ARGB_8888格式创建空位图: int width = src.getWidth(); int height = src.getHeight(); Bitmap dest = Bitmap.createBitm

在使用Android 2.2时,在NDK中获取位图数据非常容易,但在使用Android 2.1及更低版本时,AndroidBitmap_lockPixels功能不可用。在过去的几个小时里,我一直在寻找,但什么都没找到


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

使用原始图像的尺寸和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);

在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)

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


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

GuyNoir您是否检查了Android opencv?他们支持1.5及以上版本。我真的不想为这么简单的功能实现opencv。对不起,我忘了提及我使用的是NDK。像素在Java中工作得很好。这看起来越来越近了。我来测试一下。谢谢。NDK失败了,错误是env->GetIntArrayElements和env->releaseTarrayElements不是结构或联合的一部分。我必须导入头文件吗?它们在jni.h中定义,您应该已经导入了。请注意,我的例子是C++,而不是C语言。在c中,调用类似(*env)->GetIntArrayElements(env,arr,NULL)我可以访问颜色整数,但是任何更改它们的尝试似乎都会导致失败。您能否发布或链接到一个简单的代码示例,该示例使用NDK编辑位图的RGBA值?谢谢你的帮助。啊!这绝对是我要找的。我去看看。谢谢