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!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top