J2ME no encuentra mi implementación de java.util.TreeMap
Pregunta
Lo que estoy tratando
Estoy tratando de utilizar java.util.TreeMap
en una aplicación J2ME. Sé que TreeMap
está presente en J2SE, pero no en J2ME, así que he hecho algunos esfuerzos para portar la TreeMap
J2SE 6.0 a 1.2 J2ME y la incluí en mi tarro MIDlet. Esto implicó portar mitad del marco de las colecciones, pero ahora estoy (en teoría) hacer con eso y quieren probarlo.
El error
Pero cuando comienzo mi aplicación en un sol J2ME SDK 3.0 emulador (DefauldClclPhone2) consigo esta excepción:
java.lang.NoClassDefFoundError: java/util/TreeMap
java.lang.Class.invoke_verify(), bci=0
java.lang.Class.initialize(), bci=117
com.companyname.test.TestMidlet.<init>(), bci=19
java.lang.Class.newInstance(), bci=0
com.sun.midp.main.CldcMIDletLoader.newInstance(), bci=46
com.sun.midp.midlet.MIDletStateHandler.createMIDlet(), bci=66
com.sun.midp.midlet.MIDletStateHandler.createAndRegisterMIDlet(), bci=17
com.sun.midp.midlet.MIDletStateHandler.startSuite(), bci=27
com.sun.midp.main.AbstractMIDletSuiteLoader.startSuite(), bci=52
com.sun.midp.main.CldcMIDletSuiteLoader.startSuite(), bci=8
com.sun.midp.main.AbstractMIDletSuiteLoader.runMIDletSuite(), bci=161
com.sun.midp.main.AppIsolateMIDletSuiteLoader.main(), bci=26
En un dispositivo real consigo "Error in Application"
pero no puedo ver la Excepción real, porque no tengo el SDK juego en este momento.
¿Qué es tan Stange sobre ese error
Estoy desconcertado por el hecho de que mi solicitud fue sometido con éxito el proceso de verificación previa. Siempre experimentado que una clase que falta (y he tenido muchos de ellos hace unos días) provoca un error en el preverifier. Así que llegué a la conclusión de que después de verificación previa exitosa no puede haber ninguna NoClassDefFoundError
en el dispositivo.
Detalles
La estructura de directorios dentro de mi frasco se ve así:
test.jar
com
companyname
(my application classes, including the Midlet class)
java
lang
Comarable.class
Iterable.class
(some others which are missing on J2ME)
util
TreeMap.class
TreeSet.class
(many others which are missing on J2ME)
También se aseguró de que TreeMap.class
está en el formato de archivo de Java 1.2 clase.
Estoy focalización CDLC 1.0 y MIDP 1.0, por lo que mi preverifier está utilizando la ruta de clase ${wtk.home}/lib/cldc_1.0.jar, ${wtk.home}/lib/midp_1.0.jar
Es sólo una idea: ¿Hay alguna comprobación especial en el cargador de clases J2ME que evita que la carga de una clase o java.util.*
java.lang.*
de un tarro de aplicación? Nunca oí hablar de eso, pero tal vez hice algo así como una característica de seguridad?
Conclusión y la solución
Como Joachim Sauer señaló, el cargador de clases no se carga en clases java.*
si los definió. Así que tuve que moverlos a otro paquete, en realidad a com.companyname.j2meport.java.util
. Si bien mi propio código podría entonces importar las clases a partir de ahí, esto no es una opción para de código cerrado de terceros-libs que se refieren a java.util.TreeMap.
fin logré cambiar estas referencias a mis propias clases utilizando el mecanismo de extensión de Retrotranslator , una herramienta que ya se estaba usando en mi proceso de construcción, pero de cuyas capacidades no estaba totalmente consciente.
Mi biblioteca de J2SE, que tiene dependencias en otras bibliotecas J2SE, ahora trabaja en J2ME!
Solución
Sólo el gestor de arranque de arranque puede cargar las clases de los paquetes que comienzan con java.
.
Esto significa que usted tendrá que mover su clase en otro paquete.
Ver el JavaDoc de ClassLoader.defineClass () para más detalles.
Otros consejos
Tiene usted razón en ambos casos - CLDC1.0 no incluye NoClassDefFoundError (ver el CLDC1.0 especificación ), y no es probable que no crear su propio java * clases.; ver el enlace en la respuesta anterior.