4

我编写了一个 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 方法?或者,我做错了什么?

4

4 回答 4

1

听起来您正在使用 CLDC 1.1 中定义的方法;您正在使用的模拟器必须只支持 CLDC 1.0(这肯定会解释缺乏equalsIgnoreCase()和任何涉及doublefloat原语的东西)。在此处查看完整的 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");
}
于 2010-03-10T09:46:50.500 回答
1

Eclipse 引用了 cldc_1.0.jar 和 cldc_1.1.jar(以及 midp_2.0.jar 和 midp_2.1.jar)。

要修复它:转到 Window > Preferences > Java ME > Device Managment > your-device > Edit... > Libraries > cldc_1.0.jar > Remove

您可以在此处找到更多详细信息:http: //thompsonng.blogspot.com/2009/09/j2me-setting-eclipse-to-use-cldc-11.html

于 2011-07-22T08:31:58.363 回答
0

即使您选择了支持 CLDC-1.1 的仿真器设备,例如 DefaultCldcJtwiPhone2,您仍然可以将其配置为仿真仅 CLDC-1.0 的手机。

至少 Netbeans 上的项目属性是这样的。

于 2010-03-10T11:10:28.800 回答
0

我今天(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) 对于 Math 类型未定义 方法 floor(double) 对于 Math 类型未定义 Math 类型中的方法 abs(int) 不适用于参数 (double) 方法 sqrt(double) 是数学类型未定义

于 2010-03-12T01:32:16.757 回答