我编写了一个MIDlet,它可以完成几项“高级”操作:从Web上获取图像,调整图像大小,将其保存在手机上,显示它们。

所有这些都可以在诺基亚S60第三版FP1仿真器中完美运行。该设备具有MIDP 2.0和CLDC 1.1支持(还有JSR75,我需要它才能保存文件)。它也可以在诺基亚E71(物理设备)上正常工作。

然后,我尝试在其他几个模拟器上运行MIDlet。其中之一,来自Java ME SDK 3.0的DefaultCldcJtwiPhone2,也要求MIDP 2.0和CLDC 1.1支持。它没有JSR75,这说明了为什么“无法将FileConnection解析为类型”。

但是,这不能解释为什么未定义List.deleteAll(),String.equalsIgnoreCase(String)和其他一些原因。

我得到的实际错误:


未为类型Math定义方法ceil(double)
类型List的方法deleteAll()未定义
未为类型String定义方法equalsIgnoreCase(String)
未为类型Displayable定义方法getWidth()


当我查看MIDP 2.0(即JSR118)API(http://java.sun.com/javame/reference/apis/jsr118/)时,我可以清楚地看到所有这些方法,其中“因为”标记是MIDP 2.0或CLDC 1.1。

我的问题:为什么支持MIDP 2.0的仿真器不能访问所有MIDP 2.0方法?或者,我在做什么错?

最佳答案

听起来好像您使用的是CLDC 1.1中定义的方法。您使用的仿真器必须仅支持CLDC 1.0(这肯定可以解释为什么缺少equalsIgnoreCase()以及涉及doublefloat原语的任何内容)。请参阅完整的API here。并参见here以获取1.0和1.1之间的差异列表。

编辑:
检查设备的CLDC版本的一些方法:

1)按照here所述检查microedition.configuration系统属性。

System.out.println("The CLDC version is:  " + System.getProperty("microedition.configuration"));


2)检查是否存在仅受1.1支持的类。

try {
    Class.forName("java.lang.ref.WeakReference");
    System.out.println("It's CLDC 1.1");
} catch (ClassNotFoundException e) {
    System.out.println("It's CLDC 1.0");
}

10-07 15:25