MIDP 2.0版本问题:$type 的 $method 未定义
题
我编写了一个 MIDlet,它可以执行一些“高级”操作:从网络上获取图像,调整它们的大小,将它们保存在手机上,然后显示它们。
这一切在诺基亚 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/),我可以清楚地看到所有这些方法都存在,“since”标签是 MIDP 2.0 或 CLDC 1.1。
我的 问题:为什么支持 MIDP 2.0 的模拟器不能访问所有 MIDP 2.0 方法?或者,我做错了什么?
解决方案
听起来您正在使用 CLDC 1.1 中定义的方法;您使用的模拟器必须仅支持 CLDC 1.0(这肯定可以解释为什么缺少 equalsIgnoreCase()
以及任何涉及 double
和 float
原语)。查看完整的 API 这里. 。并看到 这里 查看 1.0 和 1.1 之间的差异列表。
编辑:检查设备 CLDC 版本的一些方法:
1) 按照描述检查 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");
}
其他提示
Eclipse 引用 cldc_1.0.jar 和 cldc_1.1.jar(以及 midp_2.0.jar 和 midp_2.1.jar)。
要解决这个问题:转至窗口 > 首选项 > Java ME > 设备管理 > 你的设备 > 编辑...> 库 > cldc_1.0.jar > 删除
您可以在这里找到更多详细信息: http://thompsonng.blogspot.com/2009/09/j2me-setting-eclipse-to-use-cldc-11.html
即使您选择了支持 CLDC-1.1 的模拟器设备(例如 DefaultCldcJtwiPhone2),您仍然可以将其配置为模拟仅 CLDC-1.0 的手机。
至少 Netbeans 上的项目属性是这样的。
今天(11/03/10)更新后我遇到了同样的问题:SDK 1.6.0_17 + eclipse ee 3.5.1 + Java_ME_platform_SDK_3.0 EA。到:SDK 1.6.0_18 + eclipse ee 3.5.2 + Java_ME_platform_SDK_3.0。
对于数学类型的类型,方法ceil(double)是未定义的。方法(double)对于类型数学的类型数学不确定。未定义的数学类型