¿Qué es JNI Graphics o cómo usarlo?

En el Android NDK hay una biblioteca llamada JNI Graphics. ¿Que es eso? ¿Puedo usarlo para cargar imágenes para OpenGL ES con C / C ++?

La biblioteca jnigraphics se puede utilizar para acceder a los 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 bajo:

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

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

Primero, necesitas un objeto Java Bitmap , que puedes adquirir y pasar a tu método nativo como este:

 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 parecer algo así:

 #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 } 

Tenga en cuenta que debe llamar a AndroidBitmap_unlockPixels() cuando haya terminado con el búfer de píxeles y que este ejemplo no compruebe si hay errores en absoluto.


Actualización para la pregunta de Sid Datta: Usted puede asegurarse de que el formato de salida de la imagen es lo que usted está esperando añadiendo esto a las opciones anteriores:

 options.inPreferredConfig = Bitmap.Config.ARGB_8888; 

Hay un caso en el que la imagen de salida todavía terminará con un formato desconocido en JNI. Esto parece ocurrir sólo con los 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; } 
  • Cómo dibujar una imagen de fondo grande con libgdx - las mejores prácticas?
  • ¿Mejor velocidad de cuadro que dibuja los mapas de bits en una lona?
  • Las imágenes transparentes de OpenGL tienen negro en ellas
  • ¿Es posible deformar la imagen subyacente con OpenGL ES 2.0?
  • Android: Lienzo vs OpenGL
  • ¿Cuál es el parámetro "offset" en GLES20.glVertexAttribPointer / glDrawElements, y de dónde proviene ptr / indices?
  • Dibujar texto en OpenGL ES
  • Compartir el contexto GLES20 y texturas entre GLSurfaceViews diferentes?
  • Rápido vértices dinámicos en OpenGL ES 2.0 en Android
  • Android OpenGL ES Soporte en todas partes?
  • Captura de pantalla de Android OpenGL
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.