繁体   English   中英

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

[英]J2ME does not find my implementation of java.util.TreeMap

我在想什么

我正在尝试在J2ME应用程序中使用java.util.TreeMap 我知道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

在真实设备上,我得到"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)

我还确保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上运行!

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

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

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

你在两种情况下都是正确的 - CLDC1.0不包含NoClassDefFoundError(参见CLDC1.0规范 ),你也可以不创建自己的java。*类; 看到上面答案中的链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM