Domanda

Quello che sto cercando

Sto cercando di utilizzare java.util.TreeMap in un'applicazione J2ME. So che TreeMap è presente su J2SE, ma non sulla base del J2ME, così ho fatto alcuni sforzi per porto TreeMap J2SE 6.0 per J2ME 1.2 e incluso nel mio Midlet Jar. Ciò ha comportato il porting la metà del quadro collezioni, ma ora sono (teoricamente) fatto con questo e vogliono provarlo.

L'errore

Ma quando inizio la mia applicazione su un emulatore 3.0 SUN J2ME SDK (DefauldClclPhone2) ottengo questa eccezione:

  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

In un dispositivo vero e proprio ottengo "Error in Application" ma non riesco a vedere l'eccezione reale, perché non ho l'SDK corrispondente al momento.

Cosa c'è di così Stange su tale errore

Sono perplesso dal fatto che la mia domanda ha subito con successo il processo preverification. Ho sempre sperimentato che una classe mancante (e ho avuto molti di loro qualche giorno fa) innesca un errore nel preverifier. Così ho concluso che, dopo preverification successo non ci può essere alcun NoClassDefFoundError sul dispositivo.

Dettagli

La struttura di directory all'interno del mio vaso simile a questo:

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)

Ho anche fatto in modo che TreeMap.class è nel formato di file Java 1.2 di classe.

ho scelto come target CDLC 1.0 e MIDP 1.0, quindi il mio preverifier sta usando il ${wtk.home}/lib/cldc_1.0.jar, ${wtk.home}/lib/midp_1.0.jar classpath

Solo un pensiero: C'è un controllo particolare nel classloader J2ME che impedisce il caricamento di una java.util.* o classe di java.lang.* da un vaso di applicazione? Non ho mai sentito parlare di questo, ma forse hanno fatto qualcosa di simile a questo come una caratteristica di sicurezza?

Conclusione e soluzione

Come Joachim Sauer ha sottolineato, il programma di caricamento classe non verrà caricato classi java.* se li ho definito. Così ho dovuto spostare loro di un altro pacchetto, in realtà per com.companyname.j2meport.java.util. Mentre il mio codice potrebbe quindi importare quelle classi da lì, questo non è un'opzione per closed-source di terze parti-libs che si riferiscono a java.util.TreeMap.

sono finalmente riuscito a modificare tali riferimenti alle mie classi utilizzando il meccanismo di estensione di Retrotranslator , uno strumento che utilizzava già nel mio processo di compilazione, ma della cui capacità non ero pienamente consapevole.

La mia biblioteca J2SE, che ha dipendenze da altre librerie J2SE, ora gira su J2ME!

È stato utile?

Soluzione

Solo il bootloader bootstrap può caricare classi dai pacchetti che iniziano con java..

Questo significa che si dovrà spostare la classe in un altro pacchetto.

Vedere la JavaDoc di ClassLoader.defineClass () per i dettagli.

Altri suggerimenti

Hai ragione in entrambi i casi - CLDC1.0 non include NoClassDefFoundError (vedere la CLDC1.0 spec ), e non si può non creare il proprio java * classi.; vedere il collegamento nella risposta precedente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top