我正在尝试在J2ME应用程序中使用java.util.TreeMap
。我知道J2SE上存在TreeMap
但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的闭源第三方库来说,这不是一个选项。
我终于设法使用the extension mechanism of Retrotranslator将这些引用更改为我自己的类,这是我在构建过程中已经使用的工具,但我的功能并不完全清楚。
我的J2SE库依赖于其他J2SE库,现在可以在J2ME上运行!
答案 0 :(得分:8)
答案 1 :(得分:3)
在这两种情况下你都是正确的 - CLDC1.0不包含NoClassDefFoundError(参见CLDC1.0 spec),你不可以创建自己的java。*类;请参阅上述答案中的链接。