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

标签 java java-me midp treemap cldc

我在尝试什么

我正在尝试在 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. 开头的包中加载类。

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

参见 ClassLoader.defineClass() 的 JavaDoc了解详情。

关于java - J2ME 没有找到我的 java.util.TreeMap 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1293514/

相关文章:

java - ArrayList 可以在多线程环境中用于只读目的吗?

java - 如何在j2me中动态创建TextFields?

java - 适用于 Android 和 MIDP 的库?

blackberry - J2ME MIDlet 和黑莓 RIMlet 之间的基本区别是什么

java - 在Java ME中查找应用程序模式,是否空闲

java - 数组不适用于小句子

java - 如何使用printf以某种格式打印出来

java - Android或iPhone开发有必要学习J2ME吗?

java - 如何在 J2ME 中获取和设置 JSONObject , JSONArray

java - Java中类C++的友元类机制