Estuvimos indagando algo acerca de cómo reconocer patrones a través de Java, pero como ya comenté hay librerías muy potentes que nos van a permitir simplificar este procesamiento (por ejemplo OpenCV).
Como ahora mismo mis conocimientos de OpenCV son bastante limitados, voy a comenzar por esbozar un poco lo que sería el pintado basado en geoposicionamiento y orientación de nuestro dispositivo móvil.
Si lo pensamos, uno de los problemas que tiene el que tratemos de reconocer contornos mediante puntos de control, o que tratemos de procesar imágenes, es el tiempo. Es decir, nuestra aplicación tiene que contestar de manera muy rápida a eventos de sensores y por otra parte tiene que ser capaz de procesar la imagen para buscar analogías de manera muy rápida ( y cuando digo muy rápido, hablo de milisegundos).
En Android para aplicaciones de carácter general, el uso del SDK es más que suficiente, pero cuando estamos hablando de procesamiento en tiempo real, el SDK deja de tener sentido y se emplea el NDK.
El NDK resuelve la necesidad de invocar a métodos nativos programados en lenguajes de bajo nivel (en C básicamente, aunque soporta algo de C++) y es muy empleado por debajo en muchos motores de juegos para aprovechar las características OpenGL del móvil, aparte de por la velocidad en sí (si bien es cierto que hay maneras de usar OpenGL desde Java en Android).
La manera de trabajar es la siguiente (si os descargáis el NDK al descomprimirlo, en la carpeta samples, encontraréis muchos ejemplos que son muy sencillos de importar desde Eclipse):
- Todo el funcionamiento se basa en el uso de JNI (Java Native Interface) que establece maneras de invocar desde Java a código nativo.
- Se declara un método nativo en una clase Java (este método lo podemos invocar como cualquier otro método de la clase, pero tiene la peculiaridad de que su implementación estará en un fichero .c como veremos a continuación):
- Ese método que hemos declarado en la clase Java, debe ser implementado por un fichero .c que acabará empaquetado en una librería (compilada por el NDK en formato .so) que se instalará con nuestra aplicación:
- Aparte de lo anterior, tenemos que indicarle al NDK los módulos de los que consta nuestra aplicación para poder elaborar la librería, esto se hace a través de los ficheros Application.mk (donde se establece para arquitecturas de procesador hay que compilar nuestra librería) y en el Android.mk (donde propiamente se establecen los módulos con sus ficheros y las dependencias de librerías nativas que se tiene que tener en cuenta a nivel de linkado):
Aunque en las siguientes entradas entraremos más en profundidad con todo lo descrito ahora mismo e iremos paso a paso desarrollando la primera parte objetivo (que es pintar cosas en base al geoposicionamiento, y sensores como la brújula o el acelerómetro), el siguiente diagrama de flujo espero que aclare un poco como funciona el proceso del NDK:
De esta manera cuando arrancamos la aplicación (APK) directamente se cargaría nuestra librería nativa generada desde la que se ejecutarán los métodos a través de JNI.




No hay comentarios:
Publicar un comentario