¿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 ++?

One Solution collect form web for “¿Qué es JNI Graphics o cómo usarlo?”

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; } 
  • ¿Es posible usar pixmaps en Android a través de Java API para GLES?
  • Android - OpenGL ES 2.0: Emulador (Works) - Dispositivo (no)
  • OpenGL ES 2 no funciona en Android API23
  • Consejos sobre dibujo de alto rendimiento en Android
  • Cómo dibujar círculo básico en OpenGL ES 2.0 Android
  • Android GLSurfaceView
  • El algoritmo de ruido falla en Samsung Galaxy SIII (GLES)
  • Guardar textura 2D en un png en Android OpenGL ES
  • Cómo utilizar OpenCL en Android?
  • Grabación de una superficie con MediaCodec
  • EglCreateWindowSurface falla con java.lang.IllegalArgumentException
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.