Pergunta

O que estou tentando

Eu estou tentando usar java.util.TreeMap em um aplicativo J2ME. Eu sei que TreeMap está presente em J2SE, mas não com o J2ME, para que eu tenha feito alguns esforços para a porta do TreeMap J2SE 6.0 para J2ME 1.2 e incluiu-o na minha Jar Midlet. Esta metade portabilidade envolvido do quadro coleções, mas agora estou (teoricamente) feito com isso e quero testá-lo.

O erro

Mas quando eu começar o meu aplicativo em um emulador 3.0 SUN J2ME SDK (DefauldClclPhone2) eu recebo esta exceção:

  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

Em um dispositivo real eu obter "Error in Application" mas não pode ver a exceção real porque eu não tenho o SDK correspondente no momento.

O que é tão stange sobre esse erro

Estou intrigado com o fato de que minha candidatura passou com sucesso o processo de pré-verificação. Eu sempre experientes que uma classe que falta (e eu tive muitos deles há alguns dias) desencadeia um erro no preverifier. Então eu concluí que após bem sucedida pré-verificação não pode haver qualquer NoClassDefFoundError no dispositivo.

Detalhes

A estrutura de diretórios dentro de meu jar parece com isso:

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)

Eu também a certeza que TreeMap.class é no formato de arquivo 1.2 classe Java.

Eu sou alvo CDLC 1.0 e MIDP 1.0, assim que meu preverifier está usando o classpath ${wtk.home}/lib/cldc_1.0.jar, ${wtk.home}/lib/midp_1.0.jar

Apenas um pensamento: Existe algum cheque especial no carregador de classe J2ME que o impede de carregar um java.util.* ou classe java.lang.* a partir de um frasco aplicação? Eu nunca ouvi falar disso, mas talvez eles fizeram algo assim como um recurso de segurança?

Conclusão e Solução

Como Joachim Sauer apontou, o carregador de classe não irá carregar classes no java.* se eu os definiu. Então eu tive que movê-los para outro pacote, na verdade, a com.companyname.j2meport.java.util. Enquanto meu próprio código poderia então importar essas classes de lá, isso não é uma opção para-código fechado de Terceiros-libs que se referem a java.util.TreeMap.

Eu finalmente consegui alterar estas referências a minhas próprias classes usando o mecanismo de extensão de Retrotranslator , uma ferramenta que eu já estava usando no meu processo de construção, mas de cujas capacidades não estava plenamente consciente.

A minha biblioteca J2SE, que possui dependências em outras bibliotecas J2SE, agora funciona com J2ME!

Foi útil?

Solução

Apenas o bootloader do bootstrap pode carregar classes de pacotes que começam com java..

Isto significa que você terá que mover a sua classe em outro pacote.

Veja o JavaDoc de ClassLoader.defineClass () para mais detalhes.

Outras dicas

Você tem razão em ambos os casos - CLDC1.0 não inclui NoClassDefFoundError (veja o CLDC1.0 especificação ), e não, você não pode criar o seu próprio java * classes.; veja o link na resposta acima.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top