Оболочка MIDP для Android/Портирование простого мидлета
Изучение процесса портирования мидлетов на Android начнем с чего-нибудь простого. В качестве примера возьмем мидлет, который выводит на экран коды нажатых кнопок, значение функции System.currentTimeMillis()
, и текущую частоту обновления экрана:

С одной стороны, это достаточно простой пример, и нам не придется сходу разбираться со множеством ошибок, вызванных нестыковками между API Java ME и оболочки. С другой стороны, даже этот простой мидлет позволит проверить работоспособность основной части оболочки, а также протестировать виртуальную клавиатуру[2].
Содержание |
Создание проекта в Eclipse
- Создаем в Eclipse новый проект (File -> New -> Project)
- Выбираем Android Application Project
- Настройки проекта указываем такие:
- Application Name и Project Name — любые, например «TestCanvas»
- Package Name — также можно указать любое, например
app.testcanvas
- Нажимаем Next и на следующем экране меняем:
- Create custom launcher icon — снять
- Create activity — снять
- Нажимаем Finish
Подключение библиотеки с оболочкой
- Открываем свойства проекта (Project -> Properties)
- В списке слева выбираем Android
- Внизу, где список библиотек, нажимаем кнопку Add
- В появившемся списке выбираем ранее созданный проект MIDPShell
- Два раза нажимаем OK
Копирование исходников, исправление ошибок
Проект создали, теперь нужно поместить туда исходники мидлета. Распаковываем архив, и копируем содержимое папкиsrc
в точно такую же папку в проекте для Anrdoid[3].
Как видите, ошибки остались только в файле Test.java
, то есть непосредственно в классе мидлета.
Открываем этот файл, и видим, что ошибка всего одна:
The type Test must implement the inherited abstract method MIDlet.initApp()
То есть в классе Test
должен быть реализован абстрактный метод initApp()
, унаследованный от класса MIDlet
. В Java ME такого метода нет. А в Android этот метод — единственная на данный момент вменяемая альтернатива конструктору класса MIDlet
. Поэтому, чтобы исправить эту ошибку, просто находим конструктор
public Test() { ... }
и переименовываем в
public void initApp() { ... }
Сохраняем файл, и видим, что ошибок больше нет.
Редактирование AndroidManifest.xml
- Открываем файл
AndroidManifest.xml
, и переключаемся на вкладку «Application» - В поле Name нажимаем Browse и выбираем
Test
- В списке Application Nodes нажимаем Add -> Activity
- Справа в поле Name нажимаем Browse
- Снимаем отметку с Display classes from sources of project 'TestCanvas' only, поскольку интересующие нас классы находятся в проекте «MIDPShell», а не «TestCanvas»
- В списке выбираем
CanvasActivity
- Аналогично добавляем
ScreenActivity
иConfigActivity
- В списке Application Nodes выделяем
ConfigActivity
и нажимаем Add -> Intent Filter
- В списке Application Nodes выделяем Intent Filter под
ConfigActivity
и нажимаем Add -> Action
- Справа в списке Attributes for Action выбираем
android.intent.action.MAIN
- Снова выделяем Intent Filter для
ConfigActivity
и нажимаем Add -> Category
- Справа в списке Attributes for Category выбираем
android.intent.category.LAUNCHER
- В результате этих манипуляций строчка
ConfigActivity
должна принять следующий вид:
Файл AndroidManifest.xml
должен выглядеть примерно так:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="app.testcanvas" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="16" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:name="test.Test"> <activity android:name="javax.microedition.lcdui.Display$CanvasActivity"></activity> <activity android:name="javax.microedition.lcdui.Display$ScreenActivity"></activity> <activity android:name="javax.microedition.shell.ConfigActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
Что получилось
- TestCanvas.jar — оригинальный мидлет на Java ME
- TestCanvas.apk — мидлет, портированный на Android
И таким вот образом можно будет портировать (почти) любой мидлет с Java ME на Android…
Рецепт
- Описание оболочки
- Подготовка необходимых библиотек в Eclipse
- Портирование простого мидлета
- Портирование Ancient Empires II RM
Примечания
- ↑ Да, там действительно получается 486 кадров в секунду. Но это частота вызова метода
Canvas.paint()
. В реальности все упирается в частоту обновления монитора, которая обычно составляет 60 кадров в секунду. - ↑ Позволил, да еще как… Оболочка версии 1.0 проверку этим мидлетом не прошла совершенно, и ее пришлось в срочном порядке дорабатывать. С оболочкой версии 1.1 все работает нормально.
- ↑ Это можно сделать непосредственно в Eclipse: в окне «Package Explorer» в проекте TestCanvas щелкаем правой кнопкой мыши по папке src, и выбираем пункт «Paste».