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


Автор: Platon 2.10.2006, 16:28
Здравствуйте уважаемые. Решил попробовать писать в Java ME но что-то заминка на самом старте. 

Использую Idea. Стандартная прога срисованная с книжки.

Код

package Mid;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Mid extends MIDlet implements CommandListener {
    private Command exitCommand;
    private Display myDisplay;
    public Mid() {
        myDisplay = Display.getDisplay(this);
        exitCommand = new Command("Exit", Command.SCREEN, 2);
    }
    public void startApp() {
        TextBox t = new TextBox("HelloMidlet", "Text", 256, 0);
        t.addCommand(exitCommand);
        t.setCommandListener(this);
        myDisplay.setCurrent(t);
    }
    public void pauseApp() {

    }
    public void destroyApp(boolean unconditional) {

    }
    public void commandAction(Command c, Displayable s) {
        if (c == exitCommand) {
            destroyApp(false);
            notifyDestroyed();
        }

    }
    public static void main(String[] args) {
        Mid m = new Mid();
        m.startApp();
    }

}


хочу посмотреть что получится, дебажу. Запускаю. 
В консоли:
Код

Connecting to 127.0.0.1 on port 2800
Waiting for debugger on port 1990
Waiting for KVM...
Connection received.
Running with storage root DefaultColorPhone
Connected to KVM

Ооо, миленький сотовый smile 
дальше какое то окно с ошибкой
Код

 "Failed to establish connection to the target VM, adress: '127.0.0.1:1990', transport: 'socket''"

Жму ОК
дальше в консоли
Код

Connected to the target VM, address: '127.0.0.1:1990', transport: 'socket'

жму на сотовом кнопочку Launch, выделен пункт Mid.Mid

Код

Method............: 1016db58 'com/sun/midp/midlet/MIDletState.createMIDlet (static)' 
Stack Chunk.......: 10516e4
Frame Pointer.....: 105173c
Current IP........: 101f1715 = 101f1707 + offset 14
Previous Frame....: 1051704
Previous IP.......: 10214d75 (offset 22)
Frame size........: 7 (1 arguments, 6 local variables)
Argument[0].......: 1052878
Local[1]..........: 0
Local[2]..........: 0
Local[3]..........: 106bc18
Local[4]..........: 0
Local[5]..........: 0
Local[6]..........: 0
Operand[1]........: 1052878

Method............: 10184618 'com/sun/midp/midlet/Selector.run (virtual)' 
Stack Chunk.......: 10516e4
Frame Pointer.....: 1051704
Current IP........: 10214d75 = 10214d5f + offset 22
Previous Frame....: 0
Previous IP.......: 1
Frame size........: 6 (1 arguments, 5 local variables)
Argument[0].......: 1052de8
Local[1]..........: 106c938
Local[2]..........: 1052878
Local[3]..........: 0
Local[4]..........: 0
Local[5]..........: 0
Operand[1]........: 106c938

VM status:
Instruction pointer.: 101f1715 (offset within invoking method: 14)
Next instruction....: 0x4c
Frame pointer.......: 105173c
Local pointer.......: 1051720
Stack size..........: 128; sp: 1051754; ranges: 10516ec-10518ec;
Contents of the current stack frame:
    1051720: 1052878 (lp)
    1051724: 0
    1051728: 0
    105172c: 106bc18
    1051730: 0
    1051734: 0
    1051738: 0
    105173c: 1051704 (fp)
    1051740: 10214d75
    1051744: 105171c
    1051748: 1016db58
    105174c: 10516e4
    1051750: 0 (end of frame)
    1051754: 1052878 (sp)
Execution stack contains 108 items: 
1052de8  
106c938  
1052878  
0  
0  
0  
0  
1  
10516e8  
10184618  
10516e4  
0  
106c938  
1052878  
0  
0  
106bc18  
0  
0  
0  
1051704  
10214d75  
105171c  
1016db58  
10516e4  
0  
1052878  

Execution completed.
711738 bytecodes executed
13 thread switches
741 classes in the system (including system classes)
8538 dynamic objects allocated (473956 bytes)
ALERT: java/lang/ClassFormatError: Bad version information.
2 garbage collections (44328 bytes collected)
Disconnected from the target VM, address: '127.0.0.1:1990', transport: 'socket'
Execution completed.
711738 bytecodes executed
13 thread switches
741 classes in the system (including system classes)
8538 dynamic objects allocated (473956 bytes)
2 garbage collections (44328 bytes collected)

Process finished with exit code 0

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

Автор: batigoal 2.10.2006, 21:32
Отправлю все-таки в J2ME - там скорее ответят.

Автор: Slavca 3.10.2006, 05:31
Наверное, ты используешь WTK версии выше, чем 2.0.
У меня, например, на WTK2.0 запускается без проблем. А на WTK2.2 вылазиет то что видишь ты.
Проблема кроется в том что idea не производит верификацию классов (или, может, производит но как-то не так). Если ты сделаешь следующее, то у тебя должно получиться.
  •  Запусти KToolbar (в WTK)
  •  Нажми "New project..."
  •  Project Name - пиши имя проекта (оно же имя папки, в которой будет располагаться проект)
  •  MIDlet Class Name - Mid.Mid (запускной класс мидлета)
  •  В окне Settings просто нажми OK. Потом полазиешь  smile 
  •  скопируй src из проекта idea в созданный проект WTK (обычно это путь: <WTK_HOME>/apps/<Project Name>
  •  В KToolbar жмакай Build и Run.
Чтобы собрать jar - в меню Project топчем Package->Create Package. jar появится в папке проекта в директории bin

Минус такого подхода - большой: файлы копировать надо, отладку не запустить т.д.

Есть еще вариант - написать ant-скрипт для сборки. Вот ссылка с примером:
http://developers.sun.com/techtopics/mobility/midp/articles/ant/index.html

Если получится с идеи запускать - ты напиши как. Полезно.

Автор: Dancer 3.10.2006, 10:00
совсем это не выход. Проще подредактировать файлик для сборки через Ant, и работать прямо из IDEA. У меня WTK 2.2 работю напрямую из IDEA. (4.5 с плагином) В 5.0 то же приходится подправлять build.xml ручками, но это не так сложно как кажется smile
Сейчас расскажу где и что нужно править.
Хотя я это уже кому то здесь рассказывать, но может быть это было по переписке, точно не помню. Так что если вдруг кто-то увидет, что что-то похожее я ему уже рассказывал, пусть выложит здесь, чтобы весь честнОй народ знал.

И так, приступим. 
============================
Есть у нас IDEA 4.5 с плагином J2MESupport, и есть у нас WTK 2.2
(отступлюсь чуть-чуть от темы)
  Надеюсь что плагин вы установили правильно, иначе без этого в принципе никак smile
     Устанавливаем плагин.
     1. Скачиваем это самый J2MESupport с сайта IDEA. (то есть у нас должен быть файлик j2mesupport.jar)
     2. У нас должна быть установлена сама IDEA 4.0 или  4.5 (для версии 5.0 этот плагин уже идёт в поставке)
     3. Заходим в папочку где установлена IDEA. Далее в plugins.
     4. Создаём папочку j2mesupport, заходим в неё и создаём папочку lib.
     5. В созданную lib кладём наш j2mesupport.jar
Вот вроде бы и всё. Но тут то же есть одна небольшая хитрость. Нам нужно либо прописать наш j2mesupport.jar в CLASSPATH, так как из него нам будет очень необходим один класс, для сборки через Ant нашего мидлета. Либо, можно выковырять из j2mesupport.jar этот нужный файлик и подложить его в ant.jar.
Я в принципе всегда подкладываю, так надёжнее smile)), а то могу настройки грохнуть, забыть что-нить и так далее, а тут один раз скопировал всё куда нужно, и порядок.
Файлик который нам нужен - FileSize.class находится он в j2mesupport.jar /org/apache/tools/ant/taskdefs
Положить его нужно в - ant.jar (тот которым вы пользуетесь для сборки проектов), правильнее сказать, нужно положить всю папочку org из j2mesupport.jar в ant.jar. Если вы используете Ant из IDEA то он находится в папке где установлена IDEA (далее буду называть её IDEA_ROOT), IDEA_ROOT/lib/ant/lib
Ещё один способ, скопируйте в IDEA_ROOT/lib/ant/lib ваш j2mesupport.jar. Удалите из j2mesupport.jar всё, кроме папок META-INF и org.
Будет вам счастье smile)))
Так-с, плагин установил. Смотрим, что он у нас повился:
1. Запускаем IDEA
2. Создаём новый проект, или же открываем уже существующий. (Как небольшое отступление, нету в мидлетах public static main(String str[]){}. Плиз, не нужно этого делать......)
3. При создании нового проекта (обзову его FakeProject), выбираем где он будет у нас сохранён, далее говорим какую Java будем использовать (у меня лишь 1.4.2_12, так что её то я и выбираю smile )
4. Выбираем Create singe-module project
5. Java Module (в типе модуля)
6. Далее указываете, где будут у вас исходники, клссы и т.д.
Вот мы и получили новый проект, под названием FakeProject. Давате теперь настроим в нём весь необходимый Environment, который нам нужен будет для работы smile :
1. Идём в Settings (Ctrl+Alt+S) или тыкаемся по иконке с гаечным ключом и гайкой-шестерёнкой (хрен её разберёшь).
2. Выбираем во вкладке Project  J2ME Support
3. Указываем WTK Home (нажав на три точки, выбиаем папку, где установлен WTK)
4. Устанавливаем галку в checkBox J2ME Support
5. Как только галку эту поставим, вылезает диалоговое окошко, с вопросам где будет наш мидлет, какие в него будут входить классы и так далее. 
5.1. Выбираем ProjectName и Project Home для нашего мидлета, я их оставлю теми, что предлагается по умолчанию (FakeProject D:\tmp\FakeProject) -> Next
5.2. Suite Name оставляю FakeProject (подставленный по умолчанию), тыкаемся в плюсик в Midlets in suite (добавляем мидлеты, которые у нас будут в сьюите, в принципе очень часто в сьюите оказывается лишь один мидлет, но можно их держать и несколько. По спецификации можено до 5, но всё зависит от производителей устройств)
5.3. Вводим Midlet name и Midlet class (точно так же как и в WTK, это не означает, что вы должны такой же проект заводить и в WTK, это я просто аналогии провожу smile )
5.4. Не мудрствуя лукаво я вписал Midlet name: FakeProject, Midlet class: Hello  (Press-> Add)
5.5. Clean old build (я предпочитаю это оставлять выставленным, чтобы предыдущий билд вычищался перед новым простроением. Если проект очень большой и какие-то части не изменяются, то на этом можно сильно сэкономить. Но здесь каждый решает сам, что ему выбирать)
5.6. Deploy Path - выбираем local, и выбиаем папку, в которую будем деплоить. Я заметил ошибки, если выбирать в качесте папки для деплоинга BIN, так что советую выбирать DIST. Но возможно это у меня лишь была такая ошибка. (в общем, я меняю bin на dist, в качестве Deploy path (Press -> Finish)
5.7. Попадем в окошко J2ME Support, там жмём OK (если что-то нужно менять, меняем и жмём ОК smile )
6. Получили скелет МИДЛЕТА,
Код

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class Hello extends MIDlet // MIDlet class implementation
 {
    protected void startApp() throws MIDletStateChangeException {
    }

    protected void pauseApp() {
    }

    protected void destroyApp(boolean b) throws MIDletStateChangeException {
    }
}

7. Если нужно использовать какие-то специфические библиотеки (например JSR-75), это нужно будет подключить самостоятельно в Libraries нашего проекта.
8. Пишим код, или тырим его где нить, вставляем всё что нужно куда нужно, и получаем готовый исходник (готовый к компиляции)
Код

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;

public class Hello extends MIDlet implements CommandListener {
    private Form mainForm;
    private Command exit;
    private Display disp;

    protected void startApp() {
        disp = Display.getDisplay(this);
        mainForm = new Form("HELLO");
        mainForm.append("From IDEA wiht LOVE !!!");
        exit = new Command("Exit",Command.EXIT,0);
        mainForm.addCommand(exit);
        mainForm.setCommandListener(this);
        disp.setCurrent(mainForm);
    }

    protected void pauseApp() {
    }

    protected void destroyApp(boolean b){
        if(b) {
            notifyDestroyed();
        }
    }

    public void commandAction(Command command, Displayable displayable) {
        if(command == exit) {
            destroyApp(true);
        }
    }
}

9. Выбираем Build (в верхнем меню), выбираем Generate Ant Build
10. получаем build.xm файлик для нашего проекта. Далее выбираем вкладочку AndBuild (она находится там же где и J2ME Support (правая граница экрана). Там жмём на плюсик и выбираем наш созданный build.xml для проекта FakeProject. (этот файлик будет сохранён в корне проекта)
11. выбираем task dist (жмём на него пару раз мышой, получаем компиляцию нашего проекта)
12. После успешной компиляции в папке dist нашего проекта будет находится FakeProject.jad и FakeProject.jar
13. Открываем J2ME Support (вкладка, рядом с AntBuild рядом с правой границей экрана, ну или правой границей окна IDEA)
14. выбираем телефон, на котором будем пускать наше приложение (Default Gray Phone, Default Color Phone и т.д.)
15. Жмёт на кнопочку Play (ну или как её обозвать не знаю, зелёный треугольничек) или же Ctrl+Alt+R
16. Ещё раз жмём в выскачившем окошке Run. И наслаждаемся нашим приложением.

Для того чтобы делать Debug:
1. Делаем всё что было описано ранее, то есть все действия, которые нам позволят запустить приложение в эмуляторе из-под IDEA.
2. Выбираем Run (пункт из меню ), в нём выбираем EditConfigurations
3. Выбираем вкладку Remote в окошке Run/Debug configurations
4. Жмём на плюсик, то есть добавляем Remote сервер (ну, назовём его так)
5. В прниципе, можно здесь ещё кое-чего поконфигурить, но сейчас можно всё оставить по умолчанию, в том числе и имя (Unnamed). Жмём -> OK
6. Ставим где нибудь в тексте точку останова (я вот ткнул в линию, где mainForm.setCommandListener(this); из текста приведённого выше)
7. Далее в J2ME Support (откуда ранее запускали приложение) жмём на "жучка", то есть запускамся в Debug mode.
8. Далее Shift+F9, или же жмём на "жучка с кнопкой Play" который располагается рядом с гаечным ключом на панеле инструментов.
9. Жмём на кнопку Debug (наш, с позволения сказать сервер, Unnamed должен быть выбран в этом качестве, друго пока мы не делали smile )
10. Далее идём к нашему запустившемуся эмулятору телефона.
11. Нажимаем на кнопку Launch (то есть запускаем наше приложение). 
12. УРА!!!! Срабатывает точка останова, мы попадаем в IDEA, и можем дебажить на код. Смотреть во что выставленны переменные и т.д.

На этом я пожалуй закончу ( что нужно править в build.xml отпишу как-нить в другой раз. Сейчас нет времени, сорри.)

Автор: Platon 3.10.2006, 10:43
Здравствуйте, уважаемый Dancer, я являюсь счастливым обладаетелем IDEA 5.1 
но не нашел указанного вами файла j2mesupport.jar. По логике я подумал что это может быть j2meplugin, но в нем нет ни папки org, ни файла FileSize. smile

Добавлено @ 10:57 
Slavca, спасибо, конечно, работает, но все же хотелось бы через идею все это прокручивать

Автор: W0LF 3.10.2006, 20:02
В идее 5.0 уже плагин не нужен.
И она преверифает нормально кстати. Правда я в нее ант+антенна все-таки вставил благодаря Dancer'у
smile

Автор: Dancer 5.10.2006, 11:26
Такс, как и обещал - продолжаю.

Значить, ранее получили мы с вами build.xml используем его и нам от этого СЧАСТЬЕ! Но пришлось нам например определённый jar добавить к нашему проекту (пусть это будет JSR-75, то есть хотим использовать файловую систему телефона)
Заходим в build.xml отыскиваем 
Код

  <path id="midapi.cp">
        <fileset dir="${toolkit.home.dir}/lib">
            <include name="**/*.jar"/>
            <include name="**/*.zip"/>
        </fileset>
  </path>
  
и меняем его на 
Код

  <path id="midapi.cp">
        <fileset dir="${toolkit.home.dir}/lib">
            <include name="cldcapi10.jar"/>
            <include name="midpapi20.jar"/>
            <include name="jsr75.jar"/>
        </fileset>
  </path>

Очень рекомендую здесь прописывать самим те JAR-ы которые вы используете у себя в проекте. Если нужны буду какие-то другие специфические API и они у вас не будут находится в WTK_ROOT/lib то нжуно будет добавить ещё одну секцию (ниже приведено, для примера)
Код

<fileset dir="C:\MY_LIB\libs">
    <include name="myLib.zip"/>
</fileset>


Если посмотреть в корневую папку проекта, где вы его сохранили, то там вы обнаружите три очень замечательных файлика smile, а именно: midlet.properties, Manifest.tmpl и jad.tmpl 

midlet.properties 
В этом файлике вы устанавливаете все переменные, в те значения в которые нужно (ну, автоматически они конечно установятся на стадии когда вы вызываете в IDEA плагин J2MESupport и включаете его), но иногда нужно же что-то поменять, и т.д. 
Так вот, в этом файлике прописываются все необходимые значения. Версия вашего мидлет, его имя, названия классов для запуска мидлетов, название сьюита. Пути к библиотекам, которые вы будите подключать в build.xml. версии CLDC и MIDP для вашего мидлета. и много чего ещё. Советую вам его открыть в редакторе (хотябы Notepad) и посмотреть самим. Там всё очень понятно. Вот покажу лишь один пример: 
переменная toolkit.home.dir=C\:\\my\\WTK_22 это означает, что WTK у меня расположено по пути C:\my\WTK_22. Значение этой переменной вы используете в своём build.xml файле (к примеру: <fileset dir="${toolkit.home.dir}/lib">). Если вы поставите другой WTK или симулятор от производителя, вам лишь нужно будет поменять путь для toolkit.home.dir и будет вам счастье (если же симулятор от производителся будет иметь структуру подобную WTK. Хотя как правило производители придерживаются данной структуры. )
Заострю ваше внимание на \: и \\ -  это ВАЖНО!!!. символ \ - это показывает парсеру, что за ним идёт специальный символ, и его никак не нужно обрабатывать. (посмотрите про escape-последовательности и всё думаю будет понятно)

Manifest.tmpl
Это файл шаблон для вашего Manifest.mf файла, который будет располагаться в JAR META-INF/Manifest.mf. (это файл необходим для всех мидлетов, и вообще для всех JAR-архивов. Хотя конечно архив - как архив он может жить и без него, но для всего остального он просто необходим. Не буду на этом останавливаться, о Manifest можно почитать в соответствующей литературе smile )
Если взглянуть на этот файлик (открыть на просмотр или редактирование) мы видим что продолжаем использовать переменные, которые мы выставили в midlet.properties. Для примера, рассмотрим MicroEdition-Configuration. Это обязательный параметр для всех мидлетов, и этот параметр должен присутствовать и в JAD и JAR (читаем спецификацию JSR-118), и мало того, в JAD и JAR этот параметр должен совпадать. Для того чтобы нам не налажаться с версией используем переменную j2me.cldc.version которая у нас выставляется в файле midlet.properties. (У меня она выставлена так: j2me.cldc.version=CLDC-1.0). Так вот, а используете вы это в файле Manifest.tmpl как @j2me.cldc.version@ и уже в файле Manifest.mf у вас появится MicroEdition-Configuration: CLDC-1.0
Ну и так далее. А когда нужно будет поменять версию, вы это легко сделаете в вашем midlet.properties и пересобирёте ваш мидлет. 

jad.tmpl
Это то же файл-шаблон, но уже для JAD файла вашего мидлета. Сюда так же вы может добавлять собственные переменные, как и в обычный JAD файл (это и для JAR справедливо). В нём тот же принцип поведения с переменными, которые устанавливаются в midlet.properties как и для Manifest.tmpl
----------------------------------
Имеются ещё два XML файлика, про которые стоит упомянуть.
YOUR_PROJECT_NAME.xml
module_YOUR_PROJECT_NAME.xml
где YOUR_PROJECT_NAME - это имя вашего проекта (как помните, я ранее создавал проект с именем FakeProject, поэтому у меня эти фалйики соответственно обзываются fakeproject.xml и module_fakeproject.xml)

fakeproject.xml - в нём содержится информация по вашему проекту, где располагается Java SDK, какие либы(библиотеки) вы подключили к своему проекту, ни и всё в этом роде. Главное отсюда - это JDK.

module_fakeproject.xml -  это настройки непосредственно по модулу J2ME Support. Где располагается WTK, какие cldcapi и midpapi вы используете по умолчанию, в каких папках у вас будут находится исходники, куда будут складываться классы и где будет выкладываться JAD/JAR.
Здесь стоит остановиться поподробнее. У меня не получилось нормально сконфигуряться (ещё ни разу, но возможно это я такой балбес и руки у меня кривые) из самой IDEA, то есть повыставлять галочек, выбрать что хочу и вуаЛя. (особенно это касается midpapi20.jar и cldcapi10.jar). То есть, выставляю я их в то что мне нужно. а потом обратно открываю этот модуль и получаю, что cldc у меня убежало в 1.1). Но в общем то это..... фигня, когда на эмуляторе, но когда начинаешь заливать в телефон будут проблемы (многие думаю знают, кто не знает - узнает позже smile ). Так вот, я в module_YOUR_PROJECT_NAME.xml прописываю один раз самостоятельно, то что мне нужно, и после этого всё нормально продолжает жить.

Ну вот, вроде бы про видимые подводные камни рассказал. Как с этим бороться то же, попытался "донести". Как дебажить начать в IDEA вроде бы то же объяснил. (если нет, то задавайте вопросы в этой ветке, по мере возможности буду отвечать)

За сим, разрешите откланяться smile))

P.S. 
Если найдёте какие-то неточности во всей этой лабуде, что-то будет не так работать как написано, плиз пишите сюда, чтобы МЫ все вместе исправляли эти "затыки" и пополняли свой "багаж знаний"

Автор: mamon4ik 27.10.2006, 10:53
Как заставить IDEA нормально преверифицировать код ?

при сборке через ant на верификации валится с ошибкой - не может найти jar.exe

если скопировать его из jsdk в папку проекта, то всё нормально собирается, но копировать jar.exe в каждый проект - это неправильно...

как я понял, надо jar.exe куда-то прописать, чтобы при вызове он брался из папки с jsdk а не из текущей папки, но как это сделать ?


Автор: Dancer 27.10.2006, 10:59
смотрим в сторону переменных PATH и CLASSPATH
В PATH нужно прописать путь до JAVA_HOME
Посмотри статью в нашем факе (ветка J2ME), я уже эту тему затрагивал (IDEA здесь не причём smile ), статья про запуск WTK из командной строки.
Вопрос с преверифаером был не так давно в этом форуме задан "Полосатым", я на него отвечал, там он как раз его не использовал, я ему как мог, помог втянуть это дело в Ant-скрипт.

Автор: mamon4ik 27.10.2006, 11:35
Наверное, некорректно вопрос задал. Извиняюсь.

то, что jar.exe надо прописывать в PATH узнал из документации к WTK.

Прочитав статью в FAQ, понял, что не хватает мне этого - 

set PATH=%PATH%;%WTK%\bin;%JAVA_HOME%\bin


Но я не знаю, как его прописать, и где (в build.xml или где-то еще)  smile

Спасибо.

Автор: Dancer 27.10.2006, 12:23
ну, добавь в скрипт, который у тебя Ant пускает. Ant - это ни что иное, как скприпт (bat-файл)
Заходишь в ANT_HOME директорию, открываешь на редактирование ant.bat и добавляешь необходимые строчки (можно практически в самое начало)
Ну, или в глобальные виндузовые настройки это дело вносишь.
Start->ControlPanel->System(или SystemProperties, ещё это можно получишь правым кликом на значке Мой компьютер, Properties/Свойства)
Далее выбираем Advanced->Environment Variables.
Меняем PATH для конкретного пользователя или же для всех ну и так далее. 
Кстати, как и где это всё прописывать кто-то из корефеев уже в факе описывал, но не в J2ME ветке. 

Отсюда вывод smile), посматривайте в FAQ, там есть многое, что пригодится начинающим! (люди же не просто так туда статьи пишут, чтобы в дальшейшем своё и ваше время экономить)

Автор: DissDoc 20.11.2006, 10:54
Не знаю, может я и не прав, но у автора в коде есть функция main - которая в J2ME недопустима  smile 

Автор: Platon 20.11.2006, 10:56
 smile это уже обсуждалось  smile 

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