Java 2 Micro Edition (J2ME) es un entorno de desarrollo robusto y flexible enfocado a la aplicación de la tecnología Java en dispositivos electrónicos con capacidades computacionales y gráficas muy reducidas, tales como teléfonos móviles, PDAs (Personal Digital Assistants o asistentes personales digitales), electrodomésticos inteligentes, TV, impresoras, etc. Esta edición tiene unos componentes básicos que la diferencian de las otras versiones( Java 2 Platform, Enterprise Edition J2EE y Java 2 Platform, Standard Edition J2SE), como el uso de una máquina virtual denominada KVM (Kilo Virtual Machine, debido a que requiere sólo unos pocos Kilobytes de memoria para funcionar) en vez del uso de la JVM (Java Virtual Machine) clásica, inclusión de un pequeño y rápido recolector de basura.

Las tecnologías Java 2 Micro Edition (J2ME) contienen un JRE altamente optimizado, especialmente desarrollado para el mercado de gran consumo, abarcan una amplia gama de aparatos de tamaño muy reducido y permiten ejecutar programas de seguridad, conectividad y utilidades en tarjetas inteligentes, buscapersonas, sintonizadores de TV y otros pequeños electrodomésticos. Las tecnologías Java 2 Micro Edition (J2ME) representan únicamente una parte de la gama de productos de software de Java. Las plataformas Java relacionadas son la Plataforma Java 2, Edición estándar (plataforma J2SE) y la Plataforma Java 2, Edición empresa (plataforma J2EE). La tecnología Java ofrece, asimismo, métodos de creación de servicios Web, transferencia de información XML, numerosos protocolos de red, kits de herramientas y la aplicación Java Web Start.

Aunque sería ideal contar con la API completa de J2SE disponible en un dispositivo móvil, no es algo realista. Por ejemplo, un teléfono móvil con su pantalla limitada no puede soportar toda la funcionalidad disponible en la AWT, que es la principal interfaz gráfica de usuario (GUI) que da Java. Java 2 Micro Edition (J2ME) se introdujo precisamente dirigido hacia todos esos dispositivos que caen fuera del ámbito de J2SE y J2EE. Las capacidades de este tipo de dispositivos pueden variar mucho de unos a otros.

Una única plataforma de Java claramente no encajaría adecuadamente con todos estos dispositivos. Es por ello que Java 2 Micro Edition (J2ME) introduce dos nuevos conceptos, las configuraciones y los perfiles.

Configuraciones

Una configuración define una plataforma Java para un amplio rango de dispositivos. Está directamente relacionada con una JVM. De hecho, una configuración específica define las características del lenguaje Java y las librerías de la JVM que serán utilizadas.

La decisión acerca de qué configuración aplicar sobre un dispositivo se basa principalmente en la disponibilidad y capacidades de memoria, pantalla, conexión de red y procesador de dicho dispositivo.

Las características típicas de aquellos dispositivos que se ajustan a cada una de las actuales configuraciones son:

  • CDC: Connected Device Configuration, con las siguientes características mínimas:
    • Un mínimo de 512 kilobytes de memoria para ejecutar Java.
    • Un mínimo de 256 kilobytes de memoria para ejecución de programas.
    • Conexión de red, posiblemente persistente y con gran ancho de banda.
  • CLDC: Connected Limited Device Configuration, con los siguientes requisitos mínimos:
    • 128 kilobytes de memoria para ejecutar Java.
    • 32 kilobytes de memoria para ejecución de programas.
    • Una GUI restringida.
    • Típicamente con suministro eléctrico a través de baterías.
    • Conexión de red, típicamente inalámbrica, con bajo ancho de banda y acceso intermitente.

Perfiles

Los perfiles son bibliotecas Java de clases específicas orientadas a implementar funcionalidades de más alto nivel para familias específicas de dispositivos.

Un perfil es, si se quiere ver así, como una extensión de una configuración. Proporciona a un programador las librerías necesarias para desarrollar una aplicación para un tipo de dispositivo en particular. Por ejemplo, MIDP define APIs para componentes de interfaz de usuario, manejo de entrada de datos y eventos, almacenamiento persistente, comunicaciones y temporizadores, todo ello teniendo en cuenta las limitaciones de pantalla y memoria de los dispositivos móviles.

El perfil es el que define las APIs que controlan el ciclo de vida de la aplicación, interfaz de usuario, etc. Más concretamente, un perfil es un conjunto de APIs orientado a un ámbito de aplicación determinado. Los perfiles identifican un grupo de dispositivos por la funcionalidad que proporcionan (electrodomésticos, teléfonos móviles, etc.) y el tipo de aplicaciones que se ejecutarán en ellos. Las librerías de la interfaz gráfica son un componente muy importante en la definición de un perfil. Aquí nos podemos encontrar grandes diferencias entre interfaces, desde el menú textual de los teléfonos móviles hasta los táctiles de los PDAs.

El perfil establece unas APIs que definen las características de un dispositivo, mientras que la configuración hace lo propio con una familia de ellos. Esto hace que a la hora de construir una aplicación se cuente tanto con las APIs del perfil como de la configuración. Tenemos que tener en cuenta que un perfil siempre se construye sobre una configuración determinada. De este modo, podemos pensar en un perfil como un conjunto de APIs que dotan a una configuración de funcionalidad específica. Ya hemos visto los conceptos necesarios para entender cómo es un entorno de ejecución en Java 2 Micro Edition.

Anteriormente vimos que para una configuración determinada se usaba una Máquina Virtual Java específica. Teníamos que con la configuración CDC usábamos la CVM y que con la configuración CLDC usábamos la KVM. Con los perfiles ocurre lo mismo. Existen unos perfiles que construiremos sobre la configuración CDC y otros que construiremos sobre la CLDC.

Perfiles para la configuración CDC

  • Foundation Profile: este perfil define una serie de APIs sobre la CDC orientadas a dispositivos que carecen de interfaz gráfica como, por ejemplo, decodificadores de televisión digital. Este perfil incluye gran parte de los paquetes de la J2SE, pero excluye totalmente los paquetes “java.awt” Abstract Windows Toolkit (AWT) y “java.swing” que conforman la interfaz gráfica de usuario (GUI) de J2SE.
  • Personal Profile: es un subconjunto de la plataforma J2SE v1.3, y proporciona un entorno con un completo soporte gráfico AWT. El objetivo es el de dotar a la configuración CDC de una interfaz gráfica completa, con capacidades web y soporte de applets Java. Este perfil requiere una implementación del Foundation Profile.
  • RMI Profile: este perfil requiere una implementación del Foundation Profile, se construye encima de él. El perfil RMI soporta un subconjunto de las APIs J2SE v1.3 RMI. Algunas características de estas APIs se han eliminado del perfil RMI debido a las limitaciones de cómputo y memoria de los dispositivos.

Perfiles para la configuración CLDC

  • PDA Profile: está construido sobre CLDC. Pretende abarcar PDAs de gama baja, tipo Palm, con una pantalla y algún tipo de puntero (ratón o
    lápiz) y una resolución de al menos 20000 pixels (al menos 200×100 pixels) con un factor 2:1.
  • Mobile Information Device Profile (MIDP): este perfil está construido sobre la configuración CLDC. Al igual que CLDC fue la primera configuración definida para Java 2 Micro Edition (J2ME), MIDP fue el primer perfil definido para esta plataforma. Este perfil está orientado para dispositivos con las siguientes características:
    • Reducida capacidad computacional y de memoria.
    • Conectividad limitada (en torno a 9600 bps).
    • Capacidad gráfica muy reducida (mínimo un display de 96×54 pixels monocromo).
    • Entrada de datos alfanumérica reducida.
    • 128 Kb de memoria no volátil para componentes MIDP.
    • 8 Kb de memoria no volátil para datos persistentes de aplicaciones.
    • 32 Kb de memoria volátil en tiempo de ejecución para la pila Java.

Los tipos de dispositivos que se adaptan a estas características son: teléfonos móviles, buscapersonas (pagers) o PDAs de gama baja con conectividad. El perfil MIDP establece las capacidades del dispositivo, por lo tanto, especifica las APIs relacionadas con:

  • La aplicación (semántica y control de la aplicación MIDP).
  • Interfaz de usuario.
  • Almacenamiento persistente.
  • Trabajo en red.
  • Temporizadores.

Máquinas Virtuales J2ME: KVM, CVM

Una máquina virtual de Java (JVM) es un programa encargado de interpretar código intermedio (bytecode) de los programas Java precompilados a código máquina ejecutable por la plataforma, efectuar las llamadas pertinentes al sistema operativo subyacente y observar las reglas de seguridad y corrección de código definidas para el lenguaje Java. De esta forma, la JVM proporciona al programa Java independencia de la plataforma con respecto al hardware y al sistema operativo subyacente. Las implementaciones tradicionales de JVM son, en general, muy pesadas en cuanto a
memoria ocupada y requerimientos computacionales. Java 2 Micro Edition (J2ME) define varias JVMs de referencia adecuadas al ámbito de los dispositivos electrónicos que, en algunos casos, suprimen algunas características con el fin de obtener una implementación menos exigente.

Ya hemos visto que existen dos configuraciones CLDC y CDC, cada una con unas características propias. Como consecuencia, cada una requiere su propia máquina virtual. La VM (Virtual Machine) de la configuración CLDC se denomina KVM y la de la configuración CDC se denomina CVM. Las características principales de cada una de ellas

Máquina virtual KVM

  • KVM: se corresponde con la Máquina Virtual más pequeña desarrollada por Sun. Su nombre KVM proviene de Kilobyte (haciendo referencia a la baja ocupación de memoria, entre 40Kb y 80Kb). Se trata de una implementación de Máquina Virtual reducida y especialmente orientada a dispositivos con bajas capacidades computacionales y de memoria. La KVM está escrita en lenguaje C, aproximadamente unas 24000 líneas de código, y fue diseñada para ser:
    • Pequeña, con una carga de memoria entre los 40Kb y los 80 Kb, dependiendo de la plataforma y las opciones de compilación.
    • Alta portabilidad.
    • Modulable.
    • Lo más completa y rápida posible y sin sacrificar características para las que fue diseñada.

Sin embargo, esta baja ocupación de memoria hace que posea algunas limitaciones con respecto a la clásica Java Virtual Machine (JVM):
no hay soporte para tipos en coma flotante (double, float), no existe soporte para JNI (Java Native Interface) debido a los recursos limitados de memoria, no existen cargadores de clases (class loaders) definidos por el usuario, no se permiten los grupos de hilos o hilos daemon, no existe la finalización de instancias de clases (método Object.finalize()), no hay referencias débiles, limitada capacidad para el manejo de excepciones debido a que el manejo de éstas depende en gran parte de las APIs de cada dispositivo por lo que son éstos los que controlan la mayoría de las excepciones, etc.

La KVM puede ser compilada y probada en tres plataformas distintas:

  • Solaris Operating Environment.
  • Windows.
  • PalmOs.

Máquina virtual CVM

  • CVM: Compact Virtual Machine ha sido tomada como Máquina Virtual Java de referencia para la configuración CDC y soporta las mismas características que la Máquina Virtual de J2SE. Está orientada a dispositivos electrónicos con procesadores de 32 bits de gama alta y en torno a 2Mb o más de memoria RAM. Las características que presenta esta Máquina Virtual son:
    • Sistema de memoria avanzado.
    • Tiempo de espera bajo para el recolector de basura.
    • Separación completa de la VM del sistema de memoria.
    • Recolector de basura modularizado.
    • Portabilidad.
    • Rápida sincronización.
    • Ejecución de las clases Java fuera de la memoria de sólo lectura (ROM).
    • Soporte nativo de hilos.
    • Baja ocupación en memoria de las clases.
    • Proporciona soporte e interfaces para servicios en Sistemas Operativos de Tiempo Real.
    • Conversión de hilos Java a hilos nativos.
    • Soporte para todas las características de Java2 v1.3 y librerías de seguridad, referencias débiles, Interfaz Nativa de Java (JNI), invocación remota de métodos (RMI), Interfaz de depuración de la Máquina Virtual (JVMDI).

 

En resumen, un entorno de ejecución determinado de Java 2 Micro Edition (J2ME) se compone de una selección de:

  • Máquina virtual: JVM, KVM ó CVM.
  • Configuración: CLDC ó CDC.
  • Perfil: PDA, MIDP, RMI, etc.
  • Paquetes Opcionales.

MIDlets

MIDlet es un programa desarrollado en lenguaje de programación Java para dispositivos embedidos. Más específicamente para la máquina virtual Java MicroEdition (Java ME). Generalmente son juegos y aplicaciones que corren en un teléfono móvil. Está desarrollada bajo la especificación MIDP (Mobile Information Device Profile).

El MIDlets suele ser un archivo JAR y está formado por los siguientes elementos:

  • Un archivo manifiesto que describe el contenido del archivo JAR.
  • Las clases Java que forman el MIDlet.
  • Los archivos de recursos usados por el MIDlet.