Сообщений 0    Оценка 45        Оценить  
Система Orphus

Кросс-платформенное программирование в среде Ewe

Автор: Андрей Боровский
Источник: RSDN Magazine #1-2004
Опубликовано: 14.08.2004
Исправлено: 05.03.2006
Версия текста: 1.0
Разработка Ewe-программ. Что необходимо?
Простейшее приложение
Удаленный доступ

Главным преимуществом среды Java как средства создания самостоятельных приложений является кросс-платформенность не только на уровне исходного кода, но и скомпилированных программ. Байт-код может выполняться на любой платформе, для которой реализована соответствующая виртуальная машина. Неудивительно поэтому, что на Java написаны средства инсталляции продуктов Oracle и Borland, а различные «малые» платформы – мобильные и встроенные устройства используют Java в качестве одного из основных средства разработки.

В этой статье речь пойдет о программировании в основанной на Java среде Ewe, позволяющей создавать приложения как для настольных платформ, так и для мобильных устройств. Среда Ewe реализована для платформ Windows, Linux (как для десктопов, так и для Sharp Zaurus 5500), PocketPC, Casio Cassiopeia BE-300 (поддерживается как «родная» ОС, так и Epod), PalmPC, HandHeld PC Pro/2000.

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

Важным достоинством Ewe, которое нельзя не отметить, являются условия распространения пакета. Ewe распространяется на условиях Royalty Free, что позволяет программисту не только бесплатно использовать Ewe для разработки приложений, в том числе и коммерческих, но и распространять саму ВМ вместе с приложениями.

Если виртуальная машина Ewe установлена, приложения Ewe выполняются, как и любые другие приложения для данной платформы.


Рисунок 1.

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


Рисунок 2.

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

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

Пакет разработки включает в себя:

Следует иметь в виду, что документация по разработке в архив Ewe SDK не входит. Архив с документацией (в формате HTML) нужно скачать отдельно, следуя инструкциям, приведенным на сайте и в справочных файлах SDK.

Для компиляции приложений Ewe подойдет и стандартный Java-компилятор, однако с сайта EweSoft можно загрузить специальный компилятор Jikes, запускаемый из командной строки.

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

Хотя программирование Ewe-приложений основано на Java, между Ewe и стандартным Java существуют некоторые различия.

Ewe не использует классы из стандартного пакета java., за исключением некоторых классов из пакета java.lang. Следует отметить, что интерфейсы многих классов Ewe аналогичны интерфейсам стандартных классов Java, так что перенос существующего Java-кода на Ewe не вызовет особых затруднений.

Как и Java, Ewe поддерживает многопоточные приложения, однако интерфейс программирования потоков в Ewe отличается от интерфейса Java.

Запуск и остановка приложений Ewe выполняется несколько иначе, чем запуск и остановка стандартных Java-программ (подробнее этот вопрос будет рассмотрен далее).

Следует также учесть, что Ewe-приложения не используют общепринятые в мире Java библиотеки построения графического интерфейса – Swing и AWT. Вместо этого необходимо использовать классы, предоставляемые пакетами ewe.ui, ewe.fx, ewe.graphics, ewe.filechooser и некоторыми другими.

Пакет Ewe учитывает специфику мобильных устройств, например, существует возможность расположения окон приложения в режиме ландшафта (Landscape mode), который лучше соответствует геометрии экрана мобильного устройства.

Другой интересной особенностью Ewe является возможность установки связи между мобильным и «стационарным» устройством. Если связь между десктопом и мобильным устройством осуществляется с помощью программы ActiveSync, вы можете воспользоваться утилитой ewesync.exe, входящей в состав Ewe для организации взаимодействия средствами Ewe-приложений. Ниже будет рассмотрен пример использования связи между компьютерами с помощью Ewe.

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

Рассмотрим текст простейшего приложения в среде 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.exit перед завершением работы программы. Данный метод высвобождает ресурсы, выделенные программе ВМ 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.

В поле 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. Если все прошло успешно, на экране должно появиться окно:


Рисунок 4.

Рассмотрим функции других закладок утилиты Jewel Program Creator. Закладка Create Programs позволяет создавать исполнимые файлы в форматах, отличных от формата исполнимого файла виртуальной машины Ewe. Исполнимые файлы некоторых форматов по-прежнему будут нуждаться в наличии Ewe ВМ, другие же смогут выполняться самостоятельно.


Рисунок 5.

Возникает вопрос, зачем нужно преобразовывать приложение из формата .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++ (или других языках).


Рисунок 6.

Рассмотрим проблемы, возникающие с русификацией приложений. Поскольку, как и в стандартном Java, во всех операциях с текстом используется кодировка Unicode, проблем в работе приложений с символами национальных языков не возникает. Поставляемый вместе с Ewe текстовый редактор (который сам является Ewe-приложением) прекрасно справляется с вводом кириллицы на русифицированных платформах. Проблемы возникают при переводе на русский язык надписей, являющихся частью интерфейса самих приложений.

Вернемся к листингу приложения примера и заменим строку “Hello World!” на строку “Привет, Мир!”. Диалоговое окно скомпилированного и запущенного приложения будет содержать абракадабру. Проблема заключается в том, что при обработке строковых констант компилятор jikes обрабатывает строку побайтно, причем каждый байт рассматривается как код символа из первых 256 символов кодировки Unicode. Если строковая константа содержит ASCII-символы, коды которых совпадают с кодами этих символов в Unicode (например, символы английского языка и знаки препинания), никаких проблем не возникает. Однако с кириллицей дело обстоит иначе, так как коды кириллических знаков в кодировке Unicode находятся за пределами первых 256 символов. Многие Java IDE автоматически преобразуют символы локальной кодировки в Unicode, используя данные локали операционной системы. Однако компилятор jikes такой возможностью не обладает. В результате при работе с jikes преобразовывать символы кириллицы в Unicode придется явным образом.

Это можно делать, например, так:

// Фраза "Привет, Мир!" в кодировке Unicode
char[] c = 
{
  0x41f, 0x440, 0x438, 0x432, 0x435, 0x442, 
  0x2c, 0x20, 0x41c, 0x438, 0x440, 0x21
}; 
MessageBox mb = new MessageBox("Ewe", new String(c),
MessageBox.MBOK);

Если переводить надписи приходится часто, можно создать специальный класс, например:

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.

Каким бы методом мы не воспользовались, после запуска программы Welcome.ewe мы увидим следующее:


Рисунок 7.

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

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

Пакет ewe.io включает класс RemoteConnection, который позволяет осуществлять взаимодействие между десктопом и КПК, если эти устройства связаны при помощи программы ActiveSync. Класс 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.

Сохраните текст листинга в файле Remote.java, скомпилируйте, скомпонуйте в приложение Ewe, как было описано выше, и перенесите получившуюся Ewe-программу на КПК.

Установите связь с КПК с помощью приложения ActiveSync и запустите программу ewesync.exe (на многих системах ewesync запустится автоматически вместе с ActiveSync). На панели задач десктопа должен появиться значок Ewe, свидетельствующий о том, что связь установлена. Запустите приложение remote.ewe на КПК. При этом на десктопе должен запуститься Internet Explorer.

Каково положение и перспективы Ewe в мире средств программирования? Среда Ewe интересна тем, что представляет собой разновидность средств разработки Java, ориентированную прежде всего на создание независимых приложений, а не апплетов и сервлетов. При этом Ewe вряд ли составит серьезную конкуренцию мощным «настольным» средствам разработки Java. Что же касается перспектив успеха Ewe в мире КПК и иных мобильных устройств, то тут все зависит от того, как будет расширяться список платформ, поддерживаемых этой системой.


Эта статья опубликована в журнале RSDN Magazine #1-2004. Информацию о журнале можно найти здесь
    Сообщений 0    Оценка 45        Оценить