Попробую сделать биндинги нужных для сборки Hello.cp модулей lcdui и midlet. В более ранних версиях GPCP, как я понял, биндинги нужно было делать вручную, что-то вроде такого:
Код: "OBERON"
SYSTEM MODULE midlet;
IMPORT java_lang;
TYPE
MIDlet* = EXTENSIBLE RECORD (java_lang.Object)
END;
END midlet.
Компилируем в midlet.cps командой: @CALL cprun gpcp -special midlet.cp
Этот способ производства биндингов безусловно очень полезен, но какова же была моя радость, когда я увидел в поставке GPCP утилиту J2CPS, которая генерирует символьные файлы .cps прямо из готовых .class — её-то мы и будем использовать.
Для начала я взял из установленного
Sun Java Wireless Toolkit 2.5.2_01 for CLDC архив midpapi10.jar (по идее первая версия MIDP проще и с ней меньше потенциальных проблем) и распаковал оттуда папки com и javax прямо в корень gpcp-JVM.
Запускаем команду:
j2cps -v javax.microedition.midlet
(-v — это ключик verbose для расширенного вывода информации)
Reading Symbol File <D:\Archive\Projects\XDev\gpcp-JVM\libs\JvmSystem\sun_reflec
t_generics_factory.cps>
INFO: Reading symbol file sun_reflect_generics_factory.cps
Bad symbol file format. 1
Что же мы видим! Я имел с этим много непоняток, но в итоге оказалось, что это ошибка в дистрибутиве GPCP. Файл libs\JvmSystem\sun_reflect_generics_factory.cps действительно повреждён, и, как выяснилось дальше, не только он один. Почесав тыковку, я придумал как сгенерировать корректный файл. Для этого из установленной у меня Java берём папку:
d:\Program Files\Java\jre6\lib\rt.jar\sun\
и распаковываем её в папку с GPCP. После чего можно подать команду:
j2cps -v sun.reflect.generics.factory
и... убедиться, что файл sun_java2d_pipe.cps тоже повреждён:
Reading Symbol File <D:\Archive\Projects\XDev\gpcp-JVM\libs\JvmSystem\sun_java2d
_pipe.cps>
INFO: Reading symbol file sun_java2d_pipe.cps
Bad symbol file format. 1
Вот так потеха. Попытки починки файлов привели к тому, что эти битые файлы завязаны друг на друге и друг друга требуют. Такой, мягко говоря, непростой случай. Требует шаманского подхода. В итоге выяснилось, что битых файла там 4:
sun_java2d_loops.cps
sun_java2d_pipe.cps
sun_nio_cs_ext.cps
sun_reflect_generics_factory.cps
Займёмся грязным хаком. Поскольку в дистрибутиве GPCP v1.3.12 символьные файлы данных классов повреждены, достанем из более ранней версии GPCP 1.3.4 файлы libs\JvmSystem\sun_java2d_loops.cps и libs\JvmSystem\sun_java2d_pipe.cps, нужные нам для раскрутки, и запишем их поверх битых. Пусть нас пока не смущает, что каждый новый (битый) и старый файлы отличаются по размеру. Со спокойной душой запускаем следующую команду:
j2cps sun.reflect.generics.factory
и получаем в текущей папке красивый (и главное корректный!) файлик sun_reflect_generics_factory.cps
после чего можно сгенерировать для него и html-представление:
cprun Browse -html -sort sun_reflect_generics_factory
Как мы видим, файл sun_reflect_generics_factory.html сгенерирован правильно и содержит осмысленную информацию.
После сопоставления ошибочного и корректного файла sun_reflect_generics_factory.cps мы можем видеть, что они отличаются всего одним байтом 00 и FF по смещению 758H. Тем не менее, битый файл действительно ошибочен, на него ругается компилятор (“Bad symbol file format. 1”) и утилита для генерации html-представления символьных файлов Browse:
Expected $ got
Error in Parse()
java.lang.Exception: Bad symbol file format
Error in Parse()
java.lang.NullPointerException
И, кстати, генерирует html-файл с нулевым размером. Вот откуда и хвосты. Что ж. Запишем sun_reflect_generics_factory.cps и sun_reflect_generics_factory.html ВМЕСТО испорченных файлов. Теперь, обладая здоровым файлом sun_reflect_generics_factory.cps, попробуем починить другие файлы таким же способом.
j2cps sun.java2d.pipe
Не знаю радоваться или плакать, но генерация завершилась не так уж и успешно.
INFO: Creating symbol file sun_java2d_pipe
Exception in thread "main" java.lang.NullPointerException
at J2CPS.ClassDesc.writeType(ClassDesc.java:464)
at J2CPS.SymbolFile.WriteSymbolFile(SymbolFile.java:293)
at J2CPS.PackageDesc.WriteSymbolFiles(PackageDesc.java:172)
at J2CPS.J2CPS.main(J2CPS.java:66)
Попытка восстановить файл sun_java2d_loops.cps заканчивается примерно также. На этом пока завершим эксперименты и свяжемся с авторами проекта GPCP, ибо уже видно, что не всё там хорошо.
Прикладываю архив с починенным sun_reflect_generics_factory.