Ностальгии пост: j2me, gravity defied, 64kb

No-MVP архитектура

Возможно, кто-нибудь скажет, что надо отделять модель от её представления и применять всякие паттерны для абстракции. Но с другой стороны: посмотрите как подобная задача может быть сделана в Android:

  • Есть layout файл с расположением кнопок. Отдельный для каждой менюшки.
  • Строчки типа названий кнопок выносятся в отдельный файл stings.txt.
  • Есть Activity, которая пересоздаётся по каждому чиху.
  • Есть LifecycleObserver, который даёт возможность биндить текстовое поле к Adapter так, чтобы при смерти Activity та могла уже умереть и не занимать память.
  • Adapter преобразует данные из DataSource.
  • Просто так передавать классы между потоками «не ок», поэтому ещё будем паковать их в Bundle и после получения из DataSource распаковывать обратно.
  • В DataSouce данные закидываются из разных потоков или вообще синхронизуются с SQLite базой данных.

Вопрос: а это всё точно нужно, чтобы обработать перемещение пользователя по внутриигровому меню? Я могу ошибаться в деталях, но суть проблемы должна быть очевидна.

Среда разработки — Android Studio

Android Studio — это официальная среда разработки для Android компании Google (такие штуки называют IDE). В неё кроме редактора кода встроено много других полезных для разработки инструментов:

  • эмулятор смартфона на Android;
  • шаблоны кода для разных приложений;
  • инструменты для тестирования;
  • визуальный редактор для создания интерфейсов;
  • анализатор apk-файлов;
  • мониторинг нагрузки системы.

Часть из них нам пригодится сразу (например, эмулятор и шаблоны приложений), а с остальным познакомимся позже.

Для установки Android Studio заходим на и выбираем нужную операционную систему:

После того как скачается почти гигабайтный файл, запускаем установщик и везде принимаем настройки по умолчанию. Ещё нужно убедиться, что на первом шаге у нас стоит галочка установки виртуального устройства — это эмулятор, в котором будет работать наша программа:

После запуска Android Studio предложить импортировать старые настройки — так как это наш первый запуск, то импортировать ничего не нужно:

Когда все компоненты будут установлены, IDE предложит нам выбор: создать проект с нуля, открыть готовый или подключиться к существующему процессу разработки. Чтобы убедиться, что Android Studio работает, выберем New project (новый проект), а затем — Basic Activity:

Последнее, что нам нужно сделать, — выбрать язык Java, потому что именно на нём мы и будем писать наше приложение:

В итоге мы увидим стандартное окно среды разработки, где уже есть какой-то код и структура проекта. В структуру пока не полезем — про неё поговорим, когда будем делать свою программу.

MEmu

Доступен для скачивания на русском языке. В отличие от предыдущего, он оптимально подходит для игр. Это заметно даже по устройству геймпада и раскладке клавиатуры. Эмулятор совместим с софтом, который устанавливаются через Google Play, также можно загружать приложения с расширением APK.

На MEmu «идут» даже тяжелые игры с хорошо проработанной графикой. Трудностей с производительностью устройства не появляется, может пострадать только качество картинки.

Загрузка аудио, фотографий, видео и картинок осуществляется через соответствующие папки.

Имеется каталог с перечнем всех приложений, но принципиальной функциональности эмулятору это не добавляет.

Эмуляторы Java для Андроид

Программы, способные запускать J2ME-приложения (мидлеты), появились почти одновременно с самой ОС от Google, однако актуальных на сегодняшний день осталось немного. Начнем с наиболее популярного решения.

J2ME Loader

Новейший эмулятор Java-мидлетов, появившийся летом 2017 года. Является улучшенной версией J2meLoader, постоянно обновляется и обретает новые возможности. В отличие от конкурентов, Дж2МЕ Лоадер не требует предварительного конвертирования JAR- и JAD-файлов в APK — эмулятор умеет делать это на лету. Список совместимости тоже выглядит внушительнее, чем у других эмуляторов – поддерживаются приложения вроде Opera Mini и практически все 2D-игры.

А вот с 3D-играми ситуация сложнее – эмулятор умеет запускать лишь некоторые из них вроде особым образом модифицированных версий Galaxy on Fire 1 или Deep 3D. Огорчим желающих поиграть в 3D-игры для Sony Ericcson – они на J2ME Loader не работают и вряд ли заработают вообще. Однако в целом это приложение является одним из самых дружелюбных к пользователю – достаточно просто скачать JAR-файл с игрой и запустить через эмулятор. Для продвинутых пользователей предусмотрены настройки. Рекламы или любого другого вида монетизации в Дж2МЕ Лоадер пока нет, но присутствуют баги (которые, впрочем, оперативно исправляются).

Java J2ME Runner

Довольно старый, но все еще актуальный эмулятор для запуска Джава-мидлетов. Главная особенность – модульность приложения: почти все основные возможности (управление, графические настройки, прочее) реализовано с помощью плагинов. Устанавливать свои плагины или менять имеющиеся нельзя – можно только включать и отключать их.

Совместимость у эмулятора довольно высокая, однако JAR-файлы нуждаются в предварительном конвертировании в APK сторонним методом либо встроенными средствами приложения. Поддержка 3D очень ограничена. Из недостатков: несовместимо с девайсами под управлением Android 7.0+, высокие расширения экрана (FullHD и выше) приводят к графическим багам, морально устаревший интерфейс. Пожалуй, можем рекомендовать этот эмулятор только в качестве единственной альтернативы упомянутому выше J2ME Loader.

Существуют и другие эмуляторы (к примеру, популярный в 2011-2012 годах JBed), однако они на данный момент уже неактуальны, и на современных устройствах неработоспособны.

Архитектура J2ME приложений

При старте приложения у него вызывался метод .
Если приложение сворачивалось — вызывался и снова при повторном открытии. При полноценном закрытии вызывалось .

Кроме того, приложение могло само вызвать методы и — чтобы сообщить о том, что оно поставилось на паузу или завершилось.
Кроме того, приложение могло попроситься «выйти из паузы» методом

Честно говоря, я не очень понимаю смысл , так как и без него приложения нормально работали, никто их не убивал.

Мне кажется, именно таким и должен быть lifecycle приложения здорового человека.

На практике обычно получалось, что класс приложения наследовался от Runnable и реализация выглядела как-то так:

И всё, дальше приложение жило в своём потоке.

Мне кажется, будить поток каждые 100 миллисекунд — не страшно, и такой подход вполне мог бы существовать и на современных телефонах. Вдобавок, никто не запрещает остановить поток после вызова и снова запустить в

Canvas

Можно в любом потоке вызывать метод , который намекнёт системе, что надо бы обновить изображение. После этого в UI-потоке система вызовет . Возможно, у кого-то снова возникнут вьетнамские флешбеки, но при сворачивании приложения с Canvas ничего страшного не происходило — объект оставался валидным на всём протяжении жизни программы. Единственное отличие — у приложения в фоне вызовы игнорировались и метод не вызывался.

Что примечательно, уже тогда поддерживалсь сенсорные дисплеи: были методы, которые на сенсорном телефоне возвращали true. При нажатиях вызывались методы типа (перемещение указателя), а так же версии для (начало нажатия) и (нажатие завершилось).
Поддержки мультитача нет — ну и ладно, тогда и подходящих дисплеев не было.

Шритфы и меню

Что забавно, тогда существовало аж три размера шрифта — малый, средний и большой. Конкретные размеры зависели от телефона. Но, если учесть размеры дисплеев, то это выглядит нормально. Я не думаю, что даже дисплею 240х360 нужно сильно много размеров шрифтов

Самое важное — жирные и курсивные шрифты — поддерживались

Сейчас это как-то унифицировалось, но раньше кнопка «назад» на смартфонах могла располагаться как слева, так и справа. В j2me существовал какой-то механизм создания менюшек, чтобы система сама рисовала пункты меню, поддерживала скроллинг и т.п., а приложение просто узнавало номер выбранного пункта. Например, на nokia 5800 такие менюшки можно было перематывать пальцем, даже если разработчики приложения об этом и не подозревали.

Текстурные атласы

В отличие от современных телефонов с GPU и full hd экранами, в старых телефончиках стояли весьма скромные дисплеи типа ( или ). Необходимости крутить изображения и рисовать 3д объекты как-то не возникало, и в api для картинок такой возможности даже и нет. Единственное, что было можно при рисовании картинки — повернуть её на 90-180-270 градусов и зеркально отразить.

Мне кажется, для того времени это не было проблемой — спрайт размером в десяток пикселей имеет не так уж и много видимых вариантов поворота.
Конкретно в этой игре для корпуса мотоцикла, частей тела и шлема мотоциклиста использовалось по 32 или по 16 спрайтов. Для спрайтов шлема потребовалась картинка размером аж 48*48 пикселей и весом в 1091 байт.

Впрочем, надо отметить, что в то время уже существовало какое-то очень примитивное API для 3д графики с фиксированным 3д пайплайном и я даже играл во что-то 3д-шное. Текстуры были с огромными различимыми пикселями, а восьмиугольные колёса машинок воспринимались как что-то нормальное и высокодетализованное.

Как мне кажется — размеры дисплеев и возможности телефонов очень хорошо подходили для спрайтовой 2д графики и не тянули 3д.

Write once, run everywhere

Изначально java позиционировалась именно для всяких маломощных бытовых устройств. И она очень удачно прописалась на телефонах того времени, позволяя запускать одну и ту же игру на телефонах различных производителей. Конечно, существовали platform-специфичные особенности, но чисто теоретически код должен был одинаково работать везде.

Язык был простым, байткод — тоже. В нём команды длиной в байт для виртуальной стековой машины — написать наивный интерпретатор не так уж и сложно. А ещё по этой причине байткод занимал мало места. Что интересно, внутри .jar у j2me приложения лежат самые настоящие .class файлы от полноценной java. Разница была лишь в том, что мобильное приложение для взаимодействия с внешним миром использовало классы Canvas, MIDlet и прочие из пакета javax.microedition.

Кроме того, мобильная джава поддерживала многопоточность. Как мы увидим дальше, при написании приложений без неё было не обойтись. Что интересно, взгляд на многопоточность тогда был немного иной. Например, у стандартного класса Vector все методы были synchronized. Сейчас Vector считается устаревшим, и предлагается использовать обычный ArrayList в однопоточном коде и тот же самый ArrayList в многопоточном, но явно захватывать блокировку на нём.

Ещё интересная особенность — в старой java не было дженериков. Система типов состояла из примитивов (int, boolean, …) и объектов. Тот же класс Vector хранил внутри себя объекты и возвращал их как Object, а программист после этого кастовал полученное к нужному типу.

Кстати, когда я вижу go и ручные касты к нужным типам, я вспоминаю java 1.3. Только go почему-то застрял в развитии, а в случае в java уже в 2004 году вышла версия 1.5 с поддержкой дженериков. Но в мобильной разработке всё ещё использовалась 1.3.

Так как мобильное j2me приложение — это самый обычный .jar с нормальными .class файлами внутри (пусть и в формате 1.3, которому уже 20 лет), можно этим воспользоваться и запустить Gravity defied прямо на PC. В «большой» java классов из javax.microedition нет, но их можно написать самому. Задача даже проще, так как есть классы с почти таким же набором методов: например, и .

Долгая загрузка

Я обнаружил, что игра, которая собирается с нуля быстрее, чем за секунду, при этом долго грузится. «Хм, подозрительно» — подумал я и полез искать источник тормозов.

Игра вызывает обновление экрана и потом вызывает раз за разом на протяжении трёх секунд. Потом вызывает снова обновление экрана с переключением картинки на другую и снова три секунды вызывает . И после этого вызывает до тех пор, пока они не завершатся.

Честно говоря, я не знаю, почему сделано именно так. Можно было бы просто в отдельном потоке показывать лого и потом через три секунды переключить картинку на другую, а в основном потоке спокойно загружать всё необходимое.

Fixed-point physics

Для рассчётов используются обычные целые числа. Хранятся в виде обычных интов и считается, что младшие 16 бит — это дробная часть. Таким образом, получаются числа, которые принимают значения от до c шагом в .

Мне это решение показалось очень красивым — приличная фиксированная точность сочетается со вполне большим диапазоном используемых значений.

Сложение и вычитание таких чисел ничем не отличается от аналогичных операци с int.

Умножение: если перемножить просто int, то мы получим дробную часть, а целая «переполнится». Для умножения числа сначала преобразовывались в long. При перемножении получалось число на 64 бита с дробной частью из 32 бит. После побитовым сдвигом вправо на 16 можно вернуться обратно к дробным 16-ти битам и обрезать число обратно к int.

Деление: при простом делении дробная часть потеряется. Вместо этого опять нужно преобразование в long, сдвинуть делимое на 16 бит влево и поделить. В игре почему-то сделали иначе, сдвиг влево на 32 и после — вправо на 16.

Сделано довольно просто — есть захардкоженный массив на 64 значения — угол от 0 до 90 градусов. При вычислении синуса или косинуса угол приводится к этому диапазону, потом вычисляется индекс — и по нему читается значение из массива. Получается значение с точностью до полутора градусов. Видимо, для игры этого достаточно.

Как переключиться с одного на другое?

Трудно точно знать, как преобразовать файл JAR в APK, и процесс будет зависеть от типа файла JAR, который мы хотим преобразовать .

Приложения JAR были созданы для почты на Java, и если конкретное приложение было разработано для Android, достаточно простого преобразования. Но если это не так, нам понадобятся некоторые осложнения.

Простой способ

Если приложение было создано для работы на устройстве Android, и единственное, чего не хватает, — это формат APK, просто используйте один из множества онлайн-конвертеры доступны. Расширения файлов — одни из самых популярных конвертеров.

Использование исходного кода

Если вы программист и имеете доступ к исходному коду файла JAR, с которым работаете, самый простой способ — это компилировать исходный код в APK. Если вы не программист, рекомендуется спросить у одного или узнать, как это сделать.

Используйте эмулятор

В большинстве случаев это наиболее удобный способ. Существуют приложения для Android, которые отвечают за запуск приложений JAR без необходимости их преобразования.

Самый известный из них МикроЭМУ , который доступен на GitHub на момент написания. Это позволяет запускать приложения, разработанные для Java ME, системы, используемой Nokia, Motorola, Sony Erickson и аналогичными телефонами в эпоху до появления смартфонов.

Еще одно приложение, которое делает это, — J2ME Loader , доступный в Google Play. Он запускает приложения, разработанные для Java 2ME, исходной версии Java ME, которая также использовалась Nokia и ее конкурентами несколько лет назад.

Самым важным во всех этих процессах является учет технологии, которую вы используете. По мере развития технологий многие очень распространенные программы и языки забываются. Пытаться вернуть их может быть сложно, но оно того стоит. Не сдавайся!

BlueStacks

Поклонникам игр на Android и специалистам по разработке нового софта будут интересны другие качественные программы-эмуляторы, выходящие на ПК.

BlueStacks совместим практически с любыми приложениями, которые можно скачать с Google Play. Дополнительно разработана система специальных наград, в которой очки дают за скаченные приложения. Пользователь обязательно должен в них постоянно играть. Заработанные баллы обмениваются на премиум-подписку, подарочные карты от Google Play, другие приятные подарки.

Не возникает сложностей при загрузке отдельных файлов. Фото, документы, любые сведения легко переносятся из «Проводника» других операционных систем обычным перетаскиванием. Есть возможность переходить из одного приложения в другое, если они уже запущены.

Телефоны того времени.

В техническом плане современные телефоны ушли очень далеко, но в плане функциональности, на мой взгляд, даже старые телефоны позволяли делать всякие интересные вещи.

  • появился в 2006 году
  • дисплей 128×160 пискелей размером в целых 1.8 дюйма
  • Дисплей поддерживал аж 262 тысяч цветов. (если я понимаю, это по 6 бит на R, G, B составляющие).
  • Ик-порт и bluetooth для передачи файлов на другие телефоны.
  • несколько мегабайт долговременной внутренней памяти (точно не помню, в интернете пишут про 7 Мб)
  • слот для microSd карточки, у меня, кажется, была на 256 Мб.
  • уже тогда были какие-то примитивные браузеры и opera mini (которая, кстати, тоже весила буквально сотню килобайт)
  • камера 640×480 пикселей.
  • телефон умел притворяться флешкой при подключении через usb
  • но заряжался через какой-то свой разъём
  • Я не нашёл, какая производительность была у процессоров, но она явно была очень скромной — не больше 100Мгц частоты и, возможно, очень медленная или отсутствующая реализация floating-point чисел. К сожалению, телефон давно умер и запустить какие-либо бенчмарки на нём я не смогу.

Не буду перечислять мобильные игры, в которые играл на нём — просто скажу, что они все весили 50-200кб и при этом обладали достаточно глубоким геймплеем.

Что такое JAR?

JAR — это файл Java. Это тип сжатого файла, который содержит все информация, необходимая для запуска приложения в среде Java.

В файле JAR вы найдете все классы и каталоги, необходимые для запуска приложения, а также его метаданные, логотипы и текстовые файлы. Как вы понимаете, файл JAR — это сжатый файл , кто может быть разархивировать с помощью WinRar или другой популярный декомпрессор.

Так что мы им пользуемся?

Java — очень распространенный язык, имеющий множество применений, и поэтому с ним связано множество расширений файлов. . Файлы JAR в частности, используются для запуска приложений на любой платформе Java. Примером этого может быть игра Minecraft, в которой работает последняя версия java .

Чаще всего файлы Java использовались на телефонах, работающих под управлением системы Java ME или Java 2ME. Эти телефоны использовали файлы JAR для упаковки всех своих приложений .

На этих телефонах файлы JAD использовались с файлами JAD. В этом смысле JAR (в сочетании с файлами JAD) — это старый эквивалент APK, о котором мы поговорим дальше.

Genymotion

С помощью этого приложения можно эмулировать сразу несколько устройств на Android с принципиально разными характеристиками. Перед загрузкой требуется завести аккаунт (платить за него не придется). При авторизации следует это указать.

Для обывателей не самый удобный вариант, так как часть софта из Google Play не запускается, отсутствует русский язык. Но для программистов полезный софт, позволяющий проводить разнообразные тесты. Например, исследовать, как поведет себя конкретное приложение при отключенном GPS или с другой ориентацией экрана.

Новые эмуляторы, облегчающие жизнь пользователям Android, выходят регулярно. Совершенствуется работа существующих приложений, благодаря выпуску постоянных обновлений. Главное, не забывать их загружать.

Средняя оценка 4.3 / 5. Поставлено оценок: 6

Еще никто не поставил оценку.

Нам очень жаль, что Вы разочарованы содержанием этой страницы!

Собираем обратно

Смотреть на код — это хорошо, но неинформативно. Хочется его запускать и, возможно, добавлять отладочный вывод или ещё что-то. А ещё хочется восстановить нормальные имена переменных, методов и классов.

Но старенькая нокия уже не работала, а я хотел собрать и запустить код прямо на своём компе и желательно в Linux. Так что я подготовил gradle проект и попробовал собрать код. Код не собирался — не хватало классов из . Логично — их же нет в PC-версии java. Я решил заняться велосипедостроением и просто механически добавил все несуществующие классы и методы. Игра использует маленькое подмножество из доступных методов и классов, так что это заняло не больше часа времени.

Для удобства я вывел в терминал и в реальном времени смотрел на список ошибок. После добавления каждого нового метода по сохранял изменения.

  • 8 для сохранений в javax.microedition.rms.
  • 10 в .lcdui, которые отвечают за картинки, шрифты, Canvas и т.п.).
  • MIDlet — главный класс, от которого приложение должно наследоваться.

После того как проект компилируется без ошибок, можно попробовать привести его к красивому виду.

В приложении есть класс Micro, в котором имена методов не обфусцированы. В общем-то логично, методы типа startApp унаследованы от MIDlet и переименовать их невозможно.

Пример кода:

Вполне можно догадаться, что переменная могла бы называться .

Для «простых» методов тоже довольно часто можно понять происходящее:

и переименовать во что-то типа .

Кроме того, в intelliJ IDEA можно посмотреть все вызовы каких-то методов. Особенно — тех, заглушки для которых мы написали, типа :

Вполне очевидно, что p можно переименовать в splashImage.

С какой-то точки зрения это похоже на разгадывание судоку — находишь очевидные моменты, даёшь значащие названия переменным и методам. Это упрощает понимание остальных методов, даёшь названия им… Огромный респект разработчикам Jetbrains — я как минимум часов десять лазил по коду, переименовывая переменные с методами — и ни разу код не поломался. Впрочем, я всё равно время от времени компилировал код и убеждался, что он остался рабочим.

В какой-то момент мне это надоело. Я попробовал запустить код и он упал — потому что все мои заглушки типа loadImage()… возвращали null и ничего не делали. Настало время писать реализацию для заглушек.

Большая часть из них делалась тривиально: например, класс Image:

Конечно, API местами не совпадает, но оно всё равно очень похоже.

Для рисования я сделал класс CanvasImpl, который наследуется от JPanel. Он обрабатывал нажатия кнопок и вызовы отрисовки и превращал их в вызовы нашего игрового Canvas.
Я даже вошёл во вкус и сделал апскейлинг картинки, чтобы не приходилось всматриватьcя в крохотное окошко:

— это моя обёртка над awt.Graphics, транслирующая вызовы рисования.

Раз за разом я запускал код, смотрел как он падает в разных местах и дописывал реализации для своих заглушек. Некоторые исключения игра «безболезненно» проглатывала, но потом работала некорректно.

Например, если в игре не работает загрука картинок, то игра работает, рисует мотоциклиста простыми линияим, колёса — палочками. Но тормозит на PC. А почему? Зачем-то в игре фон замащивается картинками , и если картинка не грузится, подставляется пустая картина размером пиксель, и при замащивании дисплея она нарисуется раз или типа того. Видимо, игра изначально работала и без картинок с графикой из палочек и кружочков, потом разработчики добавили картинки, но не тестировали, как же работает без них.

Кроме того, есть забавные баги с сохранением. Возможно, я сам его некорректно реализовал, но суть в том, что игра в некоторых моментах пытается писать в невалидное место, потом ловит исключение, проглатывает и спокойно работает дальше.

Честно говоря, я не гуглил, какие есть готовые эмуляторы j2me для PC. Скорее всего есть — году эдак в 2010 я пользовался каким-то, когда только-только осваивал программирование и пробовал писать игры. Если в существующих эмуляторах не хватает каких-то возможностей и захочется доработать мой для поддержки ещё каких-то игр — пишите в личку.

Популярные эмуляторы Java Android

Желая установить и использовать Java-софт на своем смартфоне, вы гарантированно отметите для себя многообразие программ, которые способны реализовать вашу затею. На сегодняшний день многие именитые разработчики предлагают своим пользователям насладиться практичностью и стабильной эксплуатацией Java-софта на Андроид-устройствах.

Мы решили выделить три таких утилиты, которые быстро интегрируются на базу смартфона и не требуют каких-либо дополнительных навыков при использовании. Установив данный софт единожды на свой планшет или смартфон, вы с легкостью сможете использовать весь потенциал Java.

Java J2ME Runner

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

Изначально вам необходимо будет установить софт на свой смартфон, а далее воспользоваться обычным браузером, посредством которого вы будете искать те или иные приложения. Найдя одно такое приложение, вы начинаете его скачивание, но при этом в моменте выбора загрузчика отдаете предпочтение J2ME Runner.

Далее остается только дождаться загрузки и все – софт можно использовать. Сама эмуляционная утилита при этом устанавливается из посторонних источников. То есть вы не найдете в Google Play J2ME Runner.

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

В процессе использования софта будьте внимательны и скачивайте только те приложения, которые изначально были адаптированы под сенсорные экраны. То есть, если софт рассчитан на кнопочное управление, вы не сможете им воспользоваться.

Java ME Emu

Еще одним эмулятором Java, способным порадовать каждого пользователя современного Андроид-устройства, является программа ME Emu. Доверившись софту, вы сможете запускать любимые игры и приложения под ОС Андроид с версией 4.х.

При этом эмулятор демонстрирует стабильную работу и интуитивное меню, которое привычно большинству пользователей, ранее использовавших Symbian OS и прочие аналогичные системы.

Установка программы также проводится посредством скачивания из альтернативных источников. Эту программу в магазине Google вы не найдете.

Java J2ME Runner

Для стабильной работы эмулятора рекомендовано использовать версию Android 4.2.2.

Описание

После установки предлагается два приложения:

  • менеджер программ — помогает запустить поддерживаемые эмулятором приложения;
  • поисковик — необходим для поиска программ, которые могут быть запущены через эмулятор.

Чтобы начать полноценно пользоваться эмулятором, необходимо сначала найти приложение через поисковик, а затем запустить при помощи менеджера Java J2ME Runner.

Технические характеристики

Ниже представлены таблицы с обновлёнными системными требованиями эмулятора JavaJ2ME Runner.

Плюсы и минусы

Минусы представлены ниже:

  • постоянные «вылеты» эмулятора, иногда работать невозможно;
  • компания перестала выпускать обновления;
  • некоторые игры не видны эмулятором;
  • нельзя скачать через Google Play.

Плюсы обозначены списком ниже:

  • в основном все игровые проекты поддерживаются;
  • интерфейс на русском языке;
  • бесплатный доступ.
Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Настрой сам
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: