Java ME to Android

от
Android    javame

В этой статье рассмотрим как портировать Java ME приложение на Android. Для примера возьмём какую-нибудь программу. Я в загрузках сайта выбрал эту. Ах да, все делать будем в NetBeans IDE с установленным плагином Android.

     Так, как Android та же Java, но с другим API, то можно пойти двумя путями: переписывать каждый класс на Android, что, особенно в больших проектах, может быть трудоемко и очень долго и второй, универсальный способ – написать классы-обертки для Java ME классов, которых нет в Android (Display, Image, Form, Command, etc). К счастью для этого уже есть готовая библиотека AndroidMIDPShell. Также понадобиться библиотека Android Color Picker. Для начала нужно скачать их AndroidMIDPShellMod.zip

     Теперь нужно выполнить некоторые манипуляции:

1) создаем новый Android проект в NetBeans. Имя проекта и пакет могут быть произвольными, но надо учитывать, что пакет должен быть уникальным. Например, имя MidEdit, пакет com.annimon.midedit;
2) удаляем созданные автоматически файлы MainActivity.java и всю папку res;
3) в папку src копируем все файлы из папки src Java ME проекта;
4) теперь копируем в src папки javax и yuku из библиотеки AndroidMIDPShell;
5) далее папку res из библиотеки вставляем в проект;
6) создаем папку assets и ложем в нее папку res из Java ME проекта;
7) и, напоследок, скачаем уже собранную программу, вытащим из нее папку META-INF и положим ее в assets.
Теперь в классах javax.microedition.shell.ConfigActivity, yuku.ambilwarna.AmbilWarnaDialog, yuku.ambilwarna.AmbilWarnaKotak исправляем импорт класса R. Теперь в главном классе, в данном случае main.Main нужно добавить метод:
  1. @Override
  2. public void initApp() {}
     Я так и не понял зачем он нужен. Вызывается перед startApp().
Редактируем манифест вот по этому шаблону:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest android:versionCode="1" android:versionName="1" package="you.package"
  3.           xmlns:android="http://schemas.android.com/apk/res/android">
  4.     <uses-permission android:name="android.permission.VIBRATE" />
  5.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  6.     <application android:theme="@style/Theme.Device.Light" android:label="AppName" android:icon="@drawable/icon" android:name="MainMIDletClass" android:allowClearUserData="true" android:hasCode="true" android:allowBackup="true">
  7.         <activity android:name="javax.microedition.shell.ConfigActivity">
  8.             <intent-filter>
  9.                 <action android:name="android.intent.action.MAIN" />
  10.                 <category android:name="android.intent.category.LAUNCHER" />
  11.             </intent-filter>
  12.         </activity>
  13.         <activity android:name="javax.microedition.lcdui.Display$ScreenActivity" />
  14.         <activity android:name="javax.microedition.lcdui.Display$CanvasActivity" />
  15.     </application>
  16. </manifest>
     Вот и все. Но NetBeans показывает еще несколько ошибок. Далее придется допиливать все вручную. Например, пришлось удалить класс Responder и удалить места, где он используется (этот класс нужен для телефонов SonyEricsson, как я понял). Также во всех наследниках Canvas нужно в переопределенных методах заменить модификатор protected на public. Также в библиотеке в классе RecordStore отсутствовал метод getRecordSize. Пришлось его добавить
  1. public int getRecordSize(int recordID) throws IOException {
  2.     return ContextHolder.getContext().openFileInput(getRecordFileName(recordID)).available();
  3. }
     Также нужно заменить все вызовы getClass().getResourceAsStream(…) на ContextHolder.getResourceAsStream(…).
В результате у меня приложение (MidEdit) запустилось 2143862.png, даже в редактор зашел, но меню неправильно отображалось и приложение часто вылетало. Вывод – попробовать можно, но чем больше проект, тем меньше шансов, что приложение успешно портируется и будет при этом юзабельно.

     Скачать весь портированный проект MidEditPortable.zip
  • +9
  • views 10227