| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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:\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 выдается ошибка
я добавил в аргумент -classpath еще и c:\j2sdk1.4.2_08\lib\ - думал, раз javac обходится без явного указания пути к стандартным библиотекам, то он их по переменной среды находит - однако c preverify это не помогло. Тогда я заглянул в библиотеку cldcapi10.jar из WTK, обнаружил, что есть требуемый класс, указал его в -classpath и все сработало как надо. Переменная среды у меня выглядит так
но по этим адресам никаких стандартных библиотек я не нашел (кроме 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'ом тоже надо уметь и не столько ради самого умения, а столько чтобы понимать как устроено нутро. |