En este tema vamos a ver cómo construir aplicaciones J2ME a partir del código fuente de forma que estén listas para ser instaladas directamente en cualquier dispositivo con soporte para esta tecnología.
Vamos a estudiar la creación de aplicaciones para MIDs, que serán normalmente teléfonos móviles o algunos PDAs. Por lo tanto nos centraremos en el perfil MIDP.
Para comenzar vamos a ver de qué se componen las aplicaciones MIDP que podemos instalar en los móviles (ficheros JAD y JAR), y cómo se realiza este proceso de instalación. A continuación veremos como crear paso a paso estos ficheros de los que se componen estas aplicaciones, y como probarlas en emuladores para no tener que transferirlas a un dispositivo real cada vez que queramos hacer una prueba. En el siguiente punto se verá cómo podremos facilitar esta tarea utilizando los kits de desarrollo que hay disponibles, y algunos entornos integrados (IDEs) para hacer más cómodo todavía el desarrollo de aplicaciones para móviles.
Para distribuir e instalar las aplicaciones J2ME en los dispositivos utilizaremos ficheros de tipos JAR y JAD. Las aplicaciones estarán compuestas por un fichero JAR y un fichero JAD.
Los MIDlets son las aplicaciones Java desarrolladas con MIDP que se pueden ejecutar en los MIDs. Los ficheros JAD y JAR contienen un conjunto de MIDlets, lo que se conoce como suite. Una suite es un conjunto de uno o más MIDlets empaquetados en un mismo fichero. De esta forma cuando dicha suite sea instalada en el móvil se instalarán todas las aplicaciones (MIDlets) que contenga.
El fichero JAR será el que contendrá las aplicaciones de la suite. En él tendremos tanto el código compilado como los recursos que necesite para ejecutarse (imágenes, sonidos, etc). Estos ficheros JAR son un estándar de la plataforma Java, disponibles en todas las ediciones de esta plataforma, que nos permitirán empaquetar una aplicación Java en un solo fichero. Al ser un estándar de la plataforma Java será portable a cualquier sistema donde contemos con esta plataforma.
Por otro lado, el fichero JAD (Java Application Descriptor) contendrá una descripción de la suite . En él podremos encontrar datos sobre su nombre, el tamaño del fichero, la versión, su autor, MIDlets que contiene, etc. Además también tendrá una referencia al fichero JAR donde se encuentra la aplicación.
De esta forma cuando queramos instalar una aplicación deberemos localizar su fichero JAD. Una vez localizado el fichero JAD, deberemos indicar que deseamos instalar la aplicación, de forma que se descargue e instale en nuestro dispositivo el fichero JAR correspondiente. Además el fichero JAD localizado nos permitirá saber si una aplicación ya está instalada en nuestro dispositivo, y de ser así comprobar si hay disponible una versión superior y dar la opción al usuario de actualizarla. De esta forma no será necesario descargar el fichero JAR entero, cuyo tamaño será mayor debido a que contiene toda la aplicación, para conocer los datos de la aplicación y si la tenemos ya instalada en nuestro móvil.
Un posible escenario de uso es el siguiente. Podemos navegar con nuestro móvil mediante WAP por una página WML. En esa página puede haber publicadas una serie de aplicaciones Java para descargar. En la página tendremos los enlaces a los ficheros JAD de cada aplicación disponible. Seleccionando con nuestro móvil uno de estos enlaces, accederá al fichero JAD y nos dará una descripción de la aplicación que estamos solicitando, preguntándonos si deseamos instalarla. Si decimos que si, descargará el fichero JAR asociado en nuestro móvil e instalará la aplicación de forma que podemos usarla. Si accedemos posteriormente a la página WML y pinchamos sobre el enlace al JAD de la aplicación, lo comparará con las aplicaciones que tenemos instaladas y nos dirá que la aplicación ya está instalada en nuestro móvil. Además, al incluir la información sobre la versión podrá saber si la versión que hay actualmente en la página es más nueva que la que tenemos instalada, y en ese caso nos dará la opción de actualizarla.
Los dispositivos móviles contienen lo que se denomina AMS (Application Management Software), o software gestor de aplicaciones en castellano. Este software será el encargado de realizar el proceso de instalación de aplicaciones que hemos visto en el punto anterior. Será el que controle el ciclo de vida de las suites:
Los ficheros JAD son ficheros ASCII que contienen una descripción de la suite. En él se le dará valor a una serie de propiedades (parámetros de configuración) de la suite. Tenemos una serie de propiedades que deberemos especificar de forma obligatoria en el fichero:
MIDlet-Name |
Nombre de la suite. |
MIDlet-Version |
Versión de la suite. La versión se compone de 3 número
separados por puntos: <mayor>.<menor>.<micro> ,
como por ejemplo 1.0.0 |
MIDlet-Vendor |
Autor (Proveedor) de la suite. |
MIDlet-Jar-URL |
Dirección (URL) de donde obtener el fichero JAR con la suite. |
MIDlet-Jar-Size |
Tamaño del fichero JAR en bytes. |
Además podemos incluir una serie de propiedades adicionales de forma optativa:
MIDlet-Icon |
Icono para la suite. Si especificamos un icono éste se mostrará junto al nombre de la suite, por lo que nos servirá para identificarla. Este icono será un fichero con formato PNG que deberá estar contenido en el fichero JAR. |
MIDlet-Description |
Descripción de la suite. |
MIDlet-Info-URL |
Dirección URL donde podemos encontrar información sobre la suite. |
MIDlet-Data-Size |
Número mínimo de bytes que necesita la suite
para almacenar datos de forma persistente. Por defecto este número
mínimo se considera 0 . |
Estas son propiedades que reconocerá el AMS y de las que obtendrá la información necesaria sobre la suite. Sin embargo, como desarrolladores puede interesarnos incluir una serie de parámetros de configuración propios de nuestra aplicación. Podremos hacer eso simplemente añadiendo nuevas propiedades con nombres distintos a los anteriores al fichero JAR. En el capítulo 4 veremos como acceder a estas propiedades desde nuestras aplicaciones.
Un ejemplo de fichero JAD para una suite de MIDlets es el siguiente:
MIDlet-Name: SuiteEjemplos MIDlet-Version: 1.0.0 MIDlet-Vendor: Universidad de Alicante MIDlet-Description: Aplicaciones de ejemplo para moviles. MIDlet-Jar-Size: 16342 MIDlet-Jar-URL: ejemplos.jar
En el fichero JAR empaquetaremos los ficheros .class
resultado
de compilar las clases que componen nuestra aplicación, así como
todos los recursos que necesite la aplicación, como pueden ser imágenes,
sonidos, músicas, videos, ficheros de datos, etc.
Para empaquetar estos ficheros en un fichero JAR, podemos utilizar la herramienta
jar
incluida en J2SE. Más adelante veremos como hacer esto.
Además de estos contenidos, dentro del JAR tendremos un fichero MANIFEST.MF
que contendrá una serie de parámetros de configuración
de la aplicación. Se repiten algunos de los parámetros especificados
en el fichero JAD, y se introducen algunos nuevos. Los parámetros requeridos
son:
MIDlet-Name |
Nombre de la suite. |
MIDlet-Version |
Versión de la suite. |
MIDlet-Vendor |
Autor (Proveedor) de la suite. |
MicroEdition-Profile |
Perfil requerido para ejecutar la suite. Podrá tomar el
valor MIDP-1.0 ó MIDP-2.0 , según
las versión de MIDP que utilicen las aplicaciones incluidas. |
MicroEdition-Configuration |
Configuración requerida para ejecutar la suite. Tomará
el valor CLDC-1.0 para las aplicaciones que utilicen esta configuración. |
Deberemos incluir también información referente a cada MIDlet contenido en la suite. Esto lo haremos con la siguiente propiedad:
MIDlet-<n> |
Nombre, icono y clase principal del MIDlet número n |
Los MIDlets se empezarán a numerar a partir del número 1, y deberemos incluir una línea de este tipo para cada MIDlet disponible en la suite. Daremos a cada MIDlet un nombre para que lo identifique el usuario, un icono de forma optativa, y el nombre de la clase principal que contiene dicho MIDlet.
Si especificamos un icono, deberá ser un fichero con formato PNG contenido dentro del JAR de la suite. Por ejemplo, para una suite con 3 MIDlets podemos tener la siguiente información:
MIDlet-Name: SuiteEjemplos MIDlet-Version: 1.0.0 MIDlet-Vendor: Universidad de Alicante MIDlet-Description: Aplicaciones de ejemplo para moviles. MicroEdition-Configuration: CLDC-1.0 MicroEdition-Profile: MIDP-1.0 MIDlet-1: Snake, /icons/snake.png, es.ua.j2ee.serpiente.SerpMIDlet MIDlet-2: TeleSketch, /icons/ts.png, es.ua.j2ee.ts.TeleSketchMIDlet MIDlet-3: Panj, /icons/panj.png, es.ua.j2ee.panj.PanjMIDlet
Además tenemos las mismas propiedades optativas que en el fichero JAD:
MIDlet-Icon |
Icono para la suite. |
MIDlet-Description |
Descripción de la suite. |
MIDlet-Info-URL |
Dirección URL con información |
MIDlet-Data-Size |
Número mínimo de bytes para datos persistentes. |
En este fichero, a diferencia del fichero JAD, no podremos introducir propiedades propias del usuario, ya que desde dentro de la aplicación no podremos acceder a los propiedades contenidas en este fichero.
Vamos a ver los pasos necesarios para construir una aplicación con J2ME a partir del código fuente, obteniendo finalmente los ficheros JAD y JAR con los que podremos instalar la aplicación en dispositivos móviles.
El primer paso será compilar las clases, obteniendo así el código intermedio que podrá ser ejecutado en una máquina virtual de Java. El problema es que este código intermedio es demasiado complejo para la KVM, por lo que deberemos realizar una preverificación del código, que simplifique el código intermedio de las clases y compruebe que no utiliza ninguna característica no soportada por la KVM. Una vez preverificado, deberemos empaquetar todos los ficheros de nuestra aplicación en un fichero JAR, y crear el fichero JAD correspondiente. En este momento podremos probar la aplicación en un emulador o en un dispositivo real. Los emuladores nos permitirán probar las aplicaciones directamente en nuestro ordenador sin tener que transferirlas a un dispositivo móvil real.
Figura 1. Proceso de construcción de aplicaciones
Necesitaremos tener instalado J2SE, ya que utilizaremos las mismas herramientas para compilar y empaquetar las clases. Además necesitaremos herramientas adicionales, ya que la máquina virtual reducida de los dispositivos CLDC necesita un código intermedio simplificado.
Lo primero que deberemos hacer es compilar las clases de nuestra aplicación.
Para ello utilizaremos el compilador incluido en J2SE, javac
, por
lo que deberemos tener instalada esta edición de Java.
Al compilar, el compilador buscará las clases que utilizamos dentro de nuestros programas para comprobar que estamos utilizándolas correctamente, y si utilizamos una clase que no existe, o bien llamamos a un método o accedemos a una propiedad que no pertenece a dicha clase nos dará un error de compilación. Java busca las clases en el siguiente orden:
1. Clases de núcleo de Java (bootstrap)
2. Extensiones instaladas
3. Classpath
Si estamos compilando con el compilador de J2SE, por defecto considerará
que las clases del núcleo de Java son las clases de la API de J2SE. Debemos
evitar que esto ocurra, ya que estas clases no van a estar disponibles en los
dispositivos MIDP que cuentan con una API reducida. Deberemos hacer que tome
como clases del núcleo las clases de la API de MIDP, esto lo haremos
mediante el parámetro bootclasspath
del compilador:
javac -bootclasspath ${ruta_midp}/midpapi.zip <ficheros .java>
Con esto estaremos compilando nuestras clases utilizando como API del núcleo de Java la API de MIDP. De esta forma, si dentro de nuestro programa utilizásemos una clase que no pertenece a MIDP, aunque pertenezca a J2SE nos dará un error de compilación.
Este es un paso opcional, pero recomendable. El código intermedio de Java incluye información sobre los nombres de los constructores, de los métodos y de los atributos de las clases e interfaces para poder acceder a esta información utilizando la API de reflection en tiempo de ejecución.
El contar con esta información nos permite descompilar fácilmente las aplicaciones, obteniendo a partir del código compilado unos fuentes muy parecidos a los originales. Lo único que se pierde son los comentarios y los nombres de las variables locales y de los parámetros de los métodos.
Esto será un problema si no queremos que se tenga acceso al código fuente de nuestra aplicación. Además incluir esta información en los ficheros compilados de nuestra aplicación harán que crezca el tamaño de estos ficheros ocupando más espacio, un espacio muy preciado en el caso de los dispositivos móviles con baja capacidad. Hemos de recordar que el tamaño de los ficheros JAR que soportan está limitado en muchos casos a 64kb o menos.
El proceso de ofuscación del código consiste en simplificar esta información, asignándoles nombres tan cortos como se pueda a las clases e interfaces y a sus constructores, métodos y atributos. De esta forma al descompilar obtendremos un código nada legible con nombres sin ninguna significancia.
Además conseguiremos que los ficheros ocupen menos espacio en disco, lo cuál será muy conveniente para las aplicaciones para dispositivos móviles con baja capacidad y reducida velocidad de descarga.
La ofuscación de código deberemos hacerla antes de la preverificación, dejando la preverificación para el final, y asegurándonos así de que el código final de nuestra aplicación funcionará correctamente en la KVM. Podemos utilizar para ello diferentes ofuscadores, como ProGuard, RetroGuard o JODE. Deberemos obtener alguno de estos ofuscadores por separado, ya que no se incluyen en J2SE ni en los kits de desarrollo para MIDP que veremos más adelante.
Con la compilación que acabamos de realizar hemos generado código intermedio que serán capaces de interpretar las máquinas virtuales Java. Sin embargo, máquina virtual de los dispositivos CLDC, la KVM, es un caso especial ya que las limitaciones de estos dispositivos hacen que tenga que ser bastante más reducida que otras máquinas virtuales para poder funcionar correctamente.
La máquina virtual de Java hace una verificación de las clases que ejecuta en ella. Este proceso de verificación es bastante complejo para la KVM, por lo que deberemos reorganizar el código intermedio generado para facilitar esta tarea de verificación. En esto consiste la fase de preverificación que deberemos realizar antes de llevar la aplicación a un dispositivo real.
Además la KVM tiene una serie de limitaciones en cuanto al código
que puede ejecutar en ella, como por ejemplo la falta de soporte para tipos
de datos float
y double
. Con la compilación
hemos comprobado que no estamos utilizando clases que no sean de la API de MIDP,
pero se puede estar permitiendo utilizar características del lenguaje
no soportada por la KVM. Es el proceso de preverificación el que deberá
detectar el error en este caso.
Para realizar la preverificación necesitaremos la herramienta preverify
.
Esta herramienta no se incluye en J2SE, por lo que deberemos obtenerla por separado.
Podemos encontrarla en diferentes kits de desarrollo o en implementaciones de
referencia de MIDP, como veremos más adelante. Deberemos especificar
como classpath
la API que estemos utilizando para nuestra aplicación,
como por ejemplo MIDP:
preverify -classpath ${ruta_midp}/midpapi.zip -d <directorio destino>
<ficheros .class>
Preverificará los ficheros .class
especificados y guardará
el resultado de la preverificación en el directorio destino que indiquemos.
Las clases generadas en este directorio destino serán las que tendremos
que empaquetar en nuestra suite.
Una vez tenemos el código compilado preverificado, deberemos empaquetarlo
todo en un fichero JAR para crear la suite con nuestra aplicación.
En este fichero JAR deberemos empaquetar todos los ficheros .class
generados, así como todos los recursos que nuestra aplicación
necesite para funcionar, como pueden ser iconos, imágenes, sonidos, ficheros
de datos, videos, etc.
Para empaquetar un conjunto de ficheros en un fichero JAR utilizaremos la herramienta
jar
incluida en J2SE. Además de las clases y los recursos,
deberemos añadir al fichero MANIFEST.MF
del JAR los parámetros
de configuración que hemos visto en el punto anterior. Para ello crearemos
un fichero de texto ASCII con esta información, y utilizaremos dicho
fichero a la hora de crear el JAR. Utilizaremos la herramienta jar
de la siguiente forma:
jar cmf <fichero manifest> <fichero jar> <ficheros a incluir>
Una vez hecho esto tendremos construido el fichero JAR con nuestra aplicación. Ahora deberemos crear el fichero JAD. Para ello podemos utilizar cualquier editor ASCII e incluir las propiedades necesarias. Como ya hemos generado el fichero JAR podremos indicar su tamaño dentro del JAD.
Una vez tengamos los ficheros JAR y JAD ya podremos probar la aplicación transfiriéndola a un dispositivo que soporte MIDP e instalándola en él. Sin embargo, hacer esto para cada prueba que queramos hacer es una tarea tediosa. Tendremos que limitarnos a hacer pruebas de tarde en tarde porque si no se perdería demasiado tiempo. Además no podemos contar con que todos los desarrolladores tengan un móvil con el que probar las aplicaciones.
Si queremos ir probando con frecuencia los avances que hacemos en nuestro programa lo más inmediato será utilizar un emulador. Un emulador es una aplicación que se ejecuta en nuestro ordenador e imita (emula) el comportamiento del móvil. Entonces podremos ejecutar nuestras aplicaciones dentro de un emulador y de esta forma para la aplicación será prácticamente como si se estuviese ejecutando en un móvil con soporte para MIDP. Así podremos probar las aplicaciones en nuestro mismo ordenador sin necesitar tener que llevarla a otro dispositivo.
Además podremos encontrar emuladores que imitan distintos modelos de móviles, tanto existentes como ficticios. Esta es una ventaja más de tener emuladores, ya que si probamos en dispositivos reales necesitaríamos o bien disponer de varios de ellos, o probar la aplicación sólo con el que tenemos y arriesgarnos a que no vaya en otros modelos. Será interesante probar emuladores de teléfonos móviles con distintas características (distinto tamaño de pantalla, colores, memoria) para comprobar que nuestra aplicación funciona correctamente en todos ellos.
Podemos encontrar emuladores proporcionados por distintos fabricantes, como Nokia, Siemens o Sun entre otros. De esta forma tendremos emuladores que imitan distintos modelos de teléfonos Nokia o Siemens existentes. Sun proporciona una serie de emuladores genéricos que podremos personalizar dentro dentro de su kit de desarrollo que veremos en el próximo apartado.
Será importante también, una vez hayamos probado la aplicación en emuladores, probarla en un dispositivo real, ya que puede haber cosas que funcionen bien en emuladores pero no lo hagan cuando lo llevamos a un dispositivo móvil de verdad. Los emuladores pretenden imitar en la medida de lo posible el comportamiento de los dispositivos reales, pero siempre hay diferencias, por lo que será importante probar las aplicaciones en móviles de verdad antes de distribuir la aplicación.
La forma más directa de probar la aplicación en dispositivos móviles es conectarlos al PC mediante alguna de las tecnologías disponibles (bluetooth, IrDA, cable serie o USB) y copiar la aplicación del PC al dispositivo. Una vez copiada, podremos instalarla desde el mismo dispositivo, y una vez hecho esto ya podremos ejecutarla.
Por ejemplo, los emuladores funcionan bien con código no preverificado, o incluso muchos de ellos funcionan con los ficheros una vez compilados sin necesidad de empaquetarlos en un JAR.
Entendemos por despliegue de la aplicación la puesta en marcha de la misma, permitiendo que el público acceda a ella y la utilice. Para desplegar una aplicación MIDP deberemos ponerla en algún lugar accesible, al que podamos conectarnos desde los móviles y descargarla.
Podremos utilizar cualquier servidor web para ofrecer la aplicación en Internet, como puede ser por ejemplo el Tomcat. Deberemos configurar el servidor de forma que reconozca correctamente los tipos de los ficheros JAR y JAD. Para ello asociaremos estas extensiones a los tipos MIME:
.jad |
text/vnd.sun.j2me.app-descriptor |
.jar |
application/java-archive |
Además en el fichero JAD, deberemos especificar como URL la dirección de Internet donde finalmente hemos ubicado el fichero JAR.
Para simplificar la tarea de desarrollar aplicaciones MIDP, tenemos disponibles distintos kits de desarrollo proporcionados por distintos fabricantes, como Sun o Nokia. Antes de instalar estos kits de desarrollo deberemos tener instalado J2SE. Estos kits de desarrollo contienen todos los elementos necesarios para, junto a J2SE, crear aplicaciones MIDP:
Vamos a centrarnos en estudiar cómo trabajar con el kit de desarrollo de Sun, ya que es el más utilizado por ser genérico y el que mejor se integra con otros entornos y herramientas. Este kit recibe el nombre de Wireless Toolkit (WTK).
Hemos visto en el punto anterior los pasos que deberemos seguir para probar nuestras aplicaciones MIDP: compilar, preverificar, empaquetar, crear el archivo JAD y ejecutar en un emulador.
Normalmente, mientras escribimos el programa querremos probarlo numerosas veces para comprobar que lo que llevamos hecho funciona correctamente. Si cada vez que queremos probar el programa tuviésemos que realizar todos los pasos vistos anteriormente de forma manual programar aplicaciones MIDP sería una tarea tediosa. Además requeriría aprender a manejar todas las herramientas necesarias para realizar cada paso en la línea de comando.
Por ello los kits de desarrollo, y concretamente WTK, proporcionan entornos
para crear aplicaciones de forma automatizada, sin tener que trabajar directamente
con las herramientas en línea de comando. En el caso de WTK, esta herramienta
recibe el nombre de ktoolbar
:
Este entorno nos permitirá construir la aplicación a partir del código fuente, pero no proporciona ningún editor de código fuente, por lo que tendremos que escribir el código fuente utilizando cualquier editor externo. Otra posibilidad es integrar WTK en algún entorno de desarrollo integrado (IDE) de forma que tengamos integrado el editor con todas las herramientas para construir las aplicaciones facilitando más aun la tarea del desarrollador. En el siguiente punto veremos como desarrollar aplicaciones utilizando un IDE.
Directorio de aplicaciones
Este entorno de desarrollo guarda todas las aplicaciones dentro de un mismo directorio de aplicaciones. Cada aplicación estará dentro de un subdirectorio dentro de este directorio de aplicaciones, cuyo nombre corresponderá al nombre de la aplicación.
Por defecto, este directorio de aplicaciones es el directorio ${WTK_HOME}/apps
,
pero podemos modificarlo añadiendo al fichero ktools.properties
la siguiente línea:
kvem.apps.dir: <directorio de aplicaciones>
Además, dentro de este directorio hay un directorio lib
,
donde se pueden poner las librerías externas que queremos que utilicen
todas las aplicaciones. Estas librerías serán ficheros JAR cuyo
contenido será incorporado a las aplicaciones MIDP que creemos, de forma
que podamos utilizar esta librería dentro de ellas.
Por ejemplo, después de instalar WTK podemos encontrar a parte del directorio de librerías una serie de aplicaciones de demostración instaladas. El directorio de aplicaciones puede contener por ejemplo los siguientes directorios (en el caso de WTK 1.0.4):
games demos lib tmplib photoalbum UIDemo
Tendremos por lo tanto las aplicaciones games
, demos
,
photoalbum
, y UIDemo
. El directorio tmplib
lo utiliza el entorno para trabajar de forma temporal con las librerías
del directorio lib
.
NOTA: Dado que se manejan gran cantidad de herramientas y emuladores independientes en el desarrollo de las aplicaciones MIDP, es recomendable que el directorio donde está instalada la aplicación (ni ninguno de sus ascendientes) contenga espacios en blanco, ya que algunas aplicaciones puede fallar en estos casos.
Estructura de las aplicaciones
Dentro del directorio de cada aplicación, se organizarán los distintos ficheros de los que se compone utilizando la siguiente estructura de directorios:
bin lib res src classes tmpclasses tmplib
Deberemos crear el código fuente de la aplicación dentro del
directorio src
, creando dentro de este directorio la estructura
de directorios correspondiente a los paquetes a los que pertenezcan nuestras
clases.
En res
guardaremos todos los recursos que nuestra aplicación
necesite, pudiendo crear dentro de este directorio la estructura de directorios
que queramos para organizar estos recursos.
Por último, en lib
deberemos poner las librerías
adicionales que queramos incorporar a nuestra aplicación. Pondremos en
este directorio el fichero JAR con la librería de clases que queramos
añadir. Lo que se hará será añadir todas las clases
contenidas en estas librerías, así como las contenidas en las
librerías globales que hemos visto anteriormente, al fichero JAR que
creemos para nuestra aplicación.
NOTA: Si lo que queremos es utilizar en nuestra aplicación una API opcional
soportada por el móvil, no debemos introducirla en este directorio. En
ese caso sólo deberemos añadirla al classpath
a la
hora de compilar, pero no introducirla en este directorio ya que el móvil
ya cuenta con su propia implementación de dicha librería y no
deberemos añadir la implementación de referencia que tenemos en
el ordenador al paquete de nuestra aplicación.
Esto es todo lo que tendremos que introducir nosotros. Todo lo demás
será generado automáticamente por la herramienta ktoolbar
como veremos a continuación. En el directorio classes
se
generarán las clases compiladas y preverificadas de nuestra aplicación,
y en bin
tendremos finalmente los ficheros JAR y JAD para desplegar
nuestra aplicación.
Creación de una nueva aplicación
Cuando queramos crear una nueva aplicación, lo primero que haremos será pulsar el botón "New Project ..." para abrir el asistente de creación de aplicaciones. Lo primero que nos pedirá es el nombre que queremos darla a la aplicación, y el nombre de la clase principal (MIDlet) que vamos a crear:
Debemos indicar aquí un nombre para la aplicación (Project Name), que será el nombre del directorio donde se guardará la aplicación. Además deberemos indicar el nombre de la clase correspondiente al MIDlet principal de la suite (MIDlet Class Name). Es posible que nosotros todavía no hayamos creado esta clase, por lo que deberemos indicar el nombre que le asignaremos cuando la creemos. De todas formas este dato puede ser modificado más adelante.
Una vez hayamos introducido estos datos, pulsamos "Create Project"
y nos aparecerá una ficha para introducir todos los datos necesarios
para crear el fichero JAD y el MANIFEST.MF
del JAR. Con los datos
introducidos en la ventana anterior habrá rellenado todos los datos necesarios,
pero nosotros podemos modificarlos manualmente si queremos personalizarlo más.
La primera ficha nos muestra los datos obligatorios:
Como nombre de la suite y del JAR habrá tomado por defecto el nombre del proyecto que hayamos especificado. Será conveniente modificar los datos del fabricante y de la versión, para adaptarlos a nuestra aplicación. No debemos preocuparnos por especificar el tamaño del JAR, ya que este dato será actualizado de forma automática cuando se genere el JAR de la aplicación.
En la segunda pestaña tenemos los datos opcionales que podemos introducir en estos ficheros:
Estos datos están vacíos por defecto, ya que no son necesarios, pero podemos darles algún valor si lo deseamos. Estas son las propiedades opcionales que reconoce el AMS. Si queremos añadir propiedades propias de nuestra aplicación, podemos utilizar la tercera pestaña:
Aquí podemos añadir o eliminar cualquier otra propiedad que queramos
definir para nuestra aplicación. De esta forma podemos parametrizarlas.
En el ejemplo de la figura hemos creado una propiedad msg.bienvenida
que contendrá el texto de bienvenida que mostrará nuestra aplicación.
De esta forma podremos modificar este texto simplemente modificando el valor
de la propiedad en el JAD, sin tener que recompilar el código.
En la última pestaña tenemos los datos de los MIDlets que contiene la suite. Por defecto nos habrá creado un único MIDlet:
Por defecto le habrá dado a este MIDlet el mismo nombre que a la aplicación, es decir, el nombre del proyecto que hemos especificado, al igual que ocurre con el nombre del icono. Como clase correspondiente al MIDlet habrá introducido el nombre de la clase que hemos especificado anteriormente.
Dado que una suite puede contener más de un MIDlet, desde esta pestaña podremos añadir tantos MIDlets como queramos, especificando para cada uno de ellos su nombre, icono (de forma opcional) y clase.
Una vez terminemos de introducir todos estos datos, pulsamos "OK" y en la ventana principal nos mostrará el siguiente mensaje:
Con este mensaje nos notifica el directorio donde se ha creado la aplicación, y los subdirectorios donde debemos introducir el código fuente, recursos y librerías externas de nuestra aplicación. Se habrá creado la siguiente estructura de directorios en el disco:
En el directorio bin
se habrán creado los ficheros JAD
y MANIFEST.MF
provisionales con los datos que hayamos introducido.
Los demás directorios estarán vacíos, deberemos introducir
en ellos todos los componentes de nuestra aplicación.
Abrir una aplicación ya existente
Si tenemos una aplicación ya creada, podemos abrirla desde el entorno para continuar trabajando con ella. Para abrir una aplicación pulsamos "Open Project ..." y nos mostrará la siguiente ventana con las aplicaciones disponibles:
Podemos seleccionar cualquiera de ellas y abrirla pulsando "Open
Project". Una vez abierta podremos modificar todos los datos que
hemos visto anteriormente correspondientes a los ficheros JAD y MANIFEST.MF
pulsando sobre el botón "Settings ...".
Además podremos compilarla, empaquetarla y probarla en cualquier emulador instalado como veremos a continuación.
Una vez hemos escrito el código fuente de nuestra aplicación
MIDP (en el directorio src
) y hemos añadido los recursos
y las librerías necesarias para ejecutarse dicha aplicación (en
los directorios res
y lib
respectivamente) podremos
utilizar la herramienta ktoolbar
para realizar de forma automatizada
todos los pasos para la construcción de la aplicación. Vamos a
ver ahora como realizar este proceso.
Compilación
Para compilar el código fuente de la aplicación simplemente deberemos
pulsar el botón "Build" o ir a la opción
del menú Project > Build. Con esto compilará
y preverificará de forma automática todas las clases de nuestra
aplicación, guardando el resultado en el directorio classes
de nuestro proyecto.
Para compilar las clases utilizará como classpath la API proporcionada por el emulador seleccionado actualmente. Para los emuladores distribuidos con WTK estas clases serán las API básica de MIDP (1.0 ó 2.0 según la versión de WTK instalada). Sin embargo, podemos incorporar emuladores que soporten APIs adicionales, como por ejemplo MMAPI para dar soporte a elementos multimedia, o APIs propietarias de distintas compañías como Nokia. En caso de tener seleccionado un emulador con alguna de estas APIs adicionales, estas APIs también estarán incluidas en el classpath, por lo que podremos compilar correctamente programas que las utilicen. El emulador seleccionado aparece en el desplegable Device.
Ofuscación
El entorno de desarrollo de WTK también nos permitirá ofuscar el código de forma automática. Este paso es opcional, y si queremos que WTK sea capaz de utilizar la ofuscación deberemos descargar alguno de los ofuscadores soportados por este entorno, como ProGuard (en WTK 2.0) o RetroGuard (en WTK 1.0). Estos ofuscadores son proporcionados por terceros.
Una vez tenemos uno de estos ofuscadores, tendremos un fichero JAR con las
clases del ofuscador. Lo que deberemos hacer para instalarlo es copiar este
fichero JAR al directorio ${WTK_HOME}/bin
. Una vez tengamos el
fichero JAR del ofuscador en este directorio, WTK podrá utilizarlo de
forma automática para ofuscar el código.
La ofuscación la realizará WTK en el mismo paso de la creación del paquete JAR, en caso de disponer de un ofuscador instalado, como veremos a continuación.
Empaquetamiento
Para poder instalar una aplicación en el móvil y distribuirla, deberemos generar el fichero JAR con todo el contenido de la aplicación. Para hacer esto de forma automática deberemos ir al menú Project > Package. Dentro de este menú tenemos dos opciones:
Ambas realizan todo el proceso necesario para crear el paquete de forma automática: compilan los fuentes, ofuscan (sólo en el segundo caso), preverifican y empaquetan las clases resultantes en un fichero JAR. Por lo tanto no será necesario utilizar la opción Build previamente, ya que el mismo proceso de creación del paquete ya realiza la compilación y la preverificación.
Una vez construido el fichero JAR lo podremos encontrar en el directorio bin
de la aplicación. Además este proceso actualizará de forma
automática el fichero JAD, para establecer el tamaño correcto
del fichero JAR que acabamos de crear en la propiedad correspondiente.
Dentro del mismo entorno de desarrollo de WTK podemos ejecutar la aplicación
en diferentes emuladores que haya instalados para probarla. Podemos seleccionar
el emulador a utilizar en el cuadro desplegable Device de la
ventana principal de ktoolbar
.
Para ejecutar la aplicación en el emulador seleccionado solo debemos pulsar el botón "Run" o la opción del menú Project > Run. Normalmente, para probar la aplicación en un emulador no es necesario haber creado el fichero JAR, simplemente con las clases compiladas es suficiente. En caso de ejecutarse sin haber compilado las clases, el entorno las compilará de forma automática.
Sin embargo, hay algunos emuladores que sólo funcionan con el fichero JAR, por lo que en este caso deberemos crear el paquete antes de ejecutar el emulador. Esto ocurre por ejemplo con algún emulador proporcionado por Nokia.
Los emuladores de teléfonos móviles proporcionados con WTK 1.0.4 son:
Además de estos, podemos incorporar otros emuladores al kit de desarrollo. Por ejemplo, los emuladores proporcionados por Nokia, imitando diversos modelos de teléfonos móviles de dicha compañía, pueden ser integrados fácilmente en WTK.
Para integrar los emuladores de teléfonos Nokia en WTK simplemente tendremos
que instalar estos emuladores en el directorio ${WTK_HOME}/wtklib/devices
.
Una vez instalados en este directorio, estos emuladores estarán disponibles
dentro del kit de desarrollo, de forma que podremos seleccionarlos en el cuadro
desplegable como cualquier otro emulador.
![]() MinimumPhone |
![]() DefaultColorPhone |
![]() Motorola i85s |
![]() Nokia 6310 |
![]() Nokia 7210 |
![]() Nokia Series 60 |
Podemos encontrar además emuladores proporcionados por otras compañías. WTK también nos permite personalizar los emuladores, cambiando su aspecto y características para adaptarlos a nuestras necesidades.
La herramienta ant
nos permite automatizar tareas como la compilación,
empaquetamiento, despliegue o ejecución de aplicaciones. Es similar a
la herramienta make
, pero con la ventaja de que es totalmente independiente
de la plataforma, ya que en lugar de utilizar comandos nativos utiliza clases
Java para realizar las tareas.
Tiene una serie de tareas definidas, que servirán para compilar clases, empaquetar en ficheros JAR, ejecutar aplicaciones, etc. Todas estas tareas están implementadas mediante clases Java. Además, nos permitirá añadir nuevas tareas, incorporando una librería de clases Java que las implemente.
Antenna es una librería de tareas para ant que nos
permitirán trabajar con aplicaciones MIDP. Entre estas tareas encontramos
la compilación y el empaquetamiento (con preverificación y ofuscación),
la creación de los ficheros JAD y MANIFEST.MF
, y la ejecución
de aplicaciones en emuladores.
Para realizar estas tareas utiliza WTK, por lo que necesitaremos tener este kit de desarrollo instalado. Los emuladores que podremos utilizar para ejecutar las aplicaciones serán todos aquellos emuladores instalados en WTK.
Para utilizar estas tareas deberemos copiar el JAR de Antenna al directorio de librerías de ant, o bien introducir este JAR en el classpath para que esté localizable.
Declaraciones
Dentro del fichero build.xml
de ant deberemos especificar
como propiedad wtk.home
el directorio donde tenemos instalado WTK:
<property name="wtk.home" value="c:\WTK104"/>
Además, debemos declarar las tareas de Antenna para poder utilizarlas dentro de dicho fichero:
<taskdef name="wtkjad" classname="de.pleumann.antenna.WtkJad"/> <taskdef name="wtkbuild" classname="de.pleumann.antenna.WtkBuild"/> <taskdef name="wtkpackage" classname="de.pleumann.antenna.WtkPackage"/> <taskdef name="wtkrun" classname="de.pleumann.antenna.WtkRun"/> <taskdef name="wtkpreverify" classname="de.pleumann.antenna.WtkPreverify"/> <taskdef name="wtkobfuscate" classname="de.pleumann.antenna.WtkObfuscate"/>
Tareas
Para crear el fichero JAD utilizaremos la tarea wtkjad
, a la que
debemos proporcionar la siguiente información:
<wtkjad jadfile="${jad.file}" jarfile="${jar.file}" name="${midlet.name}" vendor="${vendor.name}" version="${midlet.version}"> <midlet name="${midlet.name}" class="${midlet.class}"/> <attribute name="msg.bienvenida" value="Hola mundo"/>
</wtkjad>
Para compilar utilizaremos wtkbuild
. Esta tarea nos permite preverificar,
pero podemos dejar esto para el paso siguiente:
<wtkbuild srcdir="${src.home}" destdir="${build.home}" preverify="false"/>
Para empaquetar utilizaremos wtkpackage
. En este paso podremos
ofuscar y preverificar el código:
<wtkpackage jarfile="${jar.file}" jadfile="${jad.file}" obfuscate="${obfuscate}" preverify="true"> <fileset dir="${build.home}"/> <fileset dir="${res.home}"/> </wtkpackage>
Aquí debemos especificar los ficheros que vamos a incluir en el paquete
JAR mediante las etiquetas fileset
. En este ejemplo estamos incluyendo todos
los ficheros que haya en el directorio de clases compiladas y en el directorio
de recursos. Si queremos incluir librerías JAR (o ZIP) podemos utilizar
las siguientes etiquetas:
<zipfileset src="libreria.zip"/> <zipgroupfileset dir="lib"/>
La primera de ellas (zipfileset
) nos permite especificar una única
librería para incluir. Con la segunda (zipgroupfileset
)
se incluirán todas las librerías del directorio especificado.
Por último, para ejecutar la aplicación en un emulador utilizaremos
la tarea wtkrun
:
<wtkrun jadfile="${jad.file}" heapsize="0" device="${emulator.name}" wait="true"/>
Con esto podremos crear nuestras aplicaciones MIDP utilizando ant,
en lugar de utilizar la aplicación ktoolbar
de WTK.
Ejemplo completo
Vamos a ver un ejemplo completo genérico. Este código podrá ser aprovechado para la mayoría de aplicaciones J2ME, simplemente cambiando las propiedades declaradas al principio del fichero para introducir los datos correspondientes a cada aplicación:
<?xml version="1.0"?> <project name="Prueba" default="run" basedir="."> <!-- Propiedades del MIDlet --> <property name="jad.file" value="aplic.jad"/> <property name="jar.file" value="aplic.jar"/> <property name="vendor.name" value="Miguel Angel"/> <property name="midlet.version" value="1.0.0"/> <property name="midlet.name" value="Prueba"/> <property name="midlet.class" value="com.ua.j2ee.prueba.PrimerMIDlet"/> <!-- Propiedades del entorno --> <property name="emulator.name" value="DefaultColorEmulator"/> <property name="base.home" value="."/> <property name="src.home" value="${base.home}/src"/> <property name="build.home" value="${base.home}/classes"/> <property name="res.home" value="${base.home}/res"/> <property name="obfuscate" value="true"/> <!-- Establece el directorio de WTK (requerido por Antenna). --> <property name="wtk.home" value="c:\WTK104"/> <!-- Define las tareas de Antenna. --> <taskdef name="wtkjad" classname="de.pleumann.antenna.WtkJad"/> <taskdef name="wtkbuild" classname="de.pleumann.antenna.WtkBuild"/> <taskdef name="wtkpackage" classname="de.pleumann.antenna.WtkPackage"/> <taskdef name="wtkrun" classname="de.pleumann.antenna.WtkRun"/> <taskdef name="wtkpreverify" classname="de.pleumann.antenna.WtkPreverify"/> <taskdef name="wtkobfuscate" classname="de.pleumann.antenna.WtkObfuscate"/> <!-- Crea el fichero JAD. --> <target name="jad"> <wtkjad jadfile="${jad.file}" jarfile="${jar.file}" name="${midlet.name}" vendor="${vendor.name}" version="${midlet.version}"> <midlet name="${midlet.name}" class="${midlet.class}"/> </wtkjad> </target> <!-- Limpia el directorio de compilacion. --> <target name="clean"> <delete dir="${build.home}"/> <mkdir dir="${build.home}"/> </target> <!-- Compila las clases. --> <target name="compile" depends="clean"> <wtkbuild srcdir="${src.home}" destdir="${build.home}" preverify="false"/> </target> <!-- Empaqueta la aplicacion. --> <target name="package" depends="jad,compile"> <wtkpackage jarfile="${jar.file}" jadfile="${jad.file}" obfuscate="${obfuscate}" preverify="true"> <fileset dir="${build.home}"/> <fileset dir="${res.home}"/> </wtkpackage> </target> <!-- Ejecuta el MIDlet en un emulador. --> <target name="run" depends="package"> <wtkrun jadfile="${jad.file}" heapsize="0" device="${emulator.name}" wait="true"/> </target> </project>
APIs opcionales
Puede ocurrir que una aplicación necesite APIs adicionales para compilarse,
como puede ser MMAPI, WMA u otras APIs opcionales que podamos encontrar en algunos
modelos de teléfonos móviles. Es este caso deberemos especificar
de forma explícita el classpath que vamos a utilizar para la
compilación (wtkbuild
) y el empaquetamiento (wtkpackage
).
Para ello deberemos añadir dentro de cada una de estas tareas el siguiente
atributo:
bootclasspath="<classpath>"
Por ejemplo, si queremos utilizar la API multimedia MMAPI, podemos hacerlo de la siguiente forma:
<!-- Compila las clases. --> <target name="compile" depends="clean"> <wtkbuild srcdir="${src.home}" destdir="${build.home}" bootclasspath="${wtk.home}/lib/midpapi.zip;${wtk.home}/lib/mmapi.jar" preverify="false"> </wtkbuild> </target> <!-- Empaqueta la aplicacion. --> <target name="package" depends="jad,compile"> <wtkpackage jarfile="${jar.file}" jadfile="${jad.file}" obfuscate="${obfuscate}" bootclasspath="${wtk.home}/lib/midpapi.zip;${wtk.home}/lib/mmapi.jar" preverify="true"> <fileset dir="${build.home}"/> <fileset dir="${res.home}"/> </wtkpackage> </target>
Hemos visto que los kits de desarrollo como WTK nos permiten construir la aplicación pero no tienen ningún editor integrado donde podamos escribir el código. Por lo tanto tendríamos que escribir el código fuente utilizando cualquier editor de texto externo, y una vez escrito utilizar WTK para construir la aplicación.
Vamos a ver ahora como facilitar el desarrollo de la aplicación utilizando distintos entornos integrados de desarrollo (IDEs) que integran un editor de código con las herramientas de desarrollo de aplicaciones MIDP. Estos editores además nos facilitarán la escritura del código coloreando la sintaxis, revisando la corrección del código escrito, autocompletando los nombres, formateando el código, etc.
Para desarrollar aplicaciones J2ME podremos utilizar la mayoría de los IDEs existentes para Java, añadiendo alguna extensión para permitirnos trabajar con este tipo de aplicaciones. También podemos encontrar entornos dedicados exclusivamente a la creación de aplicaciones J2ME.
Vamos a centrarnos en dos entornos que tienen la ventaja de ser de libre distribución, y que son utilizados por una gran cantidad de usuarios dadas sus buenas prestaciones. Luego comentaremos más brevemente otros entornos disponibles para trabajar con aplicaciones J2ME.
Eclipse es un entorno de desarrollo de libre distribución altamente modular. Una de sus ventajas es que no necesita demasiados recursos para ejecutarse correctamente, por lo que será adecuado para máquinas poco potentes. Vamos a utilizar como referencia la versión 2.1.1 de este entorno. Algunas características pueden variar si se utiliza una versión distinta.
Este entorno nos permite crear proyectos en Java. Nos ofrece un editor, en el que podemos escribir el código, viendo la sintaxis coloreada para mayor claridad, y notificándonos de los errores que hayamos cometido al escribir el código, como por ejemplo haber escrito mal el nombre de un método, o usar un tipo o número incorrecto de parámetros. Además nos permitirá autocompletar los nombres de los métodos o las propiedades de las clases conforme los escribimos. Si el código ha quedado desordenado, nos permite darle formato automáticamente, poniendo la sangría adecuada para cada línea de código.
Esto nos facilitará bastante la escritura del código fuente. Sin embargo, no nos permitirá crear visualmente la GUI de las aplicaciones, ni el diseño, ni manejará conexiones con BDs ni con servidores de aplicaciones. Esto hace que el entorno sea bastante más ligero que otros entornos, por lo que será más cómodo de manejar si no necesitamos todas estas características. Incluso podemos añadirle muchas de estas funcionalidades que se echan en falta añadiendo módulos (plugins) al entorno.
Podremos compilar las clases del proyecto desde el mismo entorno, y ejecutar la aplicación para probarla utilizando la máquina virtual de Java. Esto será suficiente para aplicaciones J2SE, pero en principio no ofrece soporte directo para J2ME. Podemos optar por diferentes soluciones para crear aplicaciones J2ME con este entorno:
A continuación veremos como crear aplicaciones J2ME paso a paso siguiendo cada uno de estos tres métodos.
Editor de código
Vamos a ver como utilizar Eclipse simplemente para editar el código de las aplicaciones J2ME, dejando las tareas de compilación, empaquetamiento y ejecución para realizarlas de forma externa con WTK.
Lo primero que tenemos que hacer es crear una nueva aplicación utilizando WTK, como hemos visto en el punto anterior, de forma que nos cree la estructura de directorios necesaria en nuestro directorio de proyectos.
Una vez hecho esto, podemos entrar ya en Eclipse para comenzar a escribir código. Crearemos un nuevo proyecto Java, utilizando el comando New:
Elegimos Java Project y pulsamos Next para comenzar el asistente de creación del proyecto:
Debemos darle un nombre al proyecto, y un directorio donde guardar su contenido. Desmarcaremos la casilla Use default para poder elegir el directorio que queramos, y seleccionaremos como directorio del proyecto el directorio que hemos creado previamente con WTK. Pulsamos Next para continuar con el asistente.
Debemos especificar los directorios donde guardar los fuentes del proyecto,
y donde se guardarán las clases compiladas. Como directorio de fuentes
seleccionaremos el subdirectorio src
del directorio de nuestro
proyecto, si no estuviese seleccionado ya. Como directorio de salida podemos
especificar el directorio classes
.
Ahora pasamos a la pestaña Libraries de esta misma ventana.
En ella por defecto tendremos las librerías de J2SE. Como no queremos
que se utilicen estas librerías en nuestra aplicación, las eliminaremos
de la lista, y añadiremos la librería de la API MIDP. Para ello
pulsaremos el botón Add External JARs y seleccionaremos
el JAR de MIDP, ubicado normalmente en el directorio ${WTK_HOME}/lib/midpapi.zip
.
Si quisiéramos utilizar otras APIs en nuestra aplicación, como
MMAPI o APIs propietarias, seguiremos el mismo proceso para añadir sus
correspondientes ficheros JAR a la lista.
Como no vamos a utilizar Eclipse para compilar, estas librerías nos servirán simplemente para que Eclipse pueda autocompletar el código que escribamos y detectar errores. Una vez hemos terminado pulsaremos Finish con lo que terminaremos de configurar el proyecto en Eclipse.
Ahora podemos empezar a crear las clases de nuestra aplicación. Para ello pulsaremos sobre New y elegiremos crear una nueva clase Java, con lo que se abrirá la siguiente ventana de creación de la clase:
Aquí deberemos introducir el paquete al que pertenecerá la clase,
y el nombre de la misma. También debemos indicar la superclase y las
interfaces que implementa la clase que vayamos a crear. En caso de querer crear
un MIDlet, utilizaremos como superclase la clase MIDlet
. Si dejamos
marcada la casilla Inherited abstract methods, nos creará
el esqueleto de la clase con los métodos definidos como abstractos en
la superclase que debemos rellenar como vemos a continuación:
Aquí podremos introducir el código necesario en los métodos que nos ha creado. Junto al editor de código encontramos el explorador de paquetes que tiene el siguiente aspecto:
Aquí podemos ver la estructura de directorios de nuestro proyecto, los paquetes y las clases de nuestra aplicación, y las librerías utilizadas.
Una vez hayamos creado todas las clases necesarias desde Eclipse, y hayamos escrito el código fuente, deberemos volver a WTK para compilar y ejecutar nuestra aplicación.
Integracción con Antenna
Para no tener que utilizar dos herramientas por separado (WTK y Eclipse), podemos aprovechar la integración de ant con Eclipse para compilar y ejecutar las aplicaciones J2ME utilizando las tareas de Antenna.
Para poder utilizar estas tareas deberemos configurar Antenna dentro de Eclipse, para lo cual debemos ir a Window > Preferences, y dentro de la ventana de preferencias seleccionar las preferencias de Runtime de Ant:
Aquí deberemos añadir como entrada adicional de classpath el fichero JAR de Antenna. Una vez hecho esto podremos utilizar las tareas de Antenna dentro de los ficheros de ant.
NOTA: Para que ant funcione correctamente desde dentro de Eclipse
es necesario añadir al classpath de ant (Runtime classpath
de la ventana anterior) la librería tools.jar
que podemos
encontrar dentro del directorio ${JAVA_HOME}$/lib
.
Ahora tenemos que crear el fichero de ant. Para ello seleccionamos
New > File, para crear un fichero genérico. Llamaremos
al fichero build.xml
, y escribiremos en él todas las tareas
necesarias para compilar y ejecutar la aplicación, como vimos en el punto
de Antenna. Una vez escrito este fichero lo grabaremos.
Ahora debemos ir al panel de Ant dentro de Eclipse. Si no tenemos este panel iremos a Window > Show view para mostrarlo. Dentro de este panel pulsaremos sobre el botón para añadir un buildfile, seleccionando el fichero que acabamos de crear, y una vez añadido veremos en ese panel la lista de los posibles objetivos que hay definidos en el fichero. Podremos desde este mismo panel ejecutar cualquiera de los objetivos, pudiendo de esta forma compilar y ejecutar la aplicación directamente desde el entorno.
EclipseME
EclipseME es un plugin realizado por terceros que nos facilitará la creación de aplicaciones J2ME desde Eclipse. En el momento de la escritura de este texto sólo se encuentra disponible una versión preliminar de este plugin que tiene todavía algunos bugs y limitaciones.
Lo primero que debemos hacer es instalar el plugin, descomprimiéndolo
en el directorio ${ECLIPSE_HOME}/plugins
. Una vez hecho esto, deberemos
reiniciar el entorno, y entonces deberemos ir a Window > Preferences
para configurar el plugin:
En el apartado de configuración de J2ME, deberemos especificar el directorio donde tenemos instalado WTK, además del subdirectorio donde queremos que guarde las clases compiladas y preverificadas que se generen.
Una vez configurado, podremos pulsar sobre New, donde encontraremos disponibles asistentes para crear aplicaciones J2ME:
Lo primero que haremos será crear la suite (proyecto). Seleccionamos J2ME Midlet Suite y pulsamos Next para comenzar con el asistente de creación de la suite J2ME:
Deberemos darle un nombre al proyecto que estamos creando. En este caso podemos utilizar el directorio por defecto, ya que no vamos a utilizar WTK para construir la aplicación, la construiremos directamente desde Eclipse. Una vez asignado el nombre pulsamos sobre Next para ir a la siguiente ventana:
Aquí podemos elegir la versión de MIDP para la que queremos programar, siempre que tengamos instalado el WTK correspondiente para cada una de ellas. En el caso de MIDP 2.x podremos incluir las APIs adicionales WMA y MMAPI. Una vez elegida la versión para la que queremos desarrollar, pulsamos Next y se mostrará la siguiente ventana:
En este caso no hace falta que especifiquemos las librerías de forma manual, ya que el asistente las habrá configurado de forma automática. Podemos dejar los datos tal como vienen por defecto y pulsar Finish para terminar de crear el proyecto.
Una vez creado el proyecto, podremos añadir MIDlets u otras clases Java. Si queremos crear un MIDlet, podremos utilizar directamente la opción New > J2ME Midlet, con lo que se mostrará la siguiente ventana para introducir los datos del MIDlet:
Aquí deberemos dar el nombre del paquete y el nombre de la clase de nuestro MIDlet. Pulsando sobre Finish creará el esqueleto de la clase correspondiente al MIDlet, donde nosotros podremos insertar el código necesario.
En el explorador de paquetes podemos ver las clases creadas, la librería utilizada y el fichero JAD del proyecto. Pinchando sobre el fichero JAD se mostrará en el editor la siguiente ficha con los datos de la suite:
Aquí deberemos introducir la información necesaria, sobre los datos de la suite (Required) y los MIDlets que hayamos creado en ella (en la pestaña Midlets).
Para compilar el proyecto deberemos pulsar con el segundo botón del ratón sobre el nombre del proyecto en el explorador de paquetes, y seleccionar J2ME > Preverify:
Una vez compilado ya sólo nos queda ejecutar la aplicación en un emulador para comprobar que funciona correctamente. Para ello pulsaremos sobre la opción Run... que nos mostrará la siguiente ventana:
En esta ventana pulsaremos sobre Wireless Toolkit Emulator y sobre New para crear una nueva configuración de ejecución sobre los emuladores de J2ME. Dentro de esta configuración podremos seleccionar el emulador dentro de la pestaña Device, y una vez seleccionado ya podremos pulsar sobre Run para ejecutar la aplicación.
Con Eclipse hemos visto un entorno bastante ligero para la escritura del código. Vamos a ver ahora un entorno más completo también de libre distribución. Se trata de NetBeans, versión de libre distribución del entorno de Sun Forte for Java, también conocido como Sun One Studio.
NetBeans además del editor integrado de código, nos permitirá crear la GUI de las aplicaciones de forma visual, crear elementos para aplicaciones J2EE, como servlets, JSPs y beans, manejar conexiones a BDs, e integra su propio servidor de aplicaciones para poder probar las aplicaciones web entre otras cosas. El contar con todas estas características le hace ser un entorno bastante más pesado que el anterior, que necesitará un mayor número de recursos para ejecutarse correctamente.
Al igual que Eclipse, el editor también nos permite autocompletar el código, colorea la sintaxis para una mayor claridad y detecta algunos fallos conforme vamos escribiendo.
Respecto a las aplicaciones MIDP, podemos encontrar plugins oficiales para desarrollar este tipo de aplicaciones desde el entorno. Además, incluirá un depurador (debugger) con el que podremos depurar las aplicaciones para móviles, cosa que no podemos hacer simplemente con WTK o con Eclipse.
Tenemos una serie de plugins para añadir los asistentes y soporte necesario para los componentes MIDP y para instalar una versión de WTK integrada en el mismo entorno, por lo que no necesitaríamos instalar una versión externa. También disponemos de plugins con distintos ofuscadores, que podemos instalar de forma opcional, de forma que podamos ofuscar el código desde el mismo entorno.
Una vez instalados estos plugins, pulsando sobre New... podemos crear diferentes elementos para las aplicaciones MIDP:
Vamos a comenzar creando la suite. Para ello seleccionamos MIDletSuite y pulsamos sobre Next para continuar con el asistente de creación de la suite:
Debemos especificar un nombre para la suite. Escribiremos el nombre que queramos y pulsamos sobre Next para pasar a la siguiente ficha:
Aquí podremos crear nuestro MIDlet principal para incluir en la suite si no tenemos ningún MIDlet creado todavía. Existen diferentes plantillas para MIDlets, que introducen cierta parte del código por nosotros. Podemos seleccionar la plantilla MIDlet si queremos que se genere el esqueleto vacío de un MIDlet, o HelloMIDlet si queremos que se genere un MIDlet de ejemplo que contenga el código para mostrar el mensaje "Hola mundo", cosa que nos puede servir para probar estas aplicaciones sin tener que introducir código fuente nosotros. Deberemos además darle un nombre al MIDlet que creemos, que debe constar del nombre del paquete y nombre de la clase. Pulsamos sobre Next para continuar:
Ahora deberemos introducir el nombre que queremos darle al MIDlet, y de forma opcional el icono con el que se identificará el MIDlet. Una vez hecho esto ya podremos pulsar sobre Finish con lo que habremos terminado de crear la suite. Podremos ver en el explorador de NetBeans los elementos que se han creado.
Dentro del entorno tenemos tres pestañas como las siguientes:
Para editar el código utilizaremos la vista de edición, teniendo seleccionada la primera pestaña (Editing). La segunda (GUI Editing) nos servirá para crear de forma visual la GUI de las aplicaciones AWT y Swing, por lo que no nos servirá para el desarrollo de aplicaciones J2ME. La tercera (Debugging) la utilizaremos cuando estemos depurando el código, tal como veremos más adelante.
Vamos a ver como trabajar en vista de edición para editar y probar nuestra aplicación. En esta vista se mostrará en la parte izquierda de la pantalla el explorador, donde podemos ver los elementos que hemos creado:
Haciendo doble click sobre el elemento correspondiente a la suite podremos modificar sus propiedades. Se abrirá la siguiente ventana:
Aquí podremos modificar la lista de MIDlets que vamos a incluir en la suite. En la pestaña Jar Contents podremos seleccionar todos los elementos que vamos a introducir en el JAR de la suite, como recursos, clases y librerías externas.
En la parte inferior el explorador tenemos el inspector de propiedades, donde podemos consultar o modificar las propiedades del elemento seleccionado actualmente en el explorador. Si tenemos seleccionado el elemento correspondientes a la suite, veremos las siguientes propiedades:
Aquí podremos modificar distintas propiedades de la suite,
correspondientes a los datos que se incluirán en los ficheros JAD y MANIFEST.MF
.
Además, en la pestaña Execution podremos seleccionar
el emulador en el que se va a ejecutar esta suite cuando la probemos.
Tendremos disponibles los mismos emuladores que contenga el WTK, y podremos
especificar la versión de WTK de la que queremos que coja los emuladores.
Para ejecutar la suite en el emulador pulsaremos con el botón derecho sobre el elemento correspondiente a dicha suite en el explorador, y seleccionamos la opción Execute, con lo que la ejecutará en el emulador seleccionado:
Otra forma de ejecutar la suite es, teniendo seleccionada la suite en el explorador, pulsar el botón de ejecución (ó F6):
Depuración
En lugar de simplemente ejecutar la aplicación para probarla, si queremos localizar fallos en ella, podemos utilizar el depurador que lleva integrado NetBeans. Podemos establecer puntos de ruptura (breakpoints) en el código para que cuando la ejecución llegue a ese lugar se detenga, permitiéndonos ejecutar paso a paso y ver detenidamente lo que ocurre. Para establecer un punto de ruptura pincharemos sobre la banda gris a la izquierda de la línea donde queremos que se detenga, quedando marcada de la siguiente forma:
Para ejecutar la aplicación en modo depuración utilizaremos los siguientes botones:
El primero de ellos nos servirá para comenzar la ejecución hasta que llegue un punto de ruptura. Una vez se produzca se detendrá el programa y podremos ir ejecutando instrucciones paso a paso utilizando el botón correspondiente en la barra de botones anterior. Se mostrará con una flecha verde la línea que se va a ejecutar en cada momento, como se muestra a continuación:
Mientras se ejecuta el programa podemos ver el estado de la memoria y de las llamadas a métodos en la ventana del depurador. Para ello tendremos que estar en vista de depuración (pestaña Debugger del entorno). Veremos la siguiente información:
Aquí podremos ver los valores que toma cada variable conforme se ejecuta el código, lo cual nos facilitará la detección de fallos en nuestro programas.
Librerías adicionales
Las librerías que se utilizan al compilar y ejecutar las aplicaciones MIDP son las librerías que aporte el emulador seleccionado, al igual que ocurría con WTK. Sin embargo, conforme editamos el código sólo cuenta con que estemos utilizando la API de MIDP básica, por lo que todos los elementos que incluyamos de librerías adicionales nos los marcará como erróneos, y no nos permitirá autocompletar los nombres para ellos.
Para que reconozca estos elementos correctamente deberemos añadir estas librerías a los sistemas de ficheros montados en el entorno. Para ello seleccionamos montar un sistema de ficheros desde un archivo, como vemos en la siguiente figura, de forma que nos permita seleccionar el fichero JAR correspondiente a la librería que queremos añadir.
Una vez montada la librería JAR, podremos verla en el explorador. Ahora considerará que esa librería está en el classpath y nos permitirá utilizar sus elementos en el editor de código sin mostrar errores. Podremos navegar por los elementos de la librería dentro de explorador:
Esto será suficiente si la librería corresponde a una API disponible en el teléfono móvil, como puede ser MMAPI, WMA y APIs propietarias de Nokia.
Si lo que queremos es añadir una librería al fichero JAR de la aplicación para introducirla en el móvil junto a la aplicación, lo primero que haremos es montarla como acabamos de ver. Una vez montada, podemos ir a la ventana de edición de la suite como hemos visto antes (haciendo doble click sobre la suite), y en la pestaña Jar Contents podremos añadir las librerías montadas a nuestro JAR.
A parte de los entornos que hemos visto, existen numerosos IDEs para desarrollo con J2ME, la mayoría de ellos de pago. A continuación vamos a ver brevemente los más destacados.
Sun One Studio ME
Se trata de la versión ME (Micro Edition) del entorno de desarrollo de Sun, Sun One Studio, anteriormente llamado Forte for Java. Esta versión ME está dirigida a crear aplicaciones J2ME, e incluye todo el software necesario para realizar esta tarea, no hace falta instalar por separado el WTK ni otras herramientas.
El entorno es muy parecido a NetBeans. Podemos descargar una versión de prueba sin ninguna limitación. Una ventaja de este entorno es que podemos integrarlo con otros kits de desarrollo como por ejemplo el kit de desarrollo de Nokia.
JBuilder y MobileSet
Podemos utilizar también el entorno de Borland, JBuilder, con la extensión MobileSet. A partir de la versión 9 de JBuilder tenemos una edición Mobile para trabajar con aplicaciones J2ME directamente sin tener que instalar ninguna extensión. Podemos descargar de forma gratuita la versión personal del entorno JBuilder, pero tiene el inconveniente de estar bastante más limitada que las versiones de pago.
Este entorno puede también integrarse con el kit de desarrollo de Nokia. Además como característica adicional podremos crear de forma visual la GUI de las aplicaciones móviles. Esta característica no está muy extendida por este tipo de entornos debido a la simplicidad de las GUIs para móviles.
JDeveloper y J2ME Plugin
El entorno de desarrollo de Oracle, JDeveloper, está dedicado principalmente a la creación de aplicaciones J2EE, permitiéndonos crear un gran número de componentes Java, como servlets, JSPs, EJBs, servicios web, etc. Para facilitar la tarea de creación de estos componentes, automatizando todo lo posible, utiliza APIs propietarias de Oracle.
Podemos trabajar directamente en vista de diseño, utilizar distintos patrones de diseño para desarrollar las aplicaciones web, etc. Tiene integrado un servidor de aplicaciones propio para probar las aplicaciones en modo local, y nos permite establecer conexiones a BDs y a servidores de aplicaciones para realizar el despliegue de estas aplicaciones.
Aunque está principalmente dedicado para aplicaciones web con J2EE, también podemos utilizarlo para aplicaciones J2SE. Además también podemos encontrar un plugin para realizar aplicaciones J2ME, permitiéndonos crear MIDlets y suites mediante asistentes, y ejecutar las aplicaciones directamente en emuladores.
Podemos descargar de forma gratuita una versión de prueba de este entorno de la web sin limitaciones.
Websphere Studio Device Developer
Se trata de un entorno de IBM basado en Eclipse, por lo que tiene una interfaz similar. Este entorno esta dedicado a la programación de aplicaciones para dispositivos móviles. Integra los asistentes necesarios para la creación de los componentes de aplicaciones MIDP, así como las herramientas de desarrollo necesarias y nos permite probar la aplicación directamente en emuladores desde el mismo entorno.
Podemos encontrar en la web una versión de prueba sin limitaciones para descargar.
Codewarrior Wireless Studio
Este es otro entorno bastante utilizado también para el desarrollo de aplicaciones para móviles. Está desarrollado por Metrowerks y se puede encontrar disponible para un gran número de plataformas distintas. Existe una versión de evaluación limitada a 30 días de uso que puede ser encargada desde la web.