我编写了一个 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() 以及任何涉及 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");
}

其他提示

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)对于类型数学的类型数学不确定。未定义的数学类型

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top