En Android NDK hay una biblioteca llamada JNI Graphics. ¿Que es eso? ¿Puedo usar eso para cargar imágenes para OpenGL ES con C/C++?¿Qué es JNI Graphics o cómo usarlo?
Respuesta
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;
}
- 1. ¿Qué es EGL y cómo puedo usarlo?
- 2. ¿Qué es LD_LIBRARY_PATH y cómo usarlo?
- 3. ¿Qué es 'Referencia global JNI'
- 4. ¿Qué es .inc y por qué usarlo?
- 5. ¿Qué es la delegación? ¿Cuándo querría usarlo?
- 6. ¿Qué es Request.InputStream y cuándo usarlo?
- 7. ¿Qué es ICustomTypeDescriptor y cuándo usarlo?
- 8. ¿Qué es __declspec y cuándo debo usarlo?
- 9. ¿Qué es MVVM, y deberíamos usarlo?
- 10. Magento XMLConnect ... ¿Qué es y cómo puedo usarlo?
- 11. ¿Qué es este patrón de diseño? ¿Cómo usarlo?
- 12. ¿Qué es JAXB y por qué debería usarlo?
- 13. ¿Qué es PDO y por qué debería usarlo?
- 14. ¿Qué es un archivo .pem y cómo usarlo?
- 15. ¿Qué es strophe y cómo usarlo con JQuery?
- 16. LLVM ¿Qué es y cómo puedo usarlo para compilaciones multiplataforma
- 17. ¿Qué es un MQ y por qué quiero usarlo?
- 18. ¿Qué es NHibernate y por qué debería usarlo?
- 19. Java Graphics library
- 20. Silverlight C# Game o Graphics Engine?
- 21. ¿Para qué es <spring:bind>? ¿Cuándo usarlo y cuándo no usarlo?
- 22. ¿Qué es un DSL y dónde debería usarlo?
- 23. ¿Qué es un simulacro y cuándo deberías usarlo?
- 24. ¿Qué significa "solo exposición"? ¿Por qué usarlo?
- 25. ¿Qué es un MvcHtmlString y cuándo debería usarlo?
- 26. ¿Qué tan maduro es clojure-clr? ¿Puedo usarlo con Mono?
- 27. ¿Qué es el bean scope y cuándo usarlo?
- 28. ¿Qué es un ÍNDICE ESPACIAL y cuándo debería usarlo?
- 29. JPA @Version: cómo usarlo?
- 30. HTML5 Canvas Vector Graphics?
personal ¿Se garantiza que el píxel es envasado en formato RGBA, en todas las versiones de Android? –