Платформа программирования J2ME для портативных устройств

         

CDC предназначена для стационарных



Рисунок 1.3. CDC предназначена для стационарных устройств с фиксированным соединением и общим доступом. CLDC предназначена для персональных мобильных устройств с ограниченным соединением



CLDC является подгруппой CDC Ни



Рисунок 1.2. CLDC является подгруппой CDC. Ни CLDC, ни CDC, однако, не являются полностью подгруппами платформы J2SE, поскольку обе эти конфигурации добавляют новые классы, необходимые для создания служб в соответствующих семействах устройств


Как и CDC, CLDC определяет требуемый уровень поддержки языка программирования Java, требуемую функциональную поддержку соответствующей требованиям виртуальной машины Java и требуемый набор библиотек классов.

Поддержка языка Java. Спецификация CLDC не включает поддержку следующих свойств языка Java:

вычисления с плавающей точкой; финализация объекта; иерархия класса Java.lang.Error во всей его полноте.

Конечно, эти свойства включают также VM и описаны в главе 5 о спецификации CLDC («Adherence to Java Virtual Machine Specification» - «Соблюдение спецификации виртуальной машины Java»). Я, однако, ссылаюсь на них здесь, поскольку они проявляются на уровне языка, что затрагивает программистов.

Отсутствие поддержки плавающей точки является основным отличием на языковом уровне виртуальной машины Java, которая поддерживает CLDC, от стандартной VM J2SE, что очевидно для программистов. Это означает, что программы, предназначенные для запуска на CLDC, не могут использовать константы, типы и величины с плавающей точкой. Вы не можете использовать встроенный тип float и класс Java.lang.Float был удален из библиотек CLDC. Это свойство не присутствует из-за отсутствия аппаратного или программного обеспечения с плавающей точкой на большинстве мобильных устройств.

Финализация объекта также отсутствует. Это означает, что метод Object.finalized был удален из библиотек CLDC.

Иерархия исключений Java.lang.Error также была удалена из библиотек CLDC и поэтому недоступна для приложений. Основная причина того, что обработка ошибок отсутствует, заключается в ограниченной памяти мобильных устройств. Это обычно не создает никаких неудобств при разработке приложений, как-никак, приложения не рассчитаны на восстановление из ошибочных состояний. И ресурсная цена реализации обработки ошибок высока и лежит за пределами возможностей сегодняшних мобильных устройств. Кроме того, нейтрализация ошибок на портативных устройствах, таких, как мобильные телефоны, зависит от конкретного устройства. И, наконец, не имеет смысла оговаривать механизм восстановления, который устройства должны использовать. Этот механизм легко может находиться за пределами встроенной виртуальной машины.

Поддержка виртуальной машины Java и библиотек. В CLDC определены требования для виртуальной машины Java. Они зависят от VM, которая высоко-портативна и создана для ресурсно ограниченных небольших устройств. Поддержка нескольких свойств, которые существуют в стандартной J2SE VM, была исключена из спецификации CLDC. В следующем списке перечислены свойства, которые не поддерживаются в CLDC-совместимой виртуальной машине. Свойства, перечисленные в этом списке, были исключены как из-за изменения библиотек, так и из-за соображений безопасности:

Java Native Interface (JNI, собственный интерфейс Java);

загрузчики определяемых пользователем классов; отражение (reflection); группы нитей и демоны нитей (thread daemons); финализация (отсутствие метода Object.finalizeQ в библиотеках CLDC); слабые ссылки (weak references); ошибки (поддерживается небольшая подгруппа ошибок J2SE); проверка класса файла.

Среди этих неподдерживаемых свойств проверка класса файла заслуживает дополнительного пояснения. Виртуальная машина в спецификации CLDC все еще выполняет этот процесс, но она использует двухшаговый процесс и отличный алгоритм, который требует меньшей затраты вычислительных ресурсов, чем стандартный J2SE верификатор. Кроме того, существует новый инструмент предварительной верификации, с которым вы познакомитесь в главе 2.

Виртуальная машина, которая устанавливается вместе с внедрением CLDC, называется Kilobyte Virtual Machine (KVM), названа она таким образом потому, что использует всего лишь несколько килобайт рабочей памяти. KVM не является полнофункциональной J2SE VM.

Спецификация свойств, которые поддерживает виртуальная машина, включает спецификацию библиотек, которые она поддерживает. Спецификация CLDC подробно описывает библиотеки, внедрение которых должно поддерживаться.

Как вы знаете, конфигурация является базой для одного или более профилей. CLDC -это конфигурация, поверх которой встраиваются один или более профилей таким же образом, как профиль Foundation встраивается поверх CDC Смысл заключается в том, что АРГи в профиле CLDC поддерживают разработку приложений для рынка персональных устройств массового потребления. Поэтому CLDC предназначена для разработчиков отдельных комплектующих приложений. Вот чем она отличается от CDC, которая предназначена для разработчиков OEM (комплектного оборудования).

В таблице 1.4 перечислены пакеты, которые включает в себя CLDC. Заметьте, что он значительно меньше, чем список пакетов, которые содержит CDC, показанный ранее в таблице 1.1.

Табпииа 1.4. Пакеты CLDC

Название пакета СШС

Описание

Java. io

Стандартные классы и пакеты ввода/вывода Java, подмножество пакета J2SE

Java . lang

Классы и интерфейсы VM, подмножество пакета J2SE

Java .util

Классы и интерфейсы стандартных утилит, подмножество пакета J2SE

javax.microedition. io

Классы и интерфейсы структуры общих соединений CLDC

Первые три пакета используют префикс Java, в своем имени, потому что каждый из них содержит подгруппу стандартных классов платформы J2SE. Последний, однако, должен использовать префикс javax., поскольку он описывает новое «стандартное расширение», которое не является частью основной платформы Java.

Профиль Mobile Information Device Profile. Поскольку категория, обслуживаемая CLDC, включает в себя такое множество различных типов персональных устройств, потенциально для их поддержки необходимо множество различных профилей. Наиболее популярным и хорошо известным из них является профиль Mobile Information Device (MIDP), иногда называемый MID Profile. MIDP лежит поверх CLDC и задает набор API пользовательского интерфейса (UI), созданного для современных беспроводных устройств.

Следуя традициям языка Java, MIDP-приложения называются MID-леты. МГО-лет является приложением Java, которое использует профиль MIDP и конфигурацию CLDC. Эта книга делает акцент на обучении вас тому, как писать MID-леты, поскольку подавляющее большинство программистов на J2ME будут сталкиваться с платформой CLDC/MIDP намного чаще, чем с другими платформами J2ME. И, с практической точки зрения, MIDP является единственным профилем, доступным на сегодняшний день.

Другой профиль, профиль PDA, в настоящее время находится на стадии описания. Профили PDA также принадлежат к общей категории мобильных информационных устройств. Однако профиль PDA, возможно, никогда не будет внедрен, поскольку сомнительно, предлагает ли он достаточно отличий и улучшений к спецификации MIDP, чтобы оправдать его разработку. Профиль PDA также ставит задачи портативности перед разработчиками.

Спецификация MIDP, как и профиль Foundation конфигурации CDC, была создана экспертной группой, в этом случае экспертной группой профиля Mobile Information Device Profile, которая является международным форумом, включающим представителей нескольких компаний со сферой деятельности в области мобильных устройств. MIDP предназначен для мобильных информационных устройств (mobile information device, MID), таких, как мобильные телефоны, двусторонние пейджеры и тому подобного, которые приблизительно соответствуют следующим характеристикам:

размер экрана примерно (как минимум) 96x54 пикселей; глубина экрана 1 бит; клавиатура для работы одной или двумя руками, устройство ввода с сенсорного экрана; 128 Кб энергонезависимой памяти для MIDP-компонентов; 8 Кб энергонезависимой памяти для данных постоянного хранения; 32 Кб энергозависимой оперативной памяти для области динамической памяти Jra: двусторонняя беспроводная связь.

Поскольку диапазон возможностей MID столь широк, MIDP устанавливает рабочую величину минимального общего знаменателя возможностей устройств. MIDP поэтому определяет следующие API:

приложения (семантика и управление приложениями MIDP); пользовательский интерфейс; постоянное хранение; организация сетей; таймеры.

В таблице 1.5. перечислены пакеты, которые содержит MIDP.



Конфигурации и профили



Конфигурации и профили

Конфигурация включает три базовых элемента:

набор свойств языка программирования Java; набор свойств виртуальной машины Java; набор поддерживаемых библиотек Java и программных интерфейсов приложения (API).

Создатели J2ME определили только две конфигурации для избежания фрагментированного представления несовместимых платформ. Две конфигурации, которые существуют в настоящее время, представляют две категории портативных устройств, описанных ранее в этой главе, а именно:

личные, не стационарно подключаемые мобильные устройства - поддерживаемые конфигурацией Connected, Limited Device Configuration (CLDC, конфигурация для подключенных ограниченных устройств); постоянно соединенные сетевые устройства - поддерживаемые конфигурацией Connected Device Configuration (CDC, конфигурация для подключенных устройств).

Теоретически конфигурация может устанавливать такую же поддержку, как и библиотеки платформы J2SE. Но на самом деле это маловероятно, потому что, как вы знаете, J2ME предназначена для устройств, которые намного менее мощны, чем настольные компьютеры.

Технические спецификации конфигурации требуют, чтобы все классы Java, адаптированные с J2SE, были идентичны или соответствующей подгруппой оригинального класса J2SE. То есть класс не может добавлять методы, которых нет в версии J2SE. Однако конфигурации могут включать дополнительные классы в свои спецификации, конфигурации сами по себе необязательно являются соответствующими подгруппами J2SE. Обе конфигурации, которые были определены под классы добавления данных, не представлены в J2SE для того, чтобы обращаться к атрибутам и ограничениям устройств.



Конфигурация Connected Device Configuration (CDC)



Конфигурация Connected Device Configuration (CDC)

Конфигурация Connected Device Configuration (CDC) предназначена лишь для фиксирования основных возможностей каждого вида устройств в категории устройств, для которой она предназначена, а именно, устройств с 2МБ или более полной памяти, включая как RAM, так и ROM.

Как вы видели на рисунке 1.1, конфигурация задает как набор поддерживаемых свойств виртуальной машины Java, так и набор библиотек классов. В CDC определено использование виртуальной машины полной платформы Java 2, которая, в этом контексте, называется компактной виртуальной машиной (Compact Virtual Machine (CVM)).

CVM. Хотя CVM поддерживает те же свойства, что и J2SE VM, она создана для потребительских и встраиваемых устройств. Это означает, что стандарт VM J2SE был модернизирован, чтобы соответствовать ограничениям устройств с ограниченными ресурсами. Сюда включены следующие свойства получившегося в результате продукта CVM:

улучшенная запоминающая система; небольшие временные интервалы сборки мусора в среднем; полное отделение виртуальной машины от системы памяти; модульные сборщики мусора; сборка мусора по поколениям.

В частности, CVM была спроектирована с учетом предоставления следующих свойств:

портативность; быстрая синхронизация; выполнение классов Java отдельно от постоянной памяти (ROM); поддержка естественных потоков; зоны обслуживания малых классов; предоставление интерфейсов и поддержка служб операционной системы реального времени (RTOS); преобразование потоков Java непосредственно в естественные потоки; поддержка всех свойств и библиотек виртуальной машины версии 1.3, Java 2: безопасность, слабые ссылки, Java Native Interface (JNI, собственный интерфейс Java), Remote Method Invocation (RMI, интерфейс вызова удаленных методов), Java Virtual Machine Debugging Interface (JVMDI, интерфейс отладки виртуальной машины Java).

Библиотеки классов в CDC. CDC устанавливает минимальный набор библиотек классов и API. Она поддерживает следующие стандартные пакеты Java:

java.lang — системные классы виртуальной машины Java; java.util — базовые утилиты Java; java.net — дейтаграмма Universal Datagram Protocol (UDP) и ввод/вывод (I/O); java.io — файловый ввод/вывод Java; Java.text — самая минимальная поддержка интернационализации (I18N — смотри главу 9); Java.security — минимальная защита на мелком уровне и шифрование сериализации объекта.

Как вы можете видеть, эти API не включают полный набор пакетов набора инструментальных средств разработки программного обеспечения (software development kit (SDK)) Java 2. В некоторых случаях эти пакеты и классы являются подгруппами пакетов и классов Java 2 SDK. Также убраны все устаревшие API J2SE. В таблице 1.1 перечислен полный набор пакетов, поддерживаемых CDC.



Конфигурация Connected Limited Device Configuration (CLDC)



Конфигурация Connected, Limited Device Configuration (CLDC)

Вторая из двух конфигураций J2ME, Connected, Limited Device Configuration (CLDC), поддерживает персональные мобильные устройства, которые составляют значительно менее мощный класс устройств, чем тот, который поддерживает CDC. Спецификация CLDC распознает устройства этой категории по следующим характеристикам:

от 160 до 512 KB полной памяти, доступной для платформы Java; 16-битный или 32-битный процессор; низкое потребление электроэнергии, часто питание от батарей; нестационарная сетевая связь (часто беспроводная) с потенциально ограниченной пропускной способностью.

Цель CLDC заключается в том, чтобы установить стандартную платформу Java для этих устройств. Из-за широкого выбора системного программного обеспечения на различных персональных устройствах CLDC исходит из минимальных предположений о среде, в которой она существует. Например, одна ОС может поддерживать множественные параллельные процессы, другая может или не может поддерживать файловую систему и тому подобное.

CLDC отличается от CDC и представляет из себя ее подгруппу. Однако эти конфигурации независимы друг от друга, так что они не должны использоваться вместе при описании платформы. На рисунке 1.2 показана связь между двумя конфигурациями и платформой J2SE.



Определение платформы Java для портативных устройств



Определение платформы Java для портативных устройств

Конфигурации и профили являются основными элементами, которые составляют модульную схему J2ME. Эти два элемента дают возможность поддержки огромного количества устройств, которые поддерживают J2ME.

Конфигурация J2ME определяет минимальную Java-платформу для семейства устройств. Все члены данного семейства имеют сходные требования к памяти и производительности. Конфигурация является на самом деле спецификацией, которая определяет доступные ресурсы системного уровня, такие, как набор свойств языка Java, характеристики и свойства имеющейся виртуальной машины и минимальные библиотеки Java, которые поддерживаются. Разработчики программного обеспечения могут рассчитывать, что определенный уровень системной поддержки будет доступен для семейства устройств, которое использует определенную конфигурацию.

Конфигурация также определяет минимальный набор свойств для категории устройств. Производители устройств внедряют профили для обеспечения реальной платформы для семейства устройств, которая имеет возможности, определяемые данной конфигурацией.

Другой строительный блок J2ME, профиль, определяет программный интерфейс для определенного класса устройств. Реализация профиля состоит из набора библиотек классов Java, которые обеспечивают интерфейс программного уровня. Таким образом, профиль теоретически должен определять все виды функциональных возможностей и служб.

Однако это не является намерением создателей. Создатели J2ME планируют, что профиль будет предназначаться для нужд определенной категории устройств или вертикального рынка, относящегося к этой категории устройств. Мысль заключается не в том, чтобы помещать огромное количество несвязанных свойств программного уровня в профиль. Скорее основная цель заключается в том, чтобы гарантировать возможность взаимодействия - которая необязательно предполагает совместимость конечных продуктов различных производителей - между всеми устройствами одной категории или семействами вертикального рынка для определения стандартной платформы разработки приложений на Java.

Например, профиль может поддерживать возможность сетевой коммуникации для популярного стандарта Short Message Service (SMS), широко используемого в мобильных телефонах. Поскольку стандарт SMS является повсеместно распространенным свойством в сотовой телефонии, имеет смысл задать эту службу в профиле, который предназначен для мобильных телефонов, вместо того чтобы встраивать ее в конфигурацию.

Профиль внедряется поверх конфигурации, на одну ступень ближе к выполнению практических приложений. Обычно профиль включает библиотеки, которые соответствуют более специфичным характеристикам категории устройств, которую они представляют, чем библиотеки, которые содержат конфигурации. Приложения затем встраиваются поверх конфигурации и профиля, они могут использовать только библиотеки классов, предоставляемые этими двумя низкоуровневыми спецификациями. Профили могут быть встроены поверх друг друга. Конечный продукт платформы J2ME, однако, может содержать только одну конфигурацию. На рисунке 1.1 показаны схематичные уровни, из которых состоит платформа J2ME.



Платформа J2ME состоит из ряда



Рисунок 1.1. Платформа J2ME состоит из ряда уровней, которые поддерживают базовую среду исполнения с корневыми библиотеками Java и Виртуальной машиной (VM), набора программных интерфейсов приложения системного уровня (API) в конфигурации и набора API программного уровня в профиле

До настоящего времени эти представления об определениях конфигураций, профилей и платформ были чем-то абстрактным, отвлеченным. В следующем разделе вы получите более конкретное описание характеристик реальных сред.



Системы управления приложениями устройств



Системы управления приложениями устройств

Все приложения J2ME - MID-леты и другие - являются настоящими приложениями Java, которые запускаются под контролем Java VM. Но что контролирует Java VM, например, на мобильном телефоне? Не существует командного процессора, с которого вы можете активизировать ваши любимые приложения Java, как вы можете сделать на рабочей станции. Запуск, остановка и управление приложениями Java контролируется программами управления приложениями {application management software, AMS), которые находятся на этом устройстве. В действительности AMS контролирует весь жизненный цикл приложения от установки, обновления и управления версиями до удаления программного обеспечения.

Производители устройств обычно предоставляют программное обеспечение AMS. Это самый логичный сценарий, потому что программное обеспечение AMS должно работать вместе с программным обеспечением родной системы устройства, которую, по всей видимости, производитель знает лучше всего. Тем не менее, производители комплектующего оборудования также могут разрабатывать системы AMS для определенных устройств. Программное обеспечение AMS может быть написано, например, в Java или некоторых других машинных языках, таких, как С. Понимание вопросов, связанных с управлением приложениями, важно для разработчика на J2ME. Управление приложениями описывается в главе 10. Вы должны знать о последствиях вашего выбора в отношении упаковки, лицензирования, загрузки для использования и так далее, и как эти решения повлияют на удобство, простоту использования и жизнеспособность вашего программного обеспечения.



Пакеты CDC


Название пакета CDC

Описание

java.io

Стандартные классы и интерфейсы ввода/вывода

java.lang

Классы виртуальной машины

java.lang.ref

Классы для работы с ссыпками на объекты

Java . lang. reflect

Классы и интерфейсы, поддерживающие отражение (динамическую информацию о классах)

Java .math

Математический пакет

Java .net

Сетевые классы и интерфейсы

Java. security

Классы и интерфейсы безопасности

Java . security .cert

Классы сертификации безопасности

Java . text

Текстовой пакет

Java . util

Классы стандартных утилит

Java .util . jar

Классы утилиты архиватора Java (JAR)

Java .util . zip

Классы утилиты ZIP

javax.microedition.io

Классы и интерфейсы структуры общих соединений CDC

Профиль Foundation Profile. Конфигурация вместе с профилем формирует исполняемую среду J2ME. Свойства и службы системного уровня, поддерживаемые конфигурацией, более или менее спрятаны от разработчика приложений. В действительности разработчику приложения запрещен прямой доступ к ним. Если это не было соблюдено, приложение не будет считаться соответствующим требованиям J2ME.

С точки зрения программиста профиль необходим для «полезной» работы. Профиль определяет уровень, который содержит АРГи, с которыми программист обычно имеет дело. Создатели J2ME в начале задали один профиль CDC, профиль Foundation, который основан на выпуске J2SE версии 1.3. Он был разработан стандартным комитетом Java Community Process, экспертной группой компаний, работающих в сфере потребительских электронных товаров. Профиль Foundation содержит в себе пакеты J2SE, перечисленные в таблице 1.2.



Пакеты профиля Foundation



Таблица 1.2. Пакеты профиля Foundation

Название пакета профиля Foundation

Описание

java.lang

Дополняет поддержку языка Java пакета java.lang.* J2SE (Compiler, UnknownError)

java.util

Добавляет полную поддержку zip и другие утилиты J2SE (java.util. Timer)

Java .net

Добавляет TCP/IP Socket и соединения HTTP

java.io

Дополняет поддержку ввода/вывода языка Java пакета Java , io . * J2SE (классы Reader и Writer)

Java .text

Дополняет поддержку интернационализации пакета Java. text.* J2SE (I18N): Annotation, Collator, Iterator

Java. security

Добавляет подпись и сертификацию кодов

Вышеуказанный список пакетов выглядит точно так, как список, который включает в себя CDC. В действительности они одинаковы. Говоря, что профиль Foundation заключает в себе эти пакеты, мы на самом деле имеем в виду, что они доступны профилю Foundation. Замысел заключается в том, что профиль Foundation используется с CDC. Различие между профилем и конфигурацией заключается в понятиях, но не в физическом отношении.

Отметьте, что вся иерархия java.awt Abstract Window Toolkit (AWT, абстрактного оконного инструментария) и Java.swing пакета Swing, которая определяет API графического пользовательского интерфейса (GUI), отсутствует в поддерживаемых пакетах. Если приложению необходим GUI, потребуется дополнительный профиль. Профили могут быть внедрены поверх друг друга. Продукт платформы J2ME, однако, может содержать только одну конфигурацию.

Отсутствие поддержки GUI в профиле Foundation имеет меньшее воздействие на семейство постоянно подключенных сетевых устройств с общим доступом, таких, как компьютерные приставки к телевизору, чем оно влияет на персональные мобильные устройства, с которыми работают при помощи второй конфигурации J2ME, CLDC.

В общем, решение включать или не включать свойства и библиотеки в конфигурацию или профиль основано на их зонах обслуживания, требованиях к статическим и динамическим ресурсам и к безопасности.

Профиль Personal Profile. Спецификация профиля Personal была разработана в Java Community, конечным результатом которой стал JSR-62. Профиль Personal обеспечивает среду с полной поддержкой AWT. Замысел его создателей заключался в том, чтобы обеспечить платформу, подходящую для Web-апплетов. Он также предоставляет способ перемещения J2ME для приложений Personal Java.

Профиль Personal версии 1.0 требует внедрения профиля Foundation версии 1.0. Это расширенный набор профиля Personal Basis Profile версии 1.0. Однако профиль Personal является подгруппой платформы J2SE версии 1.3.1, которая дает приложениям, созданным в профиле Personal, большую совместимость снизу вверх с J2SE версии 1.3.1.

В таблице 1.3 перечислены пакеты, которые включены в профиль Personal версии 1.0.



Пакеты профиля Personal



Таблица 1.3. Пакеты профиля Personal

Название пакета профиля Personal

Описание

Java. applet

Классы, необходимые для создания апплетов, и используемые апплетами

Java .awt

Классы AWT для создания пользовательского интерфейса программ

Java . awt . data transfer

Классы и интерфейсы для пересылки данных внутри и между приложениями

]ava .awt .event

Классы и интерфейсы для обработки событий AWT

Java. awt . font

Классы и интерфейсы для работы со шрифтами

Java. awt . im

Классы и интерфейсы для описания редакторов методов ввода

Java .awt. im. spi

Интерфейсы, которые помогают в разработке редакторов методов ввода для любой среды исполнения Java

Java .awt . image

Классы для создания и изменения изображений

Java. beans

Классы, которые поддерживают разработку компонентов JavaBean

javax.microedition.xlet

Интерфейсы, используемые приложениями и диспетчерами приложений профиля J2ME Personal для коммуникации

Профиль RMI. Профиль RMI является профилем, созданным для платформ, которые поддерживают конфигурацию CDC. Он был задан JSR-66 и определен различными компаниями, принимавшими участие в Java Community Process.

Профиль RMI требует внедрения профиля Foundation и внедряется поверх него. Продукты профиля RMI должны поддерживать следующие свойства:

полную семантику RMI вызовов; поддержку объектов маршалинга; RMI проводного протокола; экспорт удаленных объектов через API UnicastRemoteObject; распределенную сборку мусора и интерфейсы еборщика мусора как для клиента, так и для сервера; интерфейс активатора и протокол активации для клиента; интерфейсы реестра RMI и экспорт реестра удаленных объектов.

Профиль RMI поддерживает подгруппу RMI API J2SE в. 1.3. Следующие интерфейсы и свойства являются частью спецификации RMI J2SE в. 1.3 и публичных API, но поддержка этих интерфейсов и функциональных возможностей исключена из технических требований профиля RMI из-за ограниченности вычислительных мощностей устройств, сетевой производительности и пропускной способности:

RMI через брандмауэры и прокси; RMI мультиплексный протокол; модель реализации «активизируемого» («activatable») удаленного объекта; нерекомендуемые методы, классы и интерфейсы; поддержка протокола скелетона/заглушки для RMI в. 1.1; компилятор скелетона и заглушки.

Поддержка следующих свойств J2SE RMI в. 1.3 не включена:

Java. rmi. server. disableHttp; Java.rmi.activation.port; Java.rmi.loader.packagePrefix; Java.rmi.registry.packagePrefix; java.rmi.server.packagePrefix.

Пакеты MIDP



Таблица 1.5. Пакеты MIDP

Название пакета MIDP

Описание

javax.microedition. Icdui

Классы и интерфейсы интерфейса пользователя

javax.microedition.rms

Система организации ведения записей (Record management system, RMS], поддерживающая постоянное хранение устройства

javax.microedition.midlet

Типы классов поддержки определения приложений МЮР

javax.microedition . io

Классы и интерфейсы структуры общих соединений МЮР

java.io

Классы и интерфейсы стандартного ввода/ вывода Java

Java. lang

Классы и интерфейсы виртуальной Java машины

Java .util

Классы и интерфейсы стандартных утилит

Вы узнаете больше о деталях программирования API, перечисленных в таблице 1.5, в главах 3-9.

Реализация MIDP должна состоять из пакетов и классов, указанных в спецификации MIDP. Кроме того, она может иметь зависимые от реализации классы для доступа программного и аппаратного обеспечения родной системы.

На рисунке 1.3 сопоставляются структуры данных платформ CDC и CLDC. Как в CDC, так и в CLDC нет ничего такого, что препятствует производителю подключать любую из платформ к данному семейству устройств. Тем не менее, структуры платформ - особенно свойства конфигураций и профилей - были определены для работы с практическими ограничениями различных семейств аппаратных устройств.

Название пакета МIDР

Описание

javax.microedition.midlet

Типы классов поддержки определения приложений МЮР

javax.microedition . io

Классы и интерфейсы структуры общих соединений МЮР

java.io

Классы и интерфейсы стандартного ввода/ вывода Java

Java. lang

Классы и интерфейсы виртуальной Java машины

Java .util

Классы и интерфейсы стандартных утилит



Платформа J2ME предназначена для двух



Выводы по главе

Платформа J2ME предназначена для двух классов портативных компьютерных устройств. Первый класс состоит из стационарных устройств с фиксированными сетевыми соединениями, таких, как компьютерные приставки к телевизору. Второй класс состоит из персональных мобильных устройств с нестационарной сетевой связью, таких, как «карманные» компьютеры, мобильные телефоны и так далее.
Различные комбинации конфигураций и профилей J2ME поддерживают эти классы устройств. Конфигурация CDC и профиль Foundation поддерживают первый класс устройств, а конфигурация CLDC и профиль MIDP поддерживают второй класс. Конфигурация стремится предоставлять интерфейсы для служб системного уровня. Профиль стремится предоставлять стандартные интерфейсы для служб уровня приложений. Конфигурация дает возможность работы профиля, предоставляя необходимые средства и механизмы. Устройства должны иметь некую систему управления приложениями (AMS), чтобы «самозапустить» процесс инициализации приложений J2ME на устройствах. Производитель устройства обычно предоставляет AMS.

Чтобы создать новый проект вы



Рисунок 2.2. Чтобы создать новый проект, вы должны задать, по крайней мере, один MID-лет. Вы должны предоставить имя проекта и имя основного класса Java для первого MID-лета


После того как вы введете и подтвердите имя проекта и имя класса MID-лета, появится окно, показанное на рисунке 2.3. Это окно предложит вам ввести необходимую информацию о вашем проекте, которая будет использоваться для создания файла манифеста JAR и файла JAD. Заметьте, что закладка Required (Требуемые атрибуты) всегда показывается вначале при появлении окна. Атрибуты, которые вы видите, соответствуют атрибутам, перечисленным в таблице 2.4, обязательным атрибутам дескриптора приложения. Вы можете изменять информацию, установленную по умолчанию, например, атрибуты MIDlet-Vendor или MIDlet-Jar-URL.



Главное окно AMS дает вам возможность



Рисунок 2.11. Главное окно AMS дает вам возможность выбрать MID-лет, который вы хотите выполнить. Если более одного MID-лета присутствуют в наборе MID-летов, вы увидите список их всех. Заметьте, что кнопка Launch (Запуск) предоставляется системой AMS




Использование J2ME Wireless Toolkit



Использование J2ME Wireless Toolkit

Этот раздел покажет вам, как использовать J2SE Wireless Toolkit, разработанный в отделе «Java Software» компании «Sun», для выполнения всех этапов цикла разработки, который вы выполнили вручную. Вы можете загрузить J2ME Wireless Toolkit бесплатно с Web-страницы Java Software на сайте Sun Microsystems, http://java.sun.com. Загрузите версию, соответствующую вашей операционной системе, и следуйте инструкциям по установке, предоставляемым при загрузке.



Является тем же что и рисунок



Рисунок 2.12 является тем же, что и рисунок 3.1. В главе 3 описывается исходный код приложения HelloWorld и его варианты в деталях. В этой главе я описываю только процесс разработки приложения.

На рисунке 2.13 показано главное окно эмулятора J2MEWTK после того, как вы завершите эмуляцию MID-лета HelloWorld. Заметьте, что оно выводит некоторую диагностическую информацию о процессе эмуляции.



Эмулятор выводит результат диагностики на консоль



Рисунок 2.13. Эмулятор выводит результат диагностики на консоль


Тестирование ваших приложений в эмуляторе является важным первым шагом. Однако этого недостаточно, чтобы быть уверенным в правильной работе и мобильности, и никогда нельзя заменять этим тестирование на реальном устройстве. Создание ваших приложений мобильными - ключ к их успеху.



Этап упаковки на самом деле компилирует



Рисунок 2.9. Этап упаковки на самом деле компилирует приложение прежде, чем его упаковать. Результат диагностики отражает выполнение этапов компиляции и упаковки


Вы можете вновь проверить наличие этих файлов, вручную выведя описание содержимого директории bin/ проекта:

$
pwd /cygdrive/c/J2mewtk/apps/HelloWorld/bin
$ Is -1
total 3
-rw-r--r-- 1 vart'an None 282 HelloWorld.jad
-rw-r--r-- 1 vartan None 6960 HelloWorld.jar
-rw-r--r-- 1 vartan None 29V MANIFEST.MF
S

На самом деле упаковка вашего приложения с помощью J2MEWTK сначала компилирует и предварительно проверяет вашу программу, а затем упаковывает ее. Так что вы можете пропустить процесс явной компиляции, описанный в предыдущем разделе, и просто упаковать ваше приложение до его раскрытия и тестирования. Однако явный этап компиляции важен, если вы хотите откомпилировать вашу программу без ее упаковки.



Это единственное окно показываемое



Рисунок 2.12. Это единственное окно, показываемое приложением HelloWorld. Заметьте, что здесь нет кнопки выхода из приложения. Вы можете нажать на красную кнопку Hang Up (Отбой), чтобы вернуться к главному окну AMS


Важно запускать ваши MID-леты с помощью различных устройств в эмуляторе, чтобы облегчить обнаружение и понимание проблем, связанных с мобильностью. Каждое устройство имеет уникальные размеры дисплея, кнопки, поддержку экранных клавиш и так далее. Кроме того, существуют другие проблемы мобильности, с учетом которых, вероятно, ни один эмулятор не может предоставить реалистичную среду устройства для всех устройств. Например, программные средства собственной платформы каждого устройства имеют различную поддержку временных зон, местной специфики, коммуникационного протокола и так далее. Вы узнаете об этих областях далее в книге.



Компиляция



Компиляция

Следующим этапом в цикле разработки после создания вашей программы является компиляция исходной программы. Прежде чем вы приступите к компиляции, убедитесь, что список командных путей среды вашей оболочки включает маршрут к директории, в которой содержатся утилиты J2ME на вашем компьютере.

Общая форма строки компиляции представляет из себя следующее:

S javac -d <tmpclasses dir> -bootclasspath <midpapi.zip location> \
<location of Jva sourcce fie(s)>

Указание -d сообщает компилятору директорию, в которую нужно записывать непроверенные откомпилированные классы. Указание -bootclasspath указывает местоположение файла midpapi.zip, который поставляется вместе с инструментарием J2ME Wireless Toolkit, разработанным «Java Software», и содержит все классы MIDP, которые вам необходимы для написания приложений на J2ME. Среды разработки коммерческих производителей также включают этот файл. Указание -bootclasspath также сообщает компилятору о превосходстве над любой спецификацией CLASSPATH, которую вы, возможно, установили в среде своей оболочки. Заметьте, что это должен быть относительный маршрут доступа к файлу (relative pathname,) - относительный к корневой директории проекта. Наконец, вы указываете имена путей исходных файлов Java, которые вы компилируете.

Чтобы откомпилировать набор MID-летов HelloWorld из директории apps/HelloWorld/, используйте следующую команду:

$ javac -d tmpclasses \
-bootclasspach ../../lib/midpapi.zip src/HelloWorld.Java
$

Указание -d сообщает компилятору записать непроверенные компилированные классы в директорию tmpclasses, которая является поддиректорией каталога HelloWorld/. Указание -bootclasspath определяет путевое имя относительно данного каталога. Наконец, последний параметр указывает относительное путевое имя исходного файла HelloWorld.Java.

Вы узнали, что библиотеки MIDP и CLDC определяют полную платформу для создания приложений на MIDP. Следовательно, вам не придется включать путь для любой J2SE установки в CLASSPATH вашей среды при компилировании ваших приложений. В действительности вы не можете включить его. Если вы это сделаете, вы получите ошибку компиляции, поскольку компилятор найдет конфликтующие определения в библиотеках J2SE и J2ME.

После завершения компиляции ваших файлов директория tmpclasses будет содержать непроверенные файлы .class:

$ Is -I tmpclasses/
total 0
-rw-r--r-- 1 vartan None 922 HelloWorld.class
$



Компиляция пpoeктa



Компиляция пpoeктa

Теперь вы готовы к компиляции. Нажмите на кнопку Build (Создать) на панели кнопок главного окна KToolbar. Wireless Toolkit откомпилирует исходный файл HelloWorld.java и выдаст результат диагностики в главном окне KToolbar, которое показано на рисунке 2.7. Конечно, если ваша компиляция не удастся, обычный благоприятный результат компиляции появится на этой панели.



Компиляция вашего проекта выведет



Рисунок 2.7. Компиляция вашего проекта выведет дополнительные результаты диагностики в главном окне KToolbar


Если результаты вашей компиляции кажутся вам неубедительными, вы можете использовать ваш командный процессор для подтверждения наличия файлов .class в директориях tmpclasses/ и classes/:

$ pwd
/cygdrive/с/J2mewtk/apps/HelloWorId/tmpclasses
$ Is -1
total 8
-rw-r--r— 1 vartan None 2036 HelloWorld.class
$
? cd ../classes/
5 pwd
/cygdrive/с/J2mewtk/apps/HelloWorld/classes
$ Is -1
total 8
-rw-r--r-- 1 vartan None 2036 HelloWorld.class

Как вы уже знаете, директория tmpclasses/ содержит файлы .class, созданные в самом процессе компиляции. Директория classes/ содержит предварительно проверенные файлы, созданные утилитой preverifу. J2ME WTK запускает утилиту preverify автоматически, когда вы нажимаете на кнопку Build (Создать) KToolbar.



KToolbar является главным окном



Рисунок 2.1. KToolbar является главным окном, из которого вы можете получить доступ ко всем функциям Wireless Toolkit


Первый этап затем заключается в создании нового проекта. Я собираюсь создать проект HelloWorld и вновь использовать исходный код, который вы уже видели. На рисунке 2.2 показано окно, которое всплывает, когда вы выбираете пункт New Project... (Новый проект...) в строке меню KToolbar.



Pacкpытиe u выполнение



Pacкpытиe u выполнение

К настоящему моменту мы уже прошли этапы редактирования (создания программы), компилирования, предварительной проверки и упаковки. Наконец, вы готовы к распаковке и запуску вашего приложения. В действительности разработчик MID-лета загрузил бы файл JAR на какую-либо систему инициализации приложений (системы инициализации приложений описываются в главе 10). Системы инициализации предлагают распаковку приложения вслед за его загрузкой. Пользователи загружают файл JAR набора MID-летов на свои устройства и запускают его с помощью программного обеспечения системы управления приложениями устройства.

В этой главе распаковка означает размещение файлов под управлением эмулятора инструментария J2ME Wireless Toolkit. Вы можете затем запустить приложение в эмуляторе, имитируя его выполнение на реальном устройстве.

Вместо того чтобы просто показать вам, как размещать упакованные файлы приложения под управлением Wireless Toolkit для выполнения, в следующем разделе вам будет показано, как выполнять полный цикл разработки, который вы только что завершили, с помощью Wireless Toolkit. Последняя часть этого описания покажет вам, как выполнять ваши приложения.



Pacкрытие приложения



Pacкрытие приложения

Фактически при использовании Wireless Toolkit нет разграничения этапов разработки. Инструментарий создает компоненты, которые вам нужно будет раскрыть в реальной системе, а именно файл дескриптора приложения и файл JAR приложения. В главе 10 описывается, что вы будете делать с этими файлами в реальной системе, которая предлагает приложения MIDP для загрузки на реальные устройства.



Показывает результат диагностики



Рисунок 2.9 показывает результат диагностики, созданный, когда вы закончили процесс упаковки. Заметьте, что он показывает, что Wireless Toolkit создал файлы Hello World jar и HelloWorld.jad.



После того как вы завершите ввод



Рисунок 2.6. Разработчики приложения могут устанавливать определенные атрибуты для одного или более MID-летов в наборе MID-летов


Если вы взглянете еще раз на рисунки 2.3 и 2.4, вы увидите, что панели Required (Требуемые атрибуты) и Optional (Необязательные атрибуты) не позволяют вам добавлять какие-либо атрибуты в них. Вы можете только редактировать значения атрибутов, которые уже есть. Вы не можете добавлять обязательные поля, потому что они стандартизованы. Набор необязательных полей также стандартизован, хотя их присутствие не обязательно.

После того как вы закончите этот цикл начального определения набора MID-лета, вы всегда можете отредактировать значения любого из атрибутов MID-лета. Выберите кнопку Settings (Параметры) в строке меню KToolbar. Когда вы это сделаете, вновь появится окно, показанное на рисунке 2.3. Внесите желаемые изменения и нажмите ОК.



Предварительная проверка



Предварительная проверка

Следующим этапом после компиляции является предварительная проверка файлов .class, которые вы только что откомпилировали. Чтобы провести ее, запустите следующую команду:

$ preverify -classpath "../../lib/midpapi.zip;tmpclasses" -d classes \
tmpclasses
S

Если вы используете J2ME Wireless Toolkit, вы должны отделить элементы пути классов точками с запятой, или заключить их в кавычки, если вы используете оболочку Unix, чтобы избежать того, что оболочка начнет интерпретировать точки с запятой. Элементы путей классов представляют собой директории, из которых должны загружаться классы. Разделитель элемента пути класса - точка с запятой в данном случае -зависит от платформы.

Параметр -d указывает директорию, в которую должны быть записаны предварительно проверенные выходные классы, генерируемые с помощью этой команды. Наконец, имя замыкающей директории, tmpclasses, показывает местонахождение, из которого можно получить непроверенные файлы классов, которые были созданы на предыдущем этапе компиляции.

Запуск вышеуказанной команды preverify создает предварительно проверенные файлы . class в директории классов в соответствии с вашими указаниями:

S Is -I classes/
total 0
-rw-r--r-- 1 vartan None 922 HelloWorld.class
$

Команда preverify является инструментом предварительной проверки файлов классов, который используется в процессе проверки файлов классов. Проверка файлов классов в CLDC, как и в J2SE, является процессом проверки истинности файлов классов Java и отклоняет неправильные файлы. Однако в отличие от процесса проверки в J2SE проверка файлов классов в CLDC включает два этапа:

Этап 1 - предварительная проверка вне устройства; Этап 2 - проверка на устройстве.

Использование команды preverify, о которой мы только что говорили, представляет собой фазу предварительной проверки вне устройства - стадию 1 в двухэтапном процессе проверки. В реальной среде эта первая фаза обычно осуществляется на сервере, с которого MIDP-приложения загружаются на мобильные устройства. Обычно сервер выполняет это до того, как делает приложение доступным для загрузки.

Причина появления этого нового процесса проверки заключается в том, что обычный верификатор файлов классов J2SE требует больше памяти и возможностей по обработке данных, чем стандартные мобильные устройства могут реально предоставлять. Он использует около 50 Кб места под двоичный код и от 30 до 100 Кб динамической памяти при работе. Новый верификатор CLDC требует намного меньше RAM и является при этом намного более эффективным. Для стандартных файлов классов верификатор CLDC использует только около 10 Кб кодового пространства и требует только 100 байт динамической памяти при работе.

Новый верификатор может достигать такой высокой производительности благодаря новому алгоритму, который он использует. Этот новый алгоритм, однако, требует наличия специальных атрибутов в каждом файле классов Java. Верификатор предварительной проверки записывает эти новые атрибуты в каждый файл классов Java. Верификатор затем использует атрибуты, созданные верификатором предварительной проверки. Новые файлы классов приблизительно на 5 процентов больше, чем их немодифицированные версии.

Верификатор предварительной проверки выполняет две задачи:

Он делает все запросы подпрограммы «линейными», замещая каждый запрос метода, который содерркит байтовые коды jsr, jsr_w, ret и wide ret, семантически эквивалентными кодами, которые не содержат этих команд. Он вставляет атрибуты стековой карты в то, что иначе является нормально форматированным файлом классов Java.

Эти новые файлы классов все еще являются действующими файлами классов J2SE. То есть новые атрибуты стековой карты просто игнорируются верификатором J2SE. Добавление атрибутов стековой карты было внедрено вместе с механизмом наращиваемых атрибутов, который поддерживается форматом файлов классов Java, определяемым стандартной виртуальной машиной Java. Это означает, что файлы классов CLDC являются совместимыми снизу вверх с виртуальной машиной J2SE.

Атрибуты, которые верификатор предварительной проверки записывает в файлы классов CLDC, называются атрибутами стековой карты. Атрибуты стековой карты определяются структурой данных StackMap_attribute. Эти атрибуты являются субатрибутами атрибута Code, определяемого и используемого обычной виртуальной машиной J2SE. Имя стековая карта отражает природу атрибута как описания типа локальной переменной или элемента стека операндов. Такое имя выбрано потому, что эти элементы всегда находятся в стеке интерпретатора.

Тип Code_attribute является другим типом, определяемым стандартной виртуальной машиной. Он определяет атрибут Code, используемый стандартной виртуальной машиной J2SE. Для получения полного описания этих структур, пожалуйста, смотрите спецификацию виртуальной машины Java «Java Virtual Machine Specification», которая отмечена в разделе ссылок в конце этой книги. Верификатор предварительной проверки CLDC определяет следующую структуру Stackmap_attribute, которая определяет производный тип стековой карты, как изложено ниже:

StackMap_attribute
{
u2 attribute_name_index; u4 attribute_length; u2 .iumber_of_entries;
u4 byte_code_offset;
{
u2 number_of_locals;
cy types_of_locals[number_of_locals];
u2 number_of_stack_iteras;
ty types_of_stack_items[nuraber_of_stack_iterns];
} entries [number_of_entriesj;
}

Для получения дополнительной информации об описании и функционировании каждого из этих полей, пожалуйста, смотрите спецификацию Connected, Limited Device Configuration Specification.



Проектирование и кодирование



Проектирование и кодирование

Прежде чем вы приступите к самому циклу разработки, вы должны сначала создать структуру директорий, которая будет поддерживать разработку вашего набора MID-летов. Набор MID-летов - это комплект MID-летов, которые используют общие ресурсы приложений. Вы получите более подробную информацию об этих общих ресурсах MID-летов в следующих главах книги.

Я сначала создаю директорию под названием HelloWorld, что является названием примера нашего первого приложения, под директорией apps/, предназначенной для установки инструментария для работы с беспроводными устройствами. Эта директория является корневой для вашего нового проекта. Проект - это организованное объединение ресурсов - исходного кода, файлов ресурсов, откомпилированных файлов, - специфических для одного или более связанных приложений.

Корневой каталог проекта содержит подкаталоги, показанные в следующем примере кода:

$ pwd
/cygdrive/c/ J2rnewtk/apps/HelloWorld
3 Is -F
bin/ classes/ res/ src/ tmpclasses/

Есть причина для использования такой точной структуры каталогов, которую я объясню далее, когда вы узнаете, как использовать эмулятор Wireless Toolkit Emulator. Однако даже если вы не планируете использовать J2ME Wireless Toolkit, такая организационная структура является самой разумной для начала работы. В таблице 2.1 объяснено содержание и цель этих каталогов.



Размещение исходного кoдa в пpoeктe



Размещение исходного кoдa в пpoeктe

Теперь пришло время поместить исходный файл приложения внутри проекта, как указано в панели результатов диагностики KToolbar. Когда вы создадите новый проект, KToolbar создаст соответствующие директории под структурой директорий установки, как вы уже видели, когда использовали интерфейс командной строки. Вспомните, что на моей системе эта директория располагается в /cygdrive/c/J2mewtk/apps.

Под этой директорией существует директория проекта HelloWorld. Ваш следующий шаг заключается в размещении исходного файла HelloWorld. Java вручную под директорией HelloWorld/src/. Конечно, если бы вы действительно создавали проект с нуля, вы бы сначала создали исходник с помощью своего любимого текстового редактора.



Создание файла дecкpиптopa приложения для набора МIDлетов



Создание файла дecкpиптopa приложения для набора МID-летов

Программное обеспечение управления приложениями на устройстве, таком, как мобильный телефон, использует файл JAD для получения информации, необходимой для управления ресурсами во время выполнения MID-лета. Файл дескриптора приложения является необязательным, однако полезным. Вы можете использовать любой текстовой редактор для его создания, но вы должны дать файлу расширение . jad. Чтобы избежать путаницы, я рекомендую давать ему имя, которое характеризует весь набор MID-летов.



Создание файла JAR для набора МIDлетов



Создание файла JAR для набора МID-летов

Теперь, когда вы создали файл манифеста, вы готовы к созданию файла JAR приложения. Используйте следующую команду jar:

$ jar craf bin/MANIFEST.MF bin/HelloWorld.jar -C classes/ . -C res .
$

Эта команда создаст файл JAR для вашего набора MID-летов HelloWorld. Листинг содержимого директории bin/ обнаруживает только что созданный файл HelloWorld. jar:

$ Is -i bin
total 2
-rw-r--r-- 1 vartan None 1393 HelloWorld.jar
-rw-r--r-- 1 vartan None 193 MANIFEST.MF
$

Листинг содержимого файла JAR, который вы только что создали, выдает следующую информацию:

$ jar tf bin/HelloWorld.jar
META-INF/
META-INF/MANIFEST.MF
classes/./
classes/./HelloWorid.class
HelloWorld.png
$

Как вы можете видеть, файл манифеста включается в файл JAR. Файл JAR содержит один файл .class для нашего приложения HelloWorld. Он также содержит файл формата .png (portable network graphics -переносимая сетевая графика), который является подходящим вариантом для использования в качестве значка приложения. Файл MANIFEST.MF, конечно, был создан вручную, как описано выше.



Создание файла манифеста JAR



Создание файла манифеста JAR

ЕСЛИ вы хотите добавить файл Manifest к вашему заархивированному набору MID-летов, вам необходимо создать его прежде, чем вы создадите сам JAR-архив. Вы можете создать этот файл в любом текстовом редакторе. Потом создайте JAR-файл с помощью стандартной утилиты JAR J2SE. Утилита JAR включается в утилиты инструментария Wireless Toolkit.

Спецификация MIDP требует, чтобы в файле Manifest присутствовали определенные поля. Требуемые поля показаны в таблице 2.2.



Создание пpoeктa



Создание пpoeктa

Свойства и функции Wireless Toolkit базируются на проектах. Проект представляет собой разработку набора из одного или более MID-летов. Завершение выполнения цикла разработки проекта выражается в создании файлов приложения JAR и JAD и файла манифеста, который описывает файл JAR.

KToolbar является основной утилитой Wireless Toolkit. На рисунке 2.1 показано главное окно KToolbar. Обратите внимание, что во время запуска он предлагает вам создать новый проект или открыть существующий и снова использовать исходный код, который вы уже видели в примерах с использованием командной строки.



Поддиректории проектов



Таблица 2.1. Поддиректории проектов, созданных с помощью J2ME Wireless Toolkit

Название поддиректории

Содержание директории

Bin

Файлы приложения: файл .jar, файл .jad, MANIFEST. MF

classes

Откомпилированные и предварительно проверенные файлы .class

Res

Файлы ресурсов приложения, такие, как файлы изображений .png в формате PNG

Src

Файлы исходного приложения

tmpclasses

Откомпилированные, непроверенные файлы .class

Я не буду объяснять здесь проектировку самого приложения, поскольку эта тема лежит за пределами темы этой главы. Цель на данный момент заключается не в том, чтобы описать, как проектировать приложения Java или даже приложения MIDP. В последующих главах, однако, будет говориться об организации MIDP-приложений.



Обязательные атрибуты файла MANIFEST MF



Таблица 2.2. Обязательные атрибуты файла MANIFEST.MF

Имя атрибута

Описание

MIDlet-Name

Название набора MID-летов

MIDlet-Versiorv

Номер версии набора MID-летов в форме <major>.<minor>.<micro>, определяемой схемой спецификации управления версиями продукта JDK

MIDlet-Vendor

Разработчик приложения (компания или частное лицо)

MIDlet-<n>

По одному на MID-лет в данном наборе, содержит разделяемый запятой список из текстового имени MID-лета, значка и имени класса п-ного MID-лета в наборе

MicroEdit ion-Profile

Профиль J2ME, необходимый для исполнения MID-лета

MicroEdition-Configuration

Конфигурация J2ME, необходимая для исполнения MID-лета

Файл манифеста содержит строки атрибутов, один атрибут на строку. Каждый атрибут состоит из ключа и значения. После ключа ставится двоеточие, которое отделяет его от связанного с ним значения. Файл MANIFEST.MF программы HelloWorld находится в папке HelloWorld/bin/. Он выглядит следующим образом:

MIDlet-l: HelloWorld, HelloWorld.png, HelloWorld
MIDlet-Narae: HelloWorld
MIDlet-Vendor: Vartan Piroumian
MIDlet-Version: 1.0
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-1.0

Обратите внимание на имя атрибута MIDlet-1: в файле MANIFEST.MF. Файл манифеста различает различные MID-леты, нумеруя их от MIDlet-l до MIDlet-/!. Число 1 должно идентифицировать первый MID-лет.

У атрибута MIDlet-1 существует три значения. Первое - название набора MID-летов, который содержит данный MID-лет. Это значение может быть именем, воспринимающимся человеком. Второе значение является именем файла изображения PNG, который AMS использует как значок, представляющий этот MID-лет. Последнее значение является именем файла класса MID-лета, который определяет входную точку исполнения MID-лета.

Наверное, самыми важными атрибутами являются атрибуты MicroEdition-Configuration и MicroEdition-Profile. AMS использует эти значения для определения того, подходит ли MID-лет для данного устройства.

Спецификация MIDP позволяет также создавать необязательные поля в файле манифеста. В таблице 2.3 показаны необязательные поля файла манифеста.



Необязательные атрибуты файла MANIFEST MF



Таблица 2.3. Необязательные атрибуты файла MANIFEST.MF

Имя атрибута

Описание

MI Diet-Description

Описание набора MID-летов

MIDlet-Icon

Имя файла PNG, содержащегося в JAR

MIDlet-Info-URL

URL, который содержит дополнительную информацию об этом наборе MID-летов

MIDlet-Data-Size

Минимальное количество байт данных постоянного хранения, требуемое набором



Обязательные атрибуты


Имя атрибута

Описание

MIDlet-Jar-URL

URL файла JAR набора MID-летов

MIDlet-Jar-Size

Размер (в байтах) файла JAR

MI Diet-Name

Имя набора MID-летов

MIDlet-Vendor

Разработчик приложения (например, название компании или имя частного лица]

MIDlet-Version

Номер версии набора MID-летов в форме <major>. <minor>.<micro>, определяемой схемой спецификации управления версиями продукта JDK

MicroEdition-Configuration

Конфигурация J2ME, необходимая для исполнения MID-лета

Mi croEditi on- Profile

Профиль J2ME, необходимый для исполнения MID-лета



Необязательные атрибуты


Имя атрибута

Описание

MIDlet-Data-Size

Минимальное количество байт данных постоянного хранения, требуемое набором

MIDlet-Delete-Confirm

Указывает, должна ли AMS запрашивать подтверждение пользователя перед удалением MID-лета

MI Diet -De script ion

Описание набора MID-летов

MIDlet-Icon

Имя файла PNG, содержащегося в JAR

MIDlet-Info-URL

URL, который содержит дополнительную информацию об этом наборе MID-летов

MIDlet-Install-Notify

Указывает, должна ли AMS уведомлять пользователя перед установкой нового MID-лета

В дополнение к необязательным полям, перечисленным в таблице 2.5, файл JAD может содержать отдельные поля атрибутов для каждого MID-лета, описанные и названные разработчиком приложения. Вы можете называть эти атрибуты так, как вам нравится, однако вы не должны использовать «MIDlet-» в имени атрибута. Этот префикс зарезервирован для имен стандартных атрибутов, определенных спецификацией MIDP.

Файл JAD для программы HelloWorld также находится в директории HelloWorld/bin/ и его содержимое выглядит так:

MIDlet-1: HelloWorld, HelloWorld.png, HelloWorld
MIDlet-Jar-Size: 1393
MIDlet-Jar-URL: HelloWorld.jar
MIDlet-Name: HelloWorld
MIDlet-Vendor: Vartan Piroumian
MIDlet-Version: 1.0

В частности, обратите внимание на поле атрибута MIDlet-Jar-Size. Когда вы используете инструменты командной строки, вы должны вручную редактировать файл JAD, чтобы обновлять значение атрибута MIDlet-Jar-Size каждый раз, когда вы создаете файл JAR, для точного отражения размера файла JAR. Листинг директории bin/ показывает, что ваш файл JAR занимает 1393 байта. Поэтому файл JAD должен точно отражать этот размер, что он и делает.

Заметьте, что некоторые из полей появляются как в файле манифеста, так и в файле JAD. Причина этого заключается в том, что спецификация MIDP требует их наличия в обоих полях. В частности, три атрибута - MIDlet-Name, MIDlet-Version и MIDlet-Vendor -заслуживают особого внимания. Они должны иметь одно и то же значение, если присутствуют как в файле JAD, так и в файле Manifest. Спецификация MIDP оговаривает, что файл JAR не должен загружаться, если эти три значения не являются идентичными в этих двух файлах.



Упаковка



Упаковка

Следующим этапом после предварительной проверки является упаковка приложения. Упаковка набора MID-летов включает 2 объекта:

архивный файл Java файлов MID-лета; необязательный файл дескриптора приложения.

Хотя вы можете выбирать, упаковывать ли приложения J2SE для распаковки в дальнейшем, спецификация MIDP требует, чтобы вы упаковывали набор MID-летов с помощью утилиты архивации Java (JAR). В действительности спецификация MIDP требует, чтобы все наборы MID-летов переносились на устройства в сжатом файловом формате JAR. Обычно серверы, которые поддерживают перенос наборов MID-летов на устройства, хранят файлы наборов MID-летов в сжатом формате JAR. Либо сервер, либо компонент, который загружает файл на сервер, создает сжатый JAR-файл.

Архив JAR набора MID-летов может содержать несколько типов файлов, как показано в следующем списке:

файл манифеста (manifest file) - файл, который описывает содержимое JAR-файла; файлы классов Java, которые содержат MID-леты из набора MID-летов архива; файлы ресурсов приложения, используемые MID-летами из набора MID-летов.

JAR Файл манифеста (manifest file) содержит атрибуты, которые описывают содержимое самого JAR-файла. Его наличие в JAR-файле необязательно.

Другой необязательный описательный файл, называемый файлом дескриптора приложения, содержит информацию о наборе MID-летов. Этот файл иногда называется дескриптором приложения Java (JAD). Каждый набор MID-летов может иметь связанный с ним файл описания.

Файл дескриптора приложения используется по двум причинам. Программное обеспечение управления приложениями устройства (AMS) использует информацию из этого файла для первоначальной проверки того, что все MID-леты в файле JAR соответствуют требованиям устройства, перед тем как оно загрузит полный файл JAR. AMS также использует эту информацию для управления MID-летом. AMS устройства отвечает за установку и удаление наборов MID-летов. Оно также обеспечивает MID-леты средой исполнения, требуемой спецификацией MIDP. Наконец, AMS управляет выполнением MID-летов, а именно запуском, приостановкой и закрытием всех MID-летов.

Наконец, сами MID-леты могут извлекать из конфигурации JAD-файла специфические атрибуты, которые представляют собой параметры MID-лета. Файл ресурсов приложения является основным механизмом для распаковки конфигураций MIDP-прило-жений.



Упаковка проекта



Упаковка проекта

После того кай вы выполните компиляцию, вы должны упаковать приложение, что вы уже делали при работе с инструментами командной строки. На панели кнопок KToolbar нет кнопки Package (Упаковка). Вместо этого раскройте пункт меню Project (Проект) в меню KToolbar и выберите пункт меню Package (Упаковка), как показано на рисунке 2.8.



Выберите пункт меню Package (Упаковка)



Рисунок 2.8. Выберите пункт меню Package (Упаковка) для упаковки вашего приложения. На этом этапе создаются файлы JAD и JAR приложения




Выполнение приложения



Выполнение приложения

Выполнение приложения означает имитирование среды исполнения реального мобильного устройства. Одним из прекрасных свойств эмулятора Wireless Toolkit является то, что он может имитировать несколько реальных устройств, а также некоторые устройства по умолчанию, которые представляют свойства некоторых устройств с самым низким среднем знаменателем.

Панель кнопок KToolbar содержит комбинированное окно, называемое Device (Устройство) под главной строкой меню. Вы можете выбрать одно из шести устройств в этом комбинированном окне. Выбранный пункт указывает эмулятору, какое устройство имитировать при запуске приложения. На рисунке 2.10 показан список устройств, который вы видите при выборе в комбинированном окне.



Процесс разработки приложений на J2ME



Выводы по главе

Процесс разработки приложений на J2ME включает компиляцию, предварительную проверку, упаковку, раскрытие и выполнение.
Вы компилируете ваши MIDP-приложения с помощью стандартного компилятора J2SE. Новая утилита предварительной проверки создает проверенные файлы .class, которые могут быть интерпретированы как KVM, так и стандартной виртуальной машиной J2SE.
Эмуляторы являются важными инструментами при разработке приложений для мобильных устройств. Они дают вам возможность проделывать начальное тестирование без вынужденного использования настоящего устройства. Это, в частности, важно для тестирования логической правильности ваших приложений, поскольку среды тестирования и отладки недоступны на настоящих устройствах. Однако эмуляторы не являются заменителями тестирования на реальных устройствах. Вы должны протестировать каждый аспект приложения на реальном устройстве до его выпуска как готового продукта.
Инструментарий J2ME Wireless Toolkit содержит инструменты разработки приложений и эмулирования, которые дадут вам возможность выполнять все этапы процесса разработки, а именно: компилирование, предварительную проверку, упаковку, раскрытие и выполнение.

Wireless Toolkit может имитировать



Рисунок 2.10. Wireless Toolkit может имитировать пять устройств. Два из них являются реальными устройствами


После того как вы выберете устройство по вкусу, вы будете готовы к запуску -вашего приложения. Чтобы запустить ваше приложение в эмуляторе, просто нажмите на кнопку Run (Запуск) на панели кнопок KToolbar. Я закрываю эмулятор Default Color Phone. На рисунке 2.11 показано окно, которое появляется, имитируя среду реального устройства.

На рисунке 2.11 представлено главное окно программы управления приложениями, которое вы можете увидеть на реальном устройстве. Оно дает вам возможность выбрать MID-лет, который вы хотите выполнить. Обычно вы запускаете систему AMS из меню на вашем мобильном устройстве. На рисунке 2.12 показан дисплей после того, как вы выберете пункт HelloWorld, указанный в списке на дисплее. Это и есть окно, показываемое MID-летом.