我编写了一个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()
以及涉及double
和float
原语的任何内容)。请参阅完整的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");
}