Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Вопросы компиляции


Автор: Vovan_Danielyan 26.3.2010, 22:59
Я тут решил собрать приложения для мобильника, не используя никаких IDE, чтобы получше познакомиться с процессом, и наткнулся на одну проблему.
Сперва взял IDE (Sun ONE Studio 4, древняя вещь) создал стандартный MIDletSuite со стандартным мидлетом HelloMIDlet. Собрал, закинул на мобильник - работает.
Потом достал исходники этого HelloMIDlet, скомпилировал (все делал в другой директории), скопировал из архива, созданного IDE, файл манифеста. Cархивировал все в ZIP (соблюдая иерархию каталогов), поменял расширение на jar. Кинул на мобильник - но на этот раз мобильник написал "ошибка приложения".
Пока пыталься понять в чем дело, заметил, что при одинаковых исходных файлах, размер скомпилированного с помощью IDE класса - 1768 байт, а у меня, после компиляции того же файла, класс весил 1401 Байт.
Компилировал я следующей строкой:
Код

C:\Java\balanceProject>javac -d bin   -classpath c:\WTK22\lib\midpapi10.jar   src\balance\sunBalance.java


Такую же библиотеку (c:\WTK22\lib\midpapi10.jar) я подключал к проекту в IDE, так что все, по идее, должно бы работать. Наверняка IDE еще что-то добавляет в командную строку для компиляции  (почему-то же различается размер файлов!), но посмотреть я этого не могу. Может, кто знает как надо правильно   скомпилировать файл, чтобы приложение в конце концов заработало? Или вообще, в чем тут дело, почему размеры-то разные получились?

Автор: eugine_s 27.3.2010, 09:20
Для j2me нужно еще делать преверификацию, использую утилиту(ы) из c:\wtk22\bin\preverifyXX

Автор: Vovan_Danielyan 27.3.2010, 16:07
Спасибо, этого-то я и не знал. Теперь все заработало. 
Только, я пока preverify выполнял, у меня еще вопрос возник. На команду preverify с указанием в classpath только c:\WTK22\lib\midpapi10.jar выдается ошибка 

Код

Error preverifying class javax.microedition.midlet.MIDlet java/lang/NoClassDefFoundError: java/lang/Object


я добавил в аргумент -classpath еще и c:\j2sdk1.4.2_08\lib\ - думал, раз javac обходится без явного указания пути к стандартным библиотекам, то он их по переменной среды находит - однако c preverify это не помогло. Тогда я заглянул в библиотеку cldcapi10.jar из WTK, обнаружил, что есть требуемый класс, указал его в -classpath и все сработало как надо. Переменная среды у меня выглядит так

Код

CLASSPATH =C:\j2sdk1.4.2_08\lib;.;C:\WTK22\lib


но по этим адресам никаких стандартных библиотек я не нашел (кроме wtk - но ее я сам потом добавил, все и без нее работало). Откуда берет классы javac и почему preverify (и я тоже) их не видит? И одинаковы ли классы Object в cldacapi и в стандартной библиотеке?

Автор: W0LF 31.3.2010, 18:42
нужно сначала задать JAVA_HOME, WTK_HOME, а потом добавить в CLASSPATH: %JAVA_HOME%/bin, %WTK_HOME%/bin(вроде так, уже если честно не помню, можно в гугле порыть )
и еще я бы посоветовал собирать проект из-под IDE, ну а если IDE совсем уж не нравится есть http://antenna.sourceforge.net/ вещь

Автор: Окунь 31.3.2010, 21:31
Как я сам это понимаю:

Чтобы обработать исходники, javac необходима информация обо всех классах, упоминаемых в них. Для этого и нужен параметр CLASSPATH, который указывает, где искать эту информацию. Но еще до CLASSPATH, он ее ищет среди bootstrap-классов и extension-классов. Бутстрап-классы - это и есть java-платформа. Информация о них хранится в файле rt.jar. Там находится, например, пакет java.lang*.
Т.к. мы компилируем для платформы JME, то правильнее было бы в вызове javac добавить опцию "-bootclasspath wtk_home/lib/cldc10.jar".

Преверифай же ищет инфу о классах только в classpath. Поэтому требуется явное указание бутстрап-классов.

Автор: ivanovpv 1.4.2010, 08:31
Правильная постановка вопроса от камрада Vovan_Danielyan. А то действительно развелось много кодеров неспособных с командной строки собрать простенький HelloWorld. IDE конечно хорошо, но уметь поработать честным shell'ом тоже надо уметь и не столько ради самого умения, а столько чтобы понимать как устроено нутро.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)