从NDK中的像素数组创建Android的可变位图

时间:2013-11-09 13:17:46

标签: android bitmap android-ndk

我需要在本机代码中进行一些Bitmap操作。具体来说,我的JNI设置是这样的:

// pixels color array in ARGB_8888 format, returned by dependent library
char* pixels;
jobject bitmap = null /* what to put here */;
return bitmap;

我想填写指定的行,以返回Bitmap 中可用的Activity,以便稍后修改pixels时NDK,此处返回的Bitmap对象会自动更新,无需重新创建或复制数据。目的是pixels一次又一次地更新。我知道Bitmap.createBitmap中的{{1}}方法,但适用的方法似乎产生不可变的位图,而产生可变位图的方法不允许我放入像素数据。

2 个答案:

答案 0 :(得分:1)

我深入研究了Android源代码(从Bitmap.java及其JNI对应开始)并设法找到C ++类GraphicsJNI。适用的方法是

static SkBitmap* getNativeBitmap(JNIEnv*, jobject bitmap);

显然,每个Bitmap都存储对本机C ++类SkBitmap的引用,并简单地将其方法转发给相应的本地类。 SkBitmap属于外部库Skia。从它的界面,我可以使用setPixels方法达到我的目的。所以解决方案是:

#include <GraphicsJNI.h>
#include <SkBitmap.h>

char* pixels; // assume already exists
jobject bitmap; // construct an immutable bitmap in Java
SkBitmap* native_bitmap = GraphicsJNI::getNativeBitmap(env, bitmap);
native_bitmap->setPixels(pixels);

注意:此代码需要与libandroid_runtime.solibskia.so相关联,这两个代码都可以从模拟器中获取。这使得代码平台依赖。

答案 1 :(得分:0)

NDK提供了与android Bitmap原生工作的特殊API,请参阅http://mobilepearls.com/labs/native-android-api/#bitmap。位图是“不可变的”,但您可以锁定其像素并操纵您收到的 void * 缓冲区的内容。准备好后,不要忘记解锁()位图。