Войти
ПрограммированиеФорумОбщее

J2ME (CLDC + MIDP 2.0) на ПК (Windows или Linux) на голом С++ - возможна?

Advanced: Тема повышенной сложности или важная.

#0
9:10, 14 сен. 2021

Приветствую!

Насколько реально будет портировать (перенести, сбилдить, скомпилять)  под Винду или Линукс J2ME виртуальную машину - для запуска MIDlet'ов ("Java"-игр) стареньких кнопочных телефонов с маленькими экранами (от 128x128 до 320x240) ?

На всякий случай уточню:  нужна не вся Java,  а только J2ME, более конкретнее - CLDC и MIDP не ниже 2.0..

Поиск в интернете ни к чему ясному не подтолкнул:

1)  все ссылки на java.net померли, вместо них Оракла - там чёрт ногу сломит где искать что надо

2) phoneME - кто его реально собирал?  у кого есть опыт сборке сего чуда?  Как у него дела с совместимостью игр?

3) какие ещё есть проекты?


Как я это вижу? :

1) попытаться собрать J2ME эмулятор под Linux в Linux (платформа ПК x86)

2) выкинуть всё ненужное (секьюрити, работа с сокетами, сетью и прочим хламом)

3) перенести код на свои девайсики

У кого-нибудь есть опыт сборки?

Чё-то смотрю, что там больше Java надо, чем C.  Его одним GCC реально собрать?  В чём подвох?  В сорцах куча Джавы...  Без JRE соберётся?


Велик соблазн запускать такие игрули:

Изображение Изображение

#1
0:31, 15 сен. 2021
Gradius
> Велик соблазн запускать такие игрули:
Эх, вот же были времена...
#2
(Правка: 2:34) 1:45, 15 сен. 2021

Gradius
Вот такое нагуглилось https://en.wikipedia.org/wiki/Mika_VM. Вроде относительно живо.

Одним только GCC точно не обойтись. Как минимум еще нужен Ant (а значит и JRE) - но он не сложнее чем Make в эксплуатации (его калька на яве).

#3
(Правка: 13:23) 11:02, 15 сен. 2021

Gradius

еще возможен альтернативный подход

1. берем пачку игор

2. пишем программку на яве, которая парсит байткод

+ пример с использованием библиотеки jd-core

3. программка обходит полученное дерево на предмет вызываемых методов.

4. формируем из них список методов принадлежащих пакетам cldc и midp (javax.microedition.* и подобное). т.к. мы имеем дело с играми, это будут преимущественно методы вроде "нарисовать то-то там-то", "проиграть такой-то звук", "считать юзерский инпут".

5. пишем свои реализации этих методов, на основе API платформы, на которой собираемся запускать игру.
на этом шаге мы получаем программу, которая отвязана от j2me путем делегации всех j2me вызовов к альтернативным реализациям.

6. компилируем обычным javac (часть JDK) в обычный java-байткод

7. упаковываем результат под выбранную платформу:

7a. для Java SE: (чтобы играть на десктопе) просто упаковываем в jar файл. для этого на шаге 5 мы должны были использовать AWT.

7b. для Android: упаковываем в apk. для этого на шаге 5 мы должны были использовать Android API

7c. для произвольной платформы: компилим результат шага 5 в нативный код с помощью, например, Graal VM AOT. для этого на шаге 5 мы должны были использовать JNI и нативный API - например SDL и OpenGL, либо какой-нибудь легковесный 2D-движочек.

7d. для произвольной платформы: компилим какую-нибудь подходящую не-j2me JVM (например, указанную ниже 0iStalker) под нужную платформу и упаковываем игру вместе с ней.

8. пишем скрипт, который проделывает все эти шаги для любой игры (шаг 5 проделывается единожды с небольшими периодическими доделками).


успех затеи зависит от объема выдачи шага 4. я проделывал подобное, портируя одну Lua-игру с одного движка на другой. пришлось написать свои реализации 168 функций (подглядывая в C++ и Lua исходники оригинальных функций) и это заняло порядка месяца (посмотрел в Git историю - 2 недели) по вечерам и на выходных с получением довольно стабильного результата.
с явой проще, т.к. ее байткод можно нормально парсить, получив точный список нужных функций среды (шаги 2-4), а в Lua приходилось всячески грепать, что более геморойно.

#4
11:20, 15 сен. 2021

kkolyan

Наверное, Gradius  нужен не порт midlet'ов в jar/apk, а  реализация  J2ME машины на голом Си, чтобы портировать в свои приставки и запускать на ней мидлеты с играми.

#5
(Правка: 11:42) 11:28, 15 сен. 2021

0iStalker
Да, я почитал чем занимается Gradius. Пункт 7c вполне может подойти.

#6
11:37, 15 сен. 2021

Вообще быстрым поиском ничего не находится кроме  заброшенного проекта uJ  - http://dmitry.gr/?r=05.Projects&proj=12.%20uJ%20-%20a%20micro%20JVM  - http://dmitry.gr/images/uJ_dist_11.zip  Но там самый-самый минимум

+ Показать
#7
(Правка: 12:16) 11:44, 15 сен. 2021

0iStalker
Идеальный вариант, конечно - просто скомпилить phoneME/Mika под нужную платформу. но phoneME не обновлялся 10 лет и его исходники нужно выдирать из архивов, а потом разбираться в их непростом лэйауте и подобных хитростях. Mika вроде поживее, т.к. есть обновы 3-летней давности, но все же это технология, которая давно мертва.
А Java спецификация (на которую полагается мой альтернативный способ) чертовски обратно совместима и все остальные тулы вполне себе живы.

> и к ней AOT нашлёпку, чтоб не тормозило
Graal VM приведен в пример. есть и другие AOT для java байткода, чем по сути и является предлагаемый тобой
> бинарный транслятор из байт кода в ассемблер/си, взять какой-нибудь LLVM и прикрутить бэкенд дающий выхлоп в виде Си исходника

+ Показать

#8
12:43, 16 сен. 2021

kkolyan, 0iStalker, спасибо за обширный ответ.

По поводу инструментов постройки билда.  Если ANT и JRE требуются только на хост-платформе (ПК с виндой или линуксом) для сборки проекта - то допустимо.  Главное, чтобы при работе на целевой платформе, не использовались.

Нашёл список всех виртуальны машин с JAVA: https://stringfixer.com/ru/List_of_Java_virtual_machines

Есть ещё несколько вопросов:

1.  Метод, связанный с преобразованием JAVA-кода в LLVM, что даёт на выходе?  Это будет Си-подобный код, который можно будет скомпилировать, или придётся делать вторую ступень - конвертировать LLVM в C++ или сразу а ассемблер целевой платформы ?

Вот нашёл ещё такой LLVM-бэкэнд: https://www.cs.cornell.edu/projects/polyglot/

2. Декомпиляция jar-игр.  Глянул содержимое jar-файла (переименова его в rar) и увидел там файлы расширением *.class - их надо декомпилировать в *.java ?  Если да, то какой декомпилятор лучше брать, чтобы код был гарантированно рабочим?

3. Нашёл JAVA to C++ converter: https://www.tangiblesoftwaresolutions.com/product_details/java_to… _details.html

Насколько эффективна автоматическая конверсия JAVA to C++ ?

4. Требуются ли от меня какие-либо знания в области JAVA?  Имею нулевой опыт с ней.

#9
(Правка: 19:48) 15:22, 16 сен. 2021

Gradius

1. насколько легко с помощью LLVM из Java получить нативные бинарники - не скажу, но в варианте с такой конверсией вам совершенно точно придется реализовывать свое окружение, синтаксически или бинарно совместимое с j2me (вернее той его частью, которая используется в этих играх). Я не отговариваю: по мне так - это лучше некромантии с phoneME/Mika.

2. jar - это zip архив. да, в нем лежат упакованные бинарники и "*.class" - это java-bytecode. на каждый java-класс по одному файлу (естественно для мобилок - оно обфусцировано, так что оригинальной структуры классов вы там не увидете).
> какой декомпилятор лучше брать, чтобы код был гарантированно рабочим?
Java Decompiler (тот, что я использовал в примере в посте #4). игру Aleste он скушал нормально. там есть и GUI-версия но врядли она вам понадобится (разве что осмотреться). если интересно поковырять в этом направлении, могу скинуть шаблон проекта с подключенным декмомпилятором. но вам придется чуть разобраться в яве (учитывая чем вы занимаетесь - это легкотня) чтобы двигаться дальше в этом направлении.

3. не пробовал. но судя по всему, это очень нишевое решение для легаси проектов. о его принципиально возможных качествах можно судить по популярному нынче IL2CPP (практически то же самое, но для C#, который младший брат явы) - быстрее не будет, но зато запустится с любой платформы и сожрет меньше места. о стабильности судить сложно - непонятно насколько это популярный и живой проект.

4. Смотря по какому сценарию пойдете.

  A) Сборка phoneME/Mika/... под свой девайс и использование как есть - знание явы не понадобится. с запуском Ant, возможно, чуть помучаться придется (понять чего надо доустановить, в какой папке его запускать и подобное), но даже при нулевом знании явы это меньше мучений чем со сборкой чужого большого проекта на крестах.

  B) Сборка своей среды на основе phoneME/Mika с "выбрасыванеим всего лишнего" - яву освоить придется.

  C) Вариант описанный в посте #4 - яву освоить придется.

Если вы знаете кресты, то освоить яву довольно просто. В ней все списано с крестов и все отличия в сторону упрощения и вырезания. Ну и я рад буду проконсультировать более детально, если решитесь таки на вариант с освоением явы.

#10
(Правка: 17 сен. 2021, 5:54) 17:18, 16 сен. 2021

Gradius
Несколько сбивает с толку то, что в посте вы говорите о сборке под ПК/Linux, но при этом у вас в анамнезе работа с железом.

> Если ANT и JRE требуются только на хост-платформе (ПК с виндой или линуксом) для сборки проекта - то допустимо. Главное, чтобы при работе на целевой платформе, не использовались.
но вот после этого становится понятно что на ПК/Linux вы собираетесь только собирать. А выполнять как раз на железках.

конечно, ANT нужен только для сборки. а для выполнения - это уж как сделаете. Если использовать AOT, то на целевой машине JRE не нужен. А если использовать виртуальную машину вроде uJ и любую из списка что вы нашли (из которых вам подходит только JamVM как я понял) - они сами по себе и являются JRE.

#11
(Правка: 4:13) 4:13, 17 сен. 2021

kkolyan
> насколько легко с помощью LLVM из Java получить нативные бинарники - не скажу,
> но в варианте с такой конверсией вам совершенно точно придется реализовывать
> свое окружение, синтаксически или бинарно совместимое с j2me (вернее той его
> частью, которая используется в этих играх). Я не отговариваю: по мне так - это
> лучше некромантии с phoneME/Mika.

Вначале попробую с простой сборки phoneME/Mika в Линуксе на ПК.  Если устроит (пойдёт большинство 2Д-игр), то остановлюсь на этом варианте.  Если нет, придётся более углубленно лезть.

kkolyan
> Сборка phoneME/Mika/... под свой девайс и использование как есть - знание явы
> не понадобится. с запуском Ant, возможно, чуть помучаться придется (понять чего
> надо доустановить, в какой папке его запускать и подобное), но даже при нулевом
> знании явы это меньше мучений чем со сборкой чужого большого проекта на
> крестах.

Ant под Линуксом у меня есть.  Собирал им.  Я правильно понял, что это - не более make, только вместо Makefile - XML ?

И ещё важный вопрос.  В сорцах Mika и phoneme маячат файлы *.java - достаточно ли будет их скомпилировать в *.class  обычным Линуксовым JRE на ПК ?  Пойдут ли они на других архитектурах ?  На моих консолях?

Если под ARM ещё можно найти JRE, то под C6745 DSP боюсь, что кроме C++14 ничего нет.


kkolyan
> Несколько сбивает с толку то, что в посте вы говорите о сборке под ПК/Linux, но
> при этом у вас в анамнезе работа с железом.

У меня всегда одна стратегия:

1) вначале собираем под ПК (в винде или линуксе)

2) отсекаем весь ненужный функционал

3) затем выискиваем все функции, зависящие от ОС и заменяем их на функции нативного API консоли. Часть функций будут просто заглушками, так как на консолях оказываются не нужны.

Тот же phoneME - есть сборка под SDL. У меня есть уже опыт замены SDL на свой нативный API.
Как обстоят дела с Mikka - пока не глядел.

Займусь этим после как встану на ноги(бомбанул сильный панкреатит) и спаяю новую консоль на V3s.

#12
(Правка: 17:13) 6:40, 17 сен. 2021

Gradius
> Ant под Линуксом у меня есть.  Собирал им.  Я правильно понял, что это - не более make, только вместо Makefile - XML ?
да, примерно так. он умеет компилировать (не сам, разумеется), упаковывать в архив, вызывать команды оси и т.д.

> В сорцах Mika и phoneme маячат файлы *.java - достаточно ли будет их скомпилировать в *.class  обычным Линуксовым JRE на ПК ? 
Ant скомпилирует их в *.class именно что обычным линусковым JRE (вернее JDK). Но не советую идти в обход имеющихся там Ant-скриптов, т.к. там скорее всего важны какие-то параметры и делается гора важных сопутствующих действий.

> Пойдут ли они на других архитектурах ? На моих консолях?
> Если под ARM ещё можно найти JRE, то под C6745 DSP боюсь, что кроме C++14 ничего нет.
он "пойдет" на любом устрйостве, на котором можно как-то запустить JVM, способную выполнить этот байткод. phoneME как раз такую JVM в себе содержит (cdc). а вот удастся ли ее скомпилить под конкретно твое железо - не знаю, тут я полный профан.

Теоретически, можно выполнить Java-код и без JVM. С помощью GraalVM или LLVM. Но это не нужно для phoneME/Mika. Это совершенно иной подход.

> У меня всегда одна стратегия:
если такая стратегия отработана, то вариант со сборкой phoneME/Mika действительно выглядит наиболее перспективным.

желаю скорого выздоровления)

#13
3:07, 18 сен. 2021

kkolyan
> желаю скорого выздоровления)

Спасибо!

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

Первый был весной этого года.  Лечение - по протоколу врача на основе результатов обследования.

Виноват сам - многократные нарушения диеты.

#14
7:28, 18 сен. 2021

Вы пишите если что то работать не будет, вот тогда и помочь можно чем то.
J2me я когда то изучал, и это был скорее аппендикс Java. На PC будет скорее всего почти полная совместимость. В любом случае, в крайнем случае можно будет сделать какой то ретронслятор на c++. К сожалению плохо знаю Си подобные языки, но смогу объяснить конструкции Java.

ПрограммированиеФорумОбщее