Проблемы с версией MIDP 2.0: $ method не определен для $ 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/), я ясно вижу, что все эти методы присутствуют, с тегом «с», который является либо MIDP 2.0, либо CLDC 1.1.

Мой вопрос: почему эмулятор с поддержкой MIDP 2.0 не имеет доступа ко всем методам MIDP 2.0? Или, как вариант, что я делаю не так?


person benvd    schedule 10.03.2010    source источник
comment
Вы используете IDE или просто Java ME SDK?   -  person michael aubert    schedule 10.03.2010
comment
Я использую Eclipse. Смотрите мой комментарий к вашему ответу.   -  person benvd    schedule 10.03.2010
comment
Я решил проблему. Итак, когда я изменил целевое устройство в дескрипторе приложения (файл конфигурации, может быть специфическим для среды Eclipse J2ME), эмулятор CLDC 1.1 не распознается как таковой. Оказывается, он работает правильно, когда я создаю новую конфигурацию отладки (или запуска), где я могу установить эмулятор на тот, который я хочу ...   -  person benvd    schedule 10.03.2010
comment
ошибка затмения? вы можете проверить, знают ли об этом уже ответственные лица.   -  person michael aubert    schedule 11.03.2010


Ответы (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");
}
person funkybro    schedule 10.03.2010
comment
Да, эти методы действительно являются частью CLDC 1.1, я знаю о различиях. Я упоминал, что эмуляторы, на которых я тестирую, поддерживают CLDC 1.1, поэтому у меня не должно быть этих проблем. Разве эмуляторы действительно поддерживают только CLDC 1.0 ...? - person benvd; 10.03.2010
comment
Я думаю, твой эму лжет! Ответ отредактирован, чтобы включить некоторые способы точного определения. - person funkybro; 10.03.2010
comment
Я создал новый проект и добавил строку System.getProperty, но она распечатала. Версия CLDC: CLDC-1.1. Попытка собрать мой настоящий проект с тем же эмулятором по-прежнему вызывает те же ошибки. - person benvd; 10.03.2010
comment
Displayable отсутствует в CLDC, не так ли? - person michael aubert; 10.03.2010
comment
Попытка собрать мой настоящий проект с тем же эмулятором по-прежнему вызывает те же ошибки. Значит, вы получаете ошибку при сборке, а не во время выполнения? - person funkybro; 10.03.2010
comment
Displayable.getWidth () - это MIDP2.0, а не 1.0. - person funkybro; 10.03.2010
comment
@QuickRecipesOnSymbianOS: нет, но он есть в MIDP @funkybro: Ага, при сборке. - person benvd; 10.03.2010

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

person epox_spb    schedule 22.07.2011

Даже после того, как вы выбрали устройство-эмулятор, поддерживающее CLDC-1.1, например DefaultCldcJtwiPhone2, вы все равно можете настроить его для эмуляции телефона только CLDC-1.0.

По крайней мере, так выглядят свойства проекта в Netbeans.

person michael aubert    schedule 10.03.2010
comment
Я использую Eclipse, но для моего проекта задана конфигурация CLDC 1.1, а в свойствах устройства также указано CLDC 1.1. - person benvd; 10.03.2010

У меня такая же проблема сегодня (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. Метод abs (int) в типе Math не применим для аргументов (double). Метод sqrt (double) - undefined для типа Math

person Bernardo    schedule 12.03.2010