J2ME non trova la mia implementazione di java.util.TreeMap
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!
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.