我需要在本机代码中进行一些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}}方法,但适用的方法似乎产生不可变的位图,而产生可变位图的方法不允许我放入像素数据。
答案 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.so
和libskia.so
相关联,这两个代码都可以从模拟器中获取。这使得代码平台依赖。
答案 1 :(得分:0)
NDK提供了与android Bitmap原生工作的特殊API,请参阅http://mobilepearls.com/labs/native-android-api/#bitmap。位图是“不可变的”,但您可以锁定其像素并操纵您收到的 void * 缓冲区的内容。准备好后,不要忘记解锁()位图。