Проблемы версии MIDP 2.0: метод $ undefined для $type
Я написал мидлет, который выполняет несколько "продвинутых" задач: извлечение изображений из Интернета, изменение их размера, сохранение их на телефоне, их отображение.
Все это прекрасно работает в эмуляторе Nokia S60 3rd Edition FP1. Это устройство имеет поддержку MIDP 2.0 и CLDC 1.1 (также JSR75, который мне нужен для сохранения файлов). Он также работает как следует на Nokia E71 (физическое устройство).
Затем я попытался запустить мидлет на нескольких других эмуляторах. Один из них, DefaultCldcJtwiPhone2 из Java ME SDK 3.0, также заявляет о поддержке MIDP 2.0 и CLDC 1.1. Он не имеет JSR75, что объясняет, почему "FileConnection не может быть разрешен для типа".
Это, однако, не объясняет, почему List.deleteAll(), String.equalsIgnoreCase(String) и некоторые другие не определены.
Фактические ошибки, которые я получаю:
- Метод ceil(double) не определен для типа Math.
- Метод deleteAll () не определен для типа List
- Метод equalsIgnoreCase (String) не определен для типа String
- Метод getWidth() не определен для типа Displayable
Когда я смотрю на API MIDP 2.0 (т. Е. JSR118) ( http://java.sun.com/javame/reference/apis/jsr118/), я ясно вижу, что присутствуют все эти методы с тэгом "Since" быть либо MIDP 2.0 или CLDC 1.1.
Мой вопрос: почему эмулятор с поддержкой MIDP 2.0 не имеет доступа ко всем методам MIDP 2.0? Или, альтернативно, что я делаю не так?
4 ответа
Похоже, вы используете методы, определенные в 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. в: SDK 1.6.0_18 + eclipse ee 3.5.2 + Java_ME_platform_SDK_3.0.
Метод ceil(double) не определен для типа Math. Метод floor (double) не определен для типа Math. Метод abs (int) в типе Math не применим для аргументов (double). Метод sqrt(double) не определено для типа Math