суббота, 14 августа 2010 г.

Разработка приложений для мобильных устройств с помощью Java

Думаю, уже нет смысла распространяться о том, почему Java стал предпочтительным языком (language of choice) при программировании мобильных устройств. Однако каждое мобильное устройство имеет свою специфику, и при всей кросс-платформенности Java структура даже самого простого приложения может выглядеть по-разному для разных типов устройств

Разработка приложений для мобильных устройств с помощью Java

Думаю, уже нет смысла распространяться о том, почему Java стал предпочтительным языком (language of choice) при программировании мобильных устройств. Однако каждое мобильное устройство имеет свою специфику, и при всей кросс-платформенности Java структура даже самого простого приложения может выглядеть по-разному для разных типов устройств. Ситуация особенно осложняется тем, что операционные системы мобильных устройств, при всей своей маломощности, почти исключительно ориентированы на графический интерфейс пользователя. При этом классические графические библиотеки Java, такие как AWT и Swing до сих пор не получили широкого распространения в мире мобильных устройств.
В этой статье программирование мобильных устройств будет рассмотрено на примерах двух довольно далеких друг от друга устройств. В первой части мы расскажем о программировании карманных персональных компьютеров (КПК) с помощью средства кросс-платформенной разработки Ewe, а во второй части речь пойдет о создании программ для мобильных телефонов на примере скачать Siemens Mobility Toolkit.

Программирование в среде Ewe

Cкомпилированные class-файлы Ewe могут выполняться на любой виртуальной машине Java (при наличии библиотеки времени выполнения).
При этом Ewe не просто позволяет создавать переносимые приложения с графическим интерфейсом и возможностью обращения к файловой системе устройства. К полезным возможностям Ewe следует отнести:

  • Простой метод программирования приложений синхронизации между портативным компьютером и настольной системой
  • Программирование инфракрасного порта
  • Возможность прямого обращения к прикладным интерфейсам поддерживаемых устройств.
Важным достоинством Ewe, которое нельзя не отметить, являются условия распространения пакета. Ewe распространяется на условиях Royalty Free, что позволяет программисту не только бесплатно использовать Ewe для разработки приложений, в том числе и коммерческих, но и распространять саму ВМ вместе с приложениями.
Возможно ли с помощью Ewe создавать «реальные» приложения? Библиотека времени выполнения Ewe содержит богатый набор элементов пользовательского интерфейса и вспомогательных классов, позволяющих создавать такие приложения как Web-броузер или текстовый редактор с возможностью форматирования текста и взаимодействия с буфером обмена (рис. 1).
Приложение, созданное в Ewe
Рисунок 1. Приложение, созданное в Ewe
В настольных версиях Microsoft Windows приложения Ewe (файлы с расширением .ewe) можно запускать, просто щелкнув мышью по пиктограмме приложения. На других платформах Ewe-программы придется запускать с помощью специальной утилиты Ewe Launcher (рис. 2). Впрочем, как будет описано ниже, и в этих ситуациях существуют альтернативные решения.
Утилита Ewe Launcher
Рисунок 2. Утилита Ewe Launcher

Разработка Ewe-программ. Что нам необходимо?

Кроме виртуальной машины Ewe (виртуальные машины для всех поддерживаемых платформ можно загрузить с сайта www.ewesoft.org), нам потребуется средство разработки программ – доступный на том же сайте скачать Ewe Software Development Kit. Пакет разработки включает в себя:

  • Библиотеку, содержащую Java-классы, используемые программами Ewe
  • Программу Jewel, преобразующую скомпилированные классы Java в приложение Ewe (а также в исполнимые файлы приложений для поддерживаемых платформ, при этом библиотека времени выполнения связывается с приложением статически)
  • Примеры Ewe-приложений.
Следует иметь в виду, что документация по разработке в архив Ewe SDK не входит. Архив с документацией (в формате HTML) нужно скачать отдельно, следуя инструкциям, приведенным на сайте и в справочных файлах SDK.
Создавать приложения Ewe можно на десктопах Windows, Linux и компьютерах Sharp Zaurus.
Для компиляции приложений Ewe подойдет и стандартный Java-компилятор, однако с сайта EweSoft можно загрузить специальный компилятор Jikes, запускаемый из командной строки.
Кроме вышеперечисленного на сайте Ewe можно найти и другие полезные вещи:

  • Утилиту инсталляции Ewe-приложений – Ewe Application Installer
  • Ewex - Набор дополнительных Java-пакетов для разработки приложений
  • Исходные коды библиотеки времени выполнения
  • Исходные коды виртуальной машины Ewe.
Хотя программирование Ewe-приложений основано на Java, между Ewe и стандартным Java существуют некоторые различия.
Ewe не использует классы из стандартного пакета java, за исключением некоторых классов из пакета java.lang. Следует отметить, что интерфейсы многих классов Ewe аналогичны интерфейсам стандартных классов Java, так что перенос существующего Java-кода на Ewe не вызовет особых затруднений.
Как и стандартный Java, Ewe поддерживает многопоточные приложения, однако интерфейс программирования потоков в Ewe отличается от интерфейса Java. Запуск и остановка приложений Ewe выполняется несколько иначе, чем запуск и остановка стандартных Java-программ (подробнее этот вопрос будет рассмотрен далее). Для создания графического интерфейса приложений Ewe необходимо использовать классы, предоставляемые пакетами ewe.ui, ewe.fx, ewe.graphics, ewe.filechooser и некоторыми другими.
Пакет Ewe учитывает специфику мобильных устройств, например, существует возможность расположения окон приложения в режиме ландшафта (Landscape mode), который лучше соответствует геометрии экрана портативного компьютера. скачать бесплатно программы

Простейшее приложение

Рассмотрим текст простейшего приложения в среде Ewe.
package tests;
import ewe.ui.*;
import ewe.fx.*;

public class Welcome{
public static void main(String args[])
{ ewe.sys.Vm.startEwe(args);
MessageBox mb = new MessageBox("Ewe", "Hello, World!\n",
MessageBox.MBOK);
mb.icon = new mImage("ewe/Palm.bmp", new Color(0,255,0));
mb.execute();
ewe.sys.Vm.exit(0);
}
}
На первый взгляд эта программа ничем не отличается от стандартной программы Java. Как и в случае Java, роль главной процедуры выполняет публичный статический метод main основного класса приложения. Однако отличия начинаются уже со второй строки программы.
Пакет ewe.ui предоставляет классы, необходимые для построения пользовательского интерфейса приложения Ewe. Этот пакет включает, среди прочего, класс AppForm (этот класс может служить основной формой приложения), класс Canvas, позволяющий создавать собственные элементы управления, а также набор стандартных элементов графического интерфейса.
Интересно отметить наличие в пакете ewe.ui класса Console, позволяющего осуществлять быстрый вывод на некое подобие текстовой консоли.
Пакет ewe.fx содержит классы, предназначенные для низкоуровневого графического вывода. Этот пакет включает также класс Sound, позволяющий воспроизводить однотонные звуки заданной частоты и продолжительности (звук будет воспроизводиться не на всех поддерживаемых платформах). Кроме того, в пакет ewe.fx входит класс SoundClip, позволяющий воспроизводить звуковые файлы
Перед выполнением каких-либо других действий Ewe-программа должна инициализировать систему Ewe. В приведенном выше листинге представлен один из возможных способов сделать это. Первая строка из тела метода main вызывает метод startEwe класса Vm. Данному методу передаются аргументы командной строки, переданной методу main. Если среди этих аргументов содержатся ключи, имеющие значение для виртуальной машины Ewe, они будут обработаны должным образом. Обратите также внимание на вызов метода Vm.exeit перед завершением работы программы. Данный метод высвобождает ресурсы, выделенные программе ВМ EWE. Параметром этого метода является численный код завершения программы, смысл которого аналогичен смыслу значения, возвращаемого процедурой main в программах, написанных на C.
Возможности класса ewe.sys.Vm не ограничиваются перечисленными выше. Статические методы этого класса позволяют управлять ВМ Ewe: запускать дочерние процессы, осуществлять сборку мусора, устанавливать таймеры и даже выключать систему через заданный промежуток времени (эта возможность реализована только под управлением PalmOS).
В методе main мы создаем экземпляр класса MessageBox (переменная mb). Этот класс реализует вывод на экран стандартного модального диалогового окна с текстом, пиктограммой, одной или несколькими кнопками. Для вывода окна на экран используется метод execute. Поскольку окно модальное, дальнейшее выполнение метода main будет приостановлено до тех пор, пока это окно не будет закрыто. Текст заголовка, основной текст окна, а также количество и тип кнопок определяются в конструкторе объекта. Чтобы установить пиктограмму для окна мы должны присвоить свойству image объекта MessageBox экземпляр класса mImage, который создается «налету». Обратите внимание на указание расположения пиктограммы Palm.bmp. Эта пиктограмма, как и многие другие, хранится в самой библиотеки времени выполнения Ewe. Наличие встроенных пиктограмм облегчает создание на основе Ewe приложений с унифицированным графическим интерфейсом. Разумеется, кроме встроенных пиктограмм, Ewe позволяет использовать и пиктограммы, созданные разработчиком приложения.
Займемся, наконец, компиляцией приложения. Сохраним вышеприведенный листинг в файле Welcome.java. Для компиляции воспользуемся компилятором jikes (компиляция и все дальнейшие действия по сборке программы будут выполняться на платформе Windows). В окне консоли даем команду:
jikes.exe -cp Ewe-Classes.zip Welcome.java
Разумеется, если библиотека классов Ewe-Classes.zip и файл Welcome.java расположены в каталоге, отличном от того, в котором расположен компилятор jikes, необходимо указать расположение соответствующих файлов. После компиляции будет создан файл Welcome.class. Этот файл содержит скомпилированный байт-код, но еще не является приложением Ewe.
Для превращения файла Welcome.class в программу Ewe нам придется воспользоваться специальным инструментом – уже упоминавшейся программой Jewel (рис. 3).
Программа Jewel
Рисунок 3. Программа Jewel
В поле Program Name мы вводим имя программы, которое одновременно будет и именем проекта. В строке Starting Class мы указываем полное имя главного класса внутри скомпилированного файла (в нашем случае это имя должно выглядеть как welcome.Welcome). Две кнопки в группе File позволяют открывать и сохранять файлы проектов Jewel. Если мы нажмем кнопку Save, будет создан файл Welcome.jnf, содержащий настройки проекта для нашей программы. К сожалению, утилита Jewel не обладает функцией Save As.
Из трех вкладок на панели Jewel важнейшей является Create Ewe File. В строке Output Ewe File мы указываем полное имя файла приложения Ewe. Если создаваемый проект является самостоятельным приложением, а не библиотекой, следует установить флажок Add Command Line. Флажок Use String Pool позволяет добиться незначительного уменьшения размеров создаваемого приложения. С помощью флажка Add Install File к создаваемому приложению Ewe можно добавить специальный код, который позволит виртуальной машине устанавливать создаваемое приложение как «родное» приложение для целевой системы. В настоящее время эта опция поддерживается только на платформе Sharp Zaurus.
Группа Ewe File Directories/Masks Entries позволяет указать перечень файлов, которые будут включены в создаваемый проект. Здесь должны быть перечислены скомпилированные файлы классов, а также другие ресурсы, включаемые в проект, например, созданные программистом пиктограммы. Строка Source Path содержит полное указание расположения включаемых в проект элементов (в нашем случае это скомпилированные class-файлы). Следует обратить особое внимание на содержимое строки A Path in Ewe. Эта строка определяет, где именно будет находиться указанный ресурс во внутренней структуре Ewe-приложения. Приложение не сможет работать правильно, если не найдет класс или другой ресурс там, где оно ожидает его найти. Если речь идет о добавлении класса, значением строки A Path in Ewe должно быть имя пакета, указанное после ключевого слова package в исходном файле.
Просмотреть структуру ресурсов приложения можно с помощью кнопки Show Files. Кнопка Create Ewe File компилирует файлы классов в приложение Ewe. После нажатия на эту кнопку у нас должен появиться файл Welcome.ewe, способный выполняться на виртуальной машине Ewe. Однако то, что такая компиляция прошла успешно, еще не означает, что созданное Ewe-приложение будет работать без ошибок. Чтобы убедиться в этом, следует воспользоваться кнопкой Run Ewe File. Если все прошло успешно, на экране должно появиться диалоговое окно программы, содержащее пиктограмму, надпись Hello World! и кнопку OK, нажатие на которую закрывает окно.
Рассмотрим функции других вкладок утилиты Jewel Program Creator. Вкладка Create Programs позволяет создавать исполнимые файлы в форматах, отличных от формата исполнимого файла виртуальной машины Ewe. Исполнимые файлы некоторых форматов по-прежнему будут нуждаться в наличии Ewe ВМ, другие же смогут выполняться самостоятельно.
Возникает вопрос, зачем нужно преобразовывать приложение из формата .ewe, в котором оно может выполняться на любой платформе, где установлена соответствующая ВМ, в какой-то специальный формат, который сможет выполняться только на определенной платформе, но по прежнему нуждается в наличии виртуальной машины? Для ответа на этот вопрос рассмотрим ситуацию с КПК Cassiopeia BE 300. Чтобы запустить ewe-файл на этом КПК, нам сначала придется запустить Ewe Launcher и только из него запустить нужный нам файл. Если же мы преобразуем этот файл в формат исполнимого (для этого в списке Targets нужно выбрать пункт Casio BE300 и нажать кнопку Build Targets), будет создан файл с расширением .exe. От исходного Ewe-файла этот файл отличается тем, что содержит код, необходимый для запуска виртуальной машины. Таким образом, получившийся файл можно запускать непосредственно из диспетчера файлов. По такому же принципу будет работать файл, сгенерированный при выборе в списке целевых платформ пункта x86 - Win32 – Dynamic Linked. Если же выбрать пункт x86 - Win32 – Static Linked, получившийся в результате генерации exe-файл по своим размерам будет значительно превышать исходный (так как в него будут включены разделяемые библиотеки классов), но зато этот файл можно будет выполнять в системе, где виртуальная машина Ewe не установлена. Аналогично, выбрав цель Jar – Java, можно сгенерировать jar-файл, выполняющийся на стандартной машине Java, но не нуждающийся в наличии самостоятельных библиотек классов Ewe.
Вкладка Developer Tools содержит ряд инструментов, призванных помочь разработчикам Ewe-программ. Самым интересным из этих инструментов является Ewe Native Builder, позволяющий создавать заготовки контейнеров для использования в Ewe-приложениях библиотек, написанных на C++ (или других языках).
Некоторые проблемы могут возникнуть с русификацией приложений. Поскольку, как и в стандартном Java, в Ewe во всех операциях с текстом используется кодировка Unicode, проблем в работе приложений с символами национальных языков не возникает. Поставляемый вместе с Ewe текстовый редактор (который сам является Ewe-приложением) прекрасно справляется с вводом кириллицы на русифицированных платформах. Проблемы возникают при переводе на русский язык надписей, являющихся частью интерфейса самих приложений.
Вернемся к листингу приложения примера и заменим строку “Hello World!” на строку “Привет, Мир!”. Диалоговое окно скомпилированного и запущенного приложения будет содержать абракадабру. Проблема заключается в том, что при обработке строковых констант компилятор jikes обрабатывает строку побайтно, причем каждый байт рассматривается как код символа из первых 256 символов кодировки Unicode. Если строковая константа содержит ASCII-символы, коды которых совпадают с кодами этих символов в Unicode (например, символы английского языка и знаки препинания), никаких проблем не возникает. Однако с кириллицей дело обстоит иначе, так как коды кириллических знаков в кодировке Unicode находятся за пределами первых 256 символов. Многие Java IDE автоматически преобразуют символы локальной кодировки в Unicode, используя данные локали операционной системы. Однако компилятор jikes такой возможностью не обладает. В результате, при работе с jikes, преобразовывать символы кириллицы в Unicode придется явным образом.
Для этого мы можем создать специальный класс-перекодировщик (стоит напомнить, что в Java минимальной независимой единицей программного кода, которую можно поместить в отдельный модуль, является класс, а не функция).
package welcome;
public class Converter{
public static String ASCII2Unicode(String s)
{
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++)
c[i] = ((c[i]>=0xc0) && (c[i]<=0xff)) ?
(char) (c[i] + 0x350) : c[i];
return new String(c);
}
}
Теперь мы можем использовать класс Converter в нашем приложении:
MessageBox mb = new MessageBox("Ewe", Converter.ASCII2Unicode("Привет, Мир!"), MessageBox.MBOK);
Поскольку метод ASCII2Unicode объявлен как static, нам не нужно создавать экземпляр класса Converter.
Теперь окно нашего тестового приложения будет выглядеть так (рис. 4):
Русифицированное приложение
Рисунок 4. Русифицированное приложение

Удаленный доступ

Рассмотрим обещанный пример связи между устройствами с помощью Ewe. Пакет ewe.io включает класс RemoteConnection, который позволяет осуществлять взаимодействие между десктопом и КПК, если эти устройства связаны при помощи программы ActiveSync (которая позволяет использовать специальную утилиту EweSync, поддерживающую связь на стороне десктопа). Класс RemoteConnection является двунаправленным. Его можно использовать как в приложениях, выполняющихся на десктопе, для связи с КПК, так и в КПК-приложениях для связи с десктопом. Возможности класса RemoteConnection довольно обширны, мы опишем здесь только одну из них – запуск программы на одном устройстве по команде с другого устройства. Напишем программу Remote:
package remote;
import ewe.io.*;

public class Remote{
public static void main(String args[])
{
ewe.sys.Vm.startEwe(args);
try
{
RemoteConnection rc = RemoteConnection.getConnection();
rc.execRemote("\"C:\\Program Files\\Internet
Explorer\\IEXPLORE.exe\"", 0);
}
catch(Exception e)
{
e.printStackTrace();
}
ewe.sys.Vm.exit(0);
}
}
Будучи запущена на КПК, эта программа запустит экземпляр Internet Explorer на настольном компьютере (естественно, вы должны указать правильный путь к программе Internet Explorer на настольной машине). Обратите внимание на то, как мы работаем с кавычками в строковой константе.
Функция getConnection является статическим методом класса RemoteConnection. С помощью этого метода мы можем получить экземпляр класса RemoteConnection. Метод execRemote позволяет выполнять приложения на удаленном компьютере. Поскольку методы getConnection и execRemote могут генерировать исключения, их необходимо вызывать в окружении блоков try-catch.
Сохраните текст листинга в файле Remote.java, скомпилируйте, скомпонуйте в приложение Ewe, как было описано выше и перенесите получившуюся Ewe-программу на КПК.
Установите связь с КПК с помощью приложения ActiveSync и запустите программу ewesync.exe (на многих системах ewesync запустится автоматически вместе с ActiveSync). На панели задач десктопа должен появиться значок Ewe, свидетельствующий о том, что связь установлена. Запустите приложение remote.ewe на КПК. При этом на десктопе должен запуститься Internet Explorer.

Siemens Mobility Toolkit

Спектр приложений для мобильных телефонов в настоящее время довольно широк. Это не только игры и простые калькуляторы, но и различные программы обработки данных, принимаемых и передаваемых с помощью мобильного телефона. А набор форматов таких данных, как и емкость устройств хранения мобильных телефонов постоянно возрастают. Неудивительно, что многие мобильные телефоны поддерживают Java как средство разработки дополнительных приложений. Пакет Siemens Mobility Toolkit (SMTK), предназначенный для телефонов одноименной компании включает специализированную библиотеку времени выполнения и ряд дополнительных инструментов. С помощью SMTK можно создавать приложения, управляющие набором номера, обработкой SMS, мобильным Интернетом. SMTK-приложения могут взаимодействовать с инфракрасным портом, встроенным модемом, файловой системой телефона и работать с различными типами файлов.
SMTK состоит из двух частей – ядра и эмулятора телефонов. Ядро SMTK содержит все библиотеки, необходимые для разработки приложений. Поскольку SMTK не предназначен для десктопов, как Ewe, для отладки приложений необходимо использовать специальный программный эмулятор телефона (рис. 5).
Эмулятор телефона Siemens S 55
Рисунок 5. Эмулятор телефона Siemens S 55
Для каждой поддерживаемой модели необходимо загрузить свой эмулятор. Благодаря эмуляторам вы можете вести разработку и тестирование приложений для разных моделей телефонов Siemens, не приобретая их все.
Полезной характеристикой Siemens Mobility Toolkit является возможность интеграции со сторонними средствами разработки, такими как Borland JBuilder. Интеграция со средами разработки выполняется еще на этапе установки ядра SMTK (рис. 6).
Интеграция с Borland JBuilder во время установки
Рисунок 6. Интеграция с Borland JBuilder во время установки
Для полной интеграции SMTK с Borland JBuilder нужно воспользоваться утилитой Prefs.exe (рис. 7.)
Утилита SMTK Manager
Рисунок 7. Утилита SMTK Manager
После этого в проекте JBuilder в окне Project Properties на вкладке Paths, в поле JDK нужно выбрать пункт Siemens Mobility Toolkit. После этого отладку и запуск приложения можно выполнять прямо из JBuilder IDE (при запуске приложения запускается эмулятор). Классы, предназначенные для создания пользовательского интерфейса приложения, содержатся в пакете javax.lcdui.
Пример простейшего приложения (Hello World), взятого (с небольшими изменениями) из документации к SMTK:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
/*
* Программа Hello, World! импортирует пакеты lcdui и midlet.
* пакет midlet содержит базовые классы приложения, а пакет
* lcdui – классы для построения пользовательского интерфейса.
*/

public class Hello extends MIDlet implements CommandListener
{
static final String EXIT_COMMAND_LABEL = "Exit hello world";
static final String AGAIN_COMMAND_LABEL = "Again, again ...";
Display display;
static Hello hello;

protected void destroyApp (boolean b)
{
display.setCurrent(null);
this.notifyDestroyed(); // notify KVM
}

protected void pauseApp ()
{ }

protected void startApp ()
{
// Класс HelloCanvas определен ниже.
HelloCanvas canvas = new HelloCanvas();

display = Display.getDisplay(this);

Command exitCommand = new Command(EXIT_COMMAND_LABEL ,
Command.SCREEN, 0);
Command againCommand = new Command(AGAIN_COMMAND_LABEL,
Command.SCREEN, 1);
canvas.addCommand(exitCommand);
canvas.addCommand(againCommand);
canvas.setCommandListener(this);

display.setCurrent(canvas);

}

public void commandAction (Command c, Displayable d)
{
String label = c.getLabel();
if (label == EXIT_COMMAND_LABEL ) {
destroyApp(false);
} else if (label == AGAIN_COMMAND_LABEL ) {

}
}

}

/*
* Класс HelloCanvas, являющийся потомком класса Canvas,
* выполняет графический вывод приложения
* (выводит строку "Hello World!").
*/
class HelloCanvas extends Canvas
{
public void paint (Graphics g)
{
Font font = Font.getFont(Font.FACE_PROPORTIONAL,
Font.STYLE_BOLD, Font.SIZE_LARGE);
g.setFont(font);
g.setColor(0,0,0);
String str = new String("Hello World !");

g.drawString(str, getWidth()/2,getHeight()/2,
Graphics.HCENTER | Graphics.BASELINE);
}
}

Комментариев нет:

Отправить комментарий