Оболочка MIDP для Android/Портирование простого мидлета

Материал из Project D8
Перейти к: навигация, поиск

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

Мидлет «TestCanvas» на эмуляторе[1]

С одной стороны, это достаточно простой пример, и нам не придется сходу разбираться со множеством ошибок, вызванных нестыковками между API Java ME и оболочки. С другой стороны, даже этот простой мидлет позволит проверить работоспособность основной части оболочки, а также протестировать виртуальную клавиатуру[2].

Содержание

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

  1. Создаем в Eclipse новый проект (File -> New -> Project)
  2. Выбираем Android Application Project
  3. Настройки проекта указываем такие:
    Создание проекта TestCanvas, шаг 1
    • Application Name и Project Name — любые, например «TestCanvas»
    • Package Name — также можно указать любое, например app.testcanvas
  4. Нажимаем Next и на следующем экране меняем:
    Создание проекта TestCanvas, шаг 2
    • Create custom launcher icon — снять
    • Create activity — снять
  5. Нажимаем Finish

Подключение библиотеки с оболочкой

  1. Открываем свойства проекта (Project -> Properties)
  2. В списке слева выбираем Android
  3. Внизу, где список библиотек, нажимаем кнопку Add
  4. В появившемся списке выбираем ранее созданный проект MIDPShell
    Выбор библиотеки для подключения

  5. Два раза нажимаем OK
    После подключения библиотеки MIDPShell

Копирование исходников, исправление ошибок

Проект создали, теперь нужно поместить туда исходники мидлета. Распаковываем архив, и копируем содержимое папки src в точно такую же папку в проекте для Anrdoid[3].
После подключения библиотеки MIDPShell

Как видите, ошибки остались только в файле 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

  1. Открываем файл AndroidManifest.xml, и переключаемся на вкладку «Application»
  2. В поле Name нажимаем Browse и выбираем Test
    AMS PortGuide 23.png

  3. В списке Application Nodes нажимаем Add -> Activity
    Создание Activity

  4. Справа в поле Name нажимаем Browse
    CanvasActivity
  5. Снимаем отметку с Display classes from sources of project 'TestCanvas' only, поскольку интересующие нас классы находятся в проекте «MIDPShell», а не «TestCanvas»
  6. В списке выбираем CanvasActivity
  7. Аналогично добавляем ScreenActivity и ConfigActivity
    ScreenActivity
    ConfigActivity

  8. В списке Application Nodes выделяем ConfigActivity и нажимаем Add -> Intent Filter
    Создание Intent Filter

  9. В списке Application Nodes выделяем Intent Filter под ConfigActivity и нажимаем Add -> Action
    Создание Action

  10. Справа в списке Attributes for Action выбираем android.intent.action.MAIN
    Выбор действия для ConfigActivity

  11. Снова выделяем Intent Filter для ConfigActivity и нажимаем Add -> Category
    Создание Category

  12. Справа в списке Attributes for Category выбираем android.intent.category.LAUNCHER
    Выбор категории для ConfigActivity

  13. В результате этих манипуляций строчка ConfigActivity должна принять следующий вид:
    Окончательные настройки для 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>

Что получилось

  1. TestCanvas.jar — оригинальный мидлет на Java ME
  2. TestCanvas.apk — мидлет, портированный на Android

И таким вот образом можно будет портировать (почти) любой мидлет с Java ME на Android…

Рецепт

  1. Описание оболочки
  2. Подготовка необходимых библиотек в Eclipse
  3. Портирование простого мидлета
  4. Портирование Ancient Empires II RM

Примечания

  1. Да, там действительно получается 486 кадров в секунду. Но это частота вызова метода Canvas.paint(). В реальности все упирается в частоту обновления монитора, которая обычно составляет 60 кадров в секунду.
  2. Позволил, да еще как… Оболочка версии 1.0 проверку этим мидлетом не прошла совершенно, и ее пришлось в срочном порядке дорабатывать. С оболочкой версии 1.1 все работает нормально.
  3. Это можно сделать непосредственно в Eclipse: в окне «Package Explorer» в проекте TestCanvas щелкаем правой кнопкой мыши по папке src, и выбираем пункт «Paste».
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Список
Инструменты