2

我需要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一遍又一遍地更新。我知道http://developer.android.com/reference/android/graphics/Bitmap.htmlBitmap.createBitmap中的方法,但适用的方法似乎产生不可变位图,而产生可变位图的方法不允许我放入像素数据。

4

2 回答 2

2

我深入研究了 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.so和链接libskia.so,两者都可以从模拟器中获得。这使得代码依赖于平台。

于 2013-11-12T12:44:08.673 回答
0

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

于 2013-11-12T09:46:12.813 回答