¿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 ++?
- Máscara Libgdx con imagen
- ¿Cómo puedo encontrar el tamaño máximo de textura para diferentes teléfonos?
- AndroidGameView + GC_MINOR
- OpenGL ES - glReadPixels
- Error al asignar variaciones en dispositivos Samsung
- Android Eclipse ¿Cómo puedo guardar renderizado GLsurfaceView como * .png image
- Cómo configurar / calcular texturebuffer en glTexCoordPointer al importar desde archivo OBJ
- ¿Por qué eglCreateImageKHR está devolviendo EGL_NO_IMAGE_KHR (en android)?
- Genymotion no se inicia (permiso denegado para androvm.gles.first)
- Uso de OpenGL para reemplazar Canvas - Android
- Android Opengl-es carga un poder de 2 no-textura
- Cómo obtener una pantalla EGL / contexto a un GLSurfaceView específico
- Parallax XY y cálculo de la rotación
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; }
- Consulta SQLite de Android donde columna no es nula y no vacía
- Java.lang.AbstractMethodError cuando espía la LinkedList en Android