Библиотека jnigraphics
может использоваться для доступа к буферам растровых изображений в C / C ++ из класса android.bitmap.Graphics
(в Java, конечно).
Это кратко упомянуто в документации NDK , а также в заголовочных документах bitmap.h
.
Может использоваться для загрузки изображений, например, OpenGL ES в C / C ++, но вам нужно проделать определенную работу, чтобы передать jobject
этой библиотеке, чтобы она могла предоставить вам прямой доступ к буферу. Вы можете передать этот буфер в OpenGL через glTexImage2D()
.
Во-первых, вам нужен объект Java Bitmap
, который вы можете получить и передать своему собственному методу следующим образом:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
...
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
R.drawable.myimage, options);
MyJniMethod(bitmap); // Should be static in this example
Этот нативный метод может выглядеть примерно так:
#include <android/bitmap.h>
void MyJniMethod(JNIEnv *env, jobject obj, jobject bitmap) {
AndroidBitmapInfo info;
uint32_t *pixels;
int ret;
AndroidBitmap_getInfo(env, bitmap, &info);
if(info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
LOGE("Bitmap format is not RGBA_8888!");
return false;
}
AndroidBitmap_lockPixels(env, bitmap, reinterpret_cast<void **>(&pixels));
// Now you can use the pixel array 'pixels', which is in RGBA format
}
Имейте в виду, что вы должны вызывать AndroidBitmap_unlockPixels()
, когда закончите с буфером пикселей, и что этот пример вообще не проверяет ошибки.
Обновление для вопроса Sid Datta: Вы можете убедиться, что формат выходного изображения соответствует ожидаемому, добавив это в опции выше:
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
В одном случае выходное изображение будет по-прежнему с неизвестным форматом в JNI. Кажется, это происходит только с GIF-файлами. После вызова BitmapFactory.decodeResource()
вы можете при необходимости преобразовать изображение в нужный формат:
if (bitmap.getConfig() != Bitmap.Config.ARGB_8888) {
Bitmap reformatted_bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, false);
bitmap.recycle(); /* reduce memory load in app w/o waiting for GC */
bitmap = reformatted_bitmap;
}