2011-04-09 11 views

Respuesta

16

La biblioteca jnigraphics se puede utilizar para acceder a búferes de mapa de bits en C/C++ de la clase android.bitmap.Graphics (en Java, por supuesto). Se describe con más detalle en la documentación que viene con el NDK en:

android-ndk-r5b/docs/STABLE-APIS.html 

Se puede utilizar para cargar imágenes por ejemplo, OpenGL ES en C/C++, pero tiene que trabajar para entregar un jobject a esa biblioteca para que pueda darle acceso directo a un búfer. Puede pasar ese búfer a OpenGL a través del glTexImage2D().

En primer lugar, se necesita un objeto Java Bitmap, que se puede adquirir y transmitir a su método nativo como esto:

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 

Ese método nativo puede ser algo como esto:

#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 

} 

Keep en mente, debe llamar al AndroidBitmap_unlockPixels() cuando haya terminado con el búfer de píxeles, y este ejemplo no comprueba si hay errores.


actualización para la pregunta de Sid Datta: Puede asegurarse de que el formato de imagen de salida es lo que estás esperando añadiendo esto a opciones anteriores:

options.inPreferredConfig = Bitmap.Config.ARGB_8888; 

Hay un caso en que la imagen de salida todavía terminan con un formato desconocido en JNI. Esto parece suceder solo con GIF. Después de llamar a BitmapFactory.decodeResource(), puede convertir la imagen al formato adecuado si es necesario:

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; 
} 
+0

personal ¿Se garantiza que el píxel es envasado en formato RGBA, en todas las versiones de Android? –

Cuestiones relacionadas