J2ME没有找到我的java.util.TreeMap实现

Len*_*mel 4 java midp cldc treemap java-me

我在想什么

我正在尝试java.util.TreeMap在J2ME应用程序中使用.我知道它TreeMap存在于J2SE上但不存在于J2ME上,所以我已经做了一些努力将J2SE 6.0移植TreeMap到J2ME 1.2并将其包含在我的Midlet Jar中.这涉及移植一半的集合框架,但现在我(理论上)完成了它并想要测试它.

错误

但是当我在SUN J2ME SDK 3.0模拟器(DefauldClclPhone2)上启动我的应用程序时,我得到以下异常:

  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
Run Code Online (Sandbox Code Playgroud)

在我得到的真实设备上"Error in Application"但看不到实际的异常,因为我现在没有匹配的SDK.

什么是关于这个错误的东西

我的应用程序成功地经历了预验证过程,我感到很困惑.我总是经历过一个缺失的课程(前几天我有很多课程)在预验证器中触发错误.所以我得出结论,在成功预先验证之后NoClassDefFoundError,设备上就没有任何东西了.

细节

我的jar里面的目录结构如下:

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)
Run Code Online (Sandbox Code Playgroud)

我还确保它TreeMap.class是Java 1.2类文件格式.

我的目标是CDLC 1.0和MIDP 1.0,因此我的预验证程序正在使用类路径 ${wtk.home}/lib/cldc_1.0.jar, ${wtk.home}/lib/midp_1.0.jar

只是一个想法:在J2ME类加载器中是否有任何特殊检查阻止它从应用程序jar 加载一个java.util.*java.lang.*类?我从来没有听说过,但也许他们做过这样的安全功能?

结论和解决方案

正如Joachim Sauer所指出的,java.*如果我定义了类加载器,那么类加载器将不会加载类.所以我不得不将它们移到另一个包中,实际上是com.companyname.j2meport.java.util.虽然我自己的代码可以从那里导入这些类,但对于引用java.util.TreeMap的闭源第三方库来说,这不是一个选项.

我终于设法使用Retrotranslator的扩展机制将这些引用更改为我自己的类,Retrotranslator是我在构建过程中已经使用的工具,但我的功能并不完全清楚.

我的J2SE库,依赖于其他J2SE库,现在可以在J2ME上运行!

Joa*_*uer 8

只有引导程序引导程序可以从以...开头的程序包加载类java..

这意味着您必须将您的班级移动到另一个包中.

有关详细信息,请参阅ClassLoader.defineClass()的JavaDoc .