我在尝试什么
我正在尝试在 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
在真实设备上,我收到“应用程序错误”
,但看不到实际的异常,因为我现在没有匹配的 SDK。
那个错误有什么奇怪的地方
令我感到困惑的是,我的申请已成功通过预验证流程。我总是遇到缺少类(几天前我有很多类)会在预 validator 中触发错误。所以我得出结论,在成功预验证之后,设备上不会有任何 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,所以我的预 validator 使用类路径 ${wtk.home}/lib/cldc_1.0.jar, ${wtk.home}/lib/midp_1.0 .jar
只是想一想:在 J2ME 类加载器中是否有任何特殊检查阻止它从一个类加载 java.util.*
或应用程序 jar ?我从没听说过,但也许他们做了类似的事情作为安全功能?
结论与解决方案
正如 Joachim Sauer 所指出的,如果我在 java.*
中定义了类加载器,类加载器将不会加载它们。所以我不得不将它们移动到另一个包,实际上是 com.companyname.j2meport.java.util
。虽然我自己的代码可以从那里导入这些类,但这不是引用 java.util.TreeMap 的闭源第三方库的选项。
我终于设法使用 the extension mechanism of Retrotranslator 将这些引用更改为我自己的类,我已经在我的构建过程中使用了一个工具,但我并不完全了解它的功能。
我的 J2SE 库依赖于其他 J2SE 库,现在可以在 J2ME 上运行!
最佳答案
关于java - J2ME 没有找到我的 java.util.TreeMap 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1293514/