J2ME: Desarrollo de aplicaciones para teléfonos celulares

Publicado en

En este artículo hablaremos de conceptos básicos de J2ME, la versión de Java para dispositivos móviles, y aprenderemos a hacer un “hola mundo”.

Los dispositivos móviles están en todas partes, en particular los teléfonos celulares; tan simple como mirar a las personas en la calle, 4 de cada 10 tiene un teléfono celular. Gartner estima que en el 2005 se venderán 750 millones de unidades en todo el mundo, lo que significa un 13% de aumento respecto al 2004. Más que una evolución, es una explosión de dispositivos móviles.

Existen varios lenguajes (tecnologías) para programar teléfonos celulares, como BREW, Symbian C++, J2ME, etc. Para fines de este artículo vamos a experimentar con J2ME. La Tabla 1 muestra un pequeño listado de diferentes aparatos y sus capacidades.

Ediciones de Java

La plataforma Java está compuesta por tres ediciones distintas:
• Java 2 Edición Empresarial (J2EE), para servidores empresariales y estaciones de trabajo que integran sus operaciones entre clientes, proveedores y empleados.
• Java 2 Edición Estándar (J2SE), para su uso en computadoras personales y servidores.
• Java 2 Edición Micro (J2ME), para dispositivos móviles.

Tabla 1. Ejemplos de capacidad en distintos teléfonos.

Conceptos básicos en J2ME

¿Cómo puede correr Java en un refrigerador, en un celular, en un PDA? Para responder a esta pregunta se requiere explicar cuatro elementos importantes: (Ver Fig. 1)


Figura 2. Configuraciones en J2ME.

  • Sistema Operativo. Sistema que controla las funciones básicas del dispositivo, por lo general cerrado y propiedad del fabricante.
  • Maquina virtual (JVM). Java es un lenguaje interpretado que requiere de una máquina virtual, sin embargo, la JVM de un PDA no es la misma que un servidor corporativo, intervienen factores como el recolector de basura, el tamaño de la pila, entre otros.
  • Configuraciones. La configuración define el núcleo de J2ME (runtime environment) en la JVM. Se incluye un subconjunto de clases de la edición estándar de Java (J2SE), mas las clases específicas de J2ME por familias (dispositivos con características similares). (Ver Fig. 2).
  • Perfiles (profiles) - Son librerías de alto nivel que se agregan a la configuración o también por tipos de aplicación; los perfiles son específicos al tipo de dispositivo. Un perfil puede ser agregado a otro perfil. De ahí que los fabricantes como Nokia provean APIs de programación para sus modelos más recientes.

Figura 2. Configuraciones.

Al mencionar las siglas CLDC/MIDP nos referimos a la configuración (CLDC) y el perfil (MIDP) para programar aplicaciones Midlets en teléfonos celulares.

Existe una natural resistencia a programar Midlets. Por ejemplo, alguien puede decir “yo soy un programador Java de aplicaciones corporativas”, ¿cómo afecta al ciclo de desarrollo Java el uso de configuraciones y perfiles?

Las configuraciones aceptan archivos Java (.class) y JAR, la diferencia está en el compilador y la forma de compilar. El principal cambio es no usar la versión más reciente de Java; SUN recomienda JSDK 1.3 (sí, leyó usted bien); en sí, con Java 2 es suficiente. Recuerde que si maneja adecuadamente sus variables de ambiente, como JAVA_HOME, es posible tener varias versiones de JDK instaladas en una computadora.

Hola Mundo Midlet

Ahora vamos a hacer el ejemplo clásico, un hola mundo (HolaMidlet). El código lo vamos a comentar y razonar línea por línea.

Favor de verificar que tenga la versión 2 de Java instalado en su computadora (se probó con buenos resultados JSDK 1.4.2 para Windows). Luego se debe instalar la herramienta Wireless Toolkit 2.2 (WTK) de Sun. Una vez instalados, pruebe el buen funcionamiento al correr un proyecto demo (ej. Demo3D) con el programa Ktoolbar localizado en Inicio/Programas/J2ME Wireless Toolkit.

*Nota: Al momento de escribir este artículo ya estaba disponible la versión 2.3 beta, para los aventureros.


Figura 3. Ktoolbar.

En la figura 3 se observa que es un entorno bastante simple pero carece de un editor de texto. Para el ejemplo es suficiente NotePad. Este entorno está basado en proyectos, por lo que se requiere crear uno. A continuación, nos pedirá nombre del proyecto y clase principal para ejecutar nuestra aplicación. Los pasos en orden son:

  1. Crear un nuevo proyecto (New Project) o abrir uno existente (Open Project).
  2. Configurar la aplicción Midlet (Preferences).
  3. Compilar (Build).
  4. Ejecutar (Build).
  5. Empacar en archivos JAR y JAD (Project/Package/Create Package).

*Nota: La mayoría de los equipos con MIDP 1.0 sólo soportan archivos JAR máximo 64K. Sin embargo, los equipos más recientes vienen con MIDP 2.0 y mayor capacidad de almacenamiento, algunos incluso utilizan tarjetas de ampliación de memoria.

La configuración es importante para distribuir la aplicación (Preferences en el paso 2), y son parte de la especificación del archivo JAD:

 
Tabla 2. Archivo JAD.

Las configuraciones opcionales son:

Tabla 3. Configuración en WTK.

Con la opción User Defined el usuario puede ingresar sus configuraciones personales o que dependan del equipo.

Al crear un proyecto, el WTK, también crea una estructura de directorios. En este caso en el directorio c:\WTK2.2\HelloMidlet con los siguientes subdirectorios:

Programar Midlets recuerda mucho a programar Applets, los cuales cayeron en desuso (mejor dicho, se perdió el gusto de programarlos).

Un MIDlet hereda o extiende la clase javax.microedition.midlet.MIDlet. Los métodos requeridos son:

  • startApp - Inicia la aplicación.
  • pauseApp – Pausa la aplicación.
  • destroyApp – Destruye la aplicación, para que pueda ser eliminada de memoria.

Como pueden ver, un Midlet incluso tiene un comportamiento más simple que el de un Applet (arranca, para y se detiene).

El siguiente código muestra el esqueleto mínimo de un MIDlet:

 

El código anterior es un código zombie, camina pero no reacciona. Para corregir esto falta el manejo de eventos, lo cual requiere implementar la interface CommandListener y esto nos lleva a definir el método CommandAction().

Para hacer esto, agregamos el import correspondiente:

import javax.microedition.lcdui. CommandListener;

y modificamos la definición de la clase:

public class HolaMidlet extends MIDlet implements CommandListener {

¿Qué nos falta? Implementar el método CommandAction.

public void commandAction(Command c, Displayable s)
{
  if (c == cmdExit) {
    destroyApp(false);
    notifyDestroyed();
  }
}

Para que esto funcione, es necesario importar las clases correspondientes a Command y Displayable.

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Displayable;

Así como definir la variable cmdExit, la cual representa al comando para el botón de salida (exit).

private Command cmdExit;

Ahora declaramos un objeto display, que utilizaremos como referencia a la pantalla. Primero importamos la clase correspondiente:

import javax.microedition.lcdui.Display;

y luego definimos la variable a nivel de clase:

private Display display;

En nuestro constructor vamos a inicializar el valor de los objetos display y cmdExit.

display = Display.getDisplay(this);
cmdExit = new Command(“Salir”, Command.EXIT, 1);

La instancia de clase cmdExit muestra en pantalla la palabra “Salir” con la función de más alta prioridad (1) y que sea del tipo EXIT.

Falta agregar el texto “Hola mundo móvil”, lo cual haremos utilizando un objeto TextBox, que permite al usuario ingresar y editar texto.

Primero importamos la clase correspondiente

import javax.microedition.lcdui.TextBox;

y definimos el objeto

private TextBox tbxMain;

Posteriormente creamos la instancia de la clase TextBox, lo cual se hace indicando el título, texto de mensaje, y tamaño

tbxMain = new TextBox(“HelloMidlet”, “Hola Mundo Móvil”, 50, 0);

Por último agregamos el comando de salida, y preparamos al programa que esté al pendiente de este evento.

tbxMain.addCommand(cmdExit);
tbxMain.setCommandListener(this);

Después de compilar la aplicación y generar el archivo JAR correspondiente, la forma más simple para instalarla en el dispositivo es usar un cable de datos, o transmisión inalámbrica (IR o bluetooth). Como recomendación final verifique las versiones de CLDC y MIDP de su teléfono para que pueda correr en su teléfono.

El listado final del código queda de la siguiente manera:

 

Conclusión

¿Por qué usar J2ME? Algunas ventajas reportadas:

  • Es un estándar actual de la industria respaldado por Sun Microsystems.
  • Puede correr en el escritorio y en dispositivos móviles.
  • Continuas versiones de actualización a través de un comité JCP (Java Community Process).
  • APIs de desarrollo de terceros para nuevas características en los equipos de nueva generación.

Sin embargo, J2ME también puede tener algunas desventajas, entre las cuales están:

  • Es un lenguaje interpretado, una aplicación Midlet mal planeada puede ser lenta.
  • La memoria libre de cada teléfono y el tamaño máximo del archivo JAR/JAD.
  • Aritmética de punto flotante no implementada en versiones anteriores.

Los Midlets han dejado de ser aplicaciones sólo para juegos, pasando por aplicaciones personales y ahora llegan al ambiente corporativo con acceso a bases de datos. J2ME es una tecnología madura. Lleva seis años de vida y se dice que lo mejor está por venir. ¿Usted qué opina?

Referencias

  1. “J2ME Building Blocks for Mobile Devices”. KVM and the CLDC. SUN. USA. 2000
  2. “J2ME technology turns 5!”. http://developers.sun.com
  3. Sun Java Wireless Toolkit http://java.sun.com/products/sjwtoolkit/
  4. “Gartner Says Mobile Phone Sales Rose 17 percent ...”. http://www.gartner.com/press_releases/asset_127760_11.html
  5. J2ME Polish: Device Database. http://www.j2mepolish.org/devices-overview.html
Bio

Víctor Manuel Quijano Abán es candidato al grado en la maestría en sistemas computacionales, egresado del Instituto Tecnológico de Mérida. Actualmente trabaja en un corporativo de medios de comunicación y ha trabajado en centros de investigación, gobierno federal y conservación en medio ambiente. Empezó a programar antes de que aparecieran las primeras PCs y es aficionado a los lenguajes scripts y código multiplataforma.