Java ME to Android
от Naik
В этой статье рассмотрим как портировать 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 нужно добавить метод:
Я так и не понял зачем он нужен. Вызывается перед startApp().
Редактируем манифест вот по этому шаблону:
Вот и все. Но NetBeans показывает еще несколько ошибок. Далее придется допиливать все вручную. Например, пришлось удалить класс Responder и удалить места, где он используется (этот класс нужен для телефонов SonyEricsson, как я понял). Также во всех наследниках Canvas нужно в переопределенных методах заменить модификатор protected на public. Также в библиотеке в классе RecordStore отсутствовал метод getRecordSize. Пришлось его добавить Также нужно заменить все вызовы getClass().getResourceAsStream(…) на ContextHolder.getResourceAsStream(…).
В результате у меня приложение (MidEdit) запустилось , даже в редактор зашел, но меню неправильно отображалось и приложение часто вылетало. Вывод – попробовать можно, но чем больше проект, тем меньше шансов, что приложение успешно портируется и будет при этом юзабельно.
Скачать весь портированный проект MidEditPortable.zip
Так, как 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 нужно добавить метод:
- @Override
- public void initApp() {}
Редактируем манифест вот по этому шаблону:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest android:versionCode="1" android:versionName="1" package="you.package"
- xmlns:android="http://schemas.android.com/apk/res/android">
- <uses-permission android:name="android.permission.VIBRATE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <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">
- <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>
- <activity android:name="javax.microedition.lcdui.Display$ScreenActivity" />
- <activity android:name="javax.microedition.lcdui.Display$CanvasActivity" />
- </application>
- </manifest>
- public int getRecordSize(int recordID) throws IOException {
- return ContextHolder.getContext().openFileInput(getRecordFileName(recordID)).available();
- }
В результате у меня приложение (MidEdit) запустилось , даже в редактор зашел, но меню неправильно отображалось и приложение часто вылетало. Вывод – попробовать можно, но чем больше проект, тем меньше шансов, что приложение успешно портируется и будет при этом юзабельно.
Скачать весь портированный проект MidEditPortable.zip