Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
Вся правда о Java на PocketPC
Постоянная ссылка 19-02-2008 anydoby java

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

Выбор платформы пал на MIDP2.0, так как я с ней больше всего знаком. Да и писать под нее довольно просто. В общем, сказано - сделано. Был написан прототип и запущен на одной из многих JVM под кпк (TAO TurboTweaked v11.1.7_1023). И тут нас ждало первое разочарование - разрабатывать-то легко, но уж больно стандартные компоненты MIDP выглядят хреново. Особенно удручил серый фон формы в эмуляторе, который никакими средствами не поменяешь на нейтральный белый. Особенно это раздосадовало нас оттого что логотип клиента был на белом фоне. Представляете картину? :)

Второй пункт, который не понравился - ограничения безопасности мидлетов. Для того, чтобы писать в файловую систему, нужно прописать разрешения в дескрипторе и подписать мидлет. А на Windows mobile 5.0 поставить свой сертификат дело нетривиальное.

Было решено попробовать других JVM. Особенно приглянулась сразу Mysaifu, так как бесплатная и поддерживает Java 1.4 почти полностью. Был сделан порт на Swing и немедленно запущен (здесь я не описываю всех прелестей борьбы со стандартными Layoutами и написание компонента, который может корректно переносить длинные предложения по строкам, чего в свинге, по моему, не будет никогда). Выглядит вроде ничего, но тормозит безбожно. Скроллинг просто убивает машинку напрочь.

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

После непродолжительных поисков выяснилось, что неплохо зарекомендовала себя JVM от IBM - J9. Многие блоггеры восхваляют ее как саму дешевую и самую надежную из всех написанных для Pocket PC. К сожалению, оказалось, что стоит она уже не 6 уе, а целых 25. Ну нам это не помеха - всегда можно скачать кряк. В общем, поставил я версию J9 с поддержкой MIDP2.0. Все просто зашибись - работает. Формочка на белом фоне :) Но, когда добрались до сохранения, нас ждал сурприз: в поставке JVM нет имплементации JSR-75 - FileConnection API. Качаем эту либу с какого-то сайта, ставим - не работает. И без объяснений.

Что же делать?

Читаем дальше, находим, что у IBM есть еще версия с поддержкой Personal Profile 1.1 - а это значит можно по идее заюзать SWT. Ну что ж. Пишу порт на SWT - на компьютере выглядит все просто сказочно - нативные виджеты и все дела... Устанавливаем SWT на JVM тоже довольно просто - dll в папку bin, swt.jar - в папку ext. О чудо, оно запустилось и работает. Да вот опять беда - клиенту не нравится, что радио кнопки слишком большие (а как я их сделаю меньше, это ж виндовз их такими рисует, и никуда не денесся), и что внизу экрана на белом фоне отвратительное синее пятно - кнопка показать софтовую клавиатуру.

Еще один сюрприз от SWT версии для PocketPC - нет org.eclipse.swt.custom.ScrolledComposite, то есть скроллинга нормального. Проблема, оказывается, легко решаема - нужно просто скопировать к себе в проект исходник этого класса из исходников SWT (еще понадобится класс ScrolledCompositeLayout). Или же можно в swt.jar добавить эти классы из версии библиотеки для десктопа - работает все нормально. Не понимаю, зачем было так урезать библиотеку.

И снова к нашим баранам - решаем докопаться до глубин - почему не работает запись в файл на J9 MIDP 2.0. При попытке создать путь к файлу согласно спецификации - file://localhost/SD Card[file.separator]myfolder выкидывается вот такая ошибка -


java.lang.IllegalArgumentException: The file connection url cannot include file separator

Обалдеть, а как же мне папки отделать друг от друга? Оказывается, все просто, используем / и никаких System.getProperty("file.separator") IBMовский трактор знает, куда едет.

Да, что приятно в J9 - можно поставить permissions на мидлет независимо от того, есть у него сертификат и подписан ли он. Идем в Manage и ставим разрешения на всех нужных фичах.

В конце-концов продукт сдан и все счастливы. Получен ценный опыт со всеми видами JVM, надеюсь, мой опыт кому-то будет полезен.

Добавить комментарий

Предыдущая статья Простой табличный LayoutManager для Swing Следующая статья Плагин для упаковки всех зависимостей в один jar под Maven2