Programmering til mobiltelefonen med J2ME
Jeg vil starte denne artikel med en indrømmelse: Det har aldrig rigtigt interesseret mig at kode Java, selvom vi har brugt det i al den tid jeg har læst til datamatiker (2 år)! Jeg har sådan set ingen problemer i at se alle de smarte ting i Java, som fx platforumsuafhængighed (må jo nok siges at være den vigtigste) – jeg har bare ikke rigtigt haft brug for de ting Java har kunne tilbyde mig, og samtidig har jeg ikke følt at jeg kunne lave noget brugbart med det. Java applikationer er som regel lidt langsomme, og samtidig bryder jeg mig ikke om deres look. At lave et GUI med Java er samtidig noget af det mest besværlige jeg har prøvet, og der er ikke gået lang tid før jeg har sendt længselsfulde blikke efter Delphi (som stadig er mit foretrukne udviklingsmiljø). Jeg ved at mange er glade for Java, så jeg vil naturligvis understrege at dette er mine helt personlige meninger!
Der hvor det endelig blev sjovt at kode Java, var da vi kunne få programmering til mobilen som valgfag, for her synes jeg virkelig at Java har sine fordele! I dag findes der millionvis af mobiltelefoner der understøtter Java, og det er faktisk overraskende let at skrive software til disse – og sjovt!
I denne artikel vil jeg give en lidt teoretisk introduktion til det der kaldes for J2ME (Java 2 Micro Edition), hvilket er det begreb der dækker over Java på mobiltelefoner og andre "small devices". Derudover vil jeg fortælle hvilke værktøjer man skal bruge, samt hvor man kan få fat i dem. Jeg slutter af med et simpelt kodeeksempel. Lidt viden om normal Java (J2SE) kan anbefales.
MIDP, CLDC osv.
Der er naturligvis lidt teoretisk information man bør kende til, når man skal lære en ny teknologi. På den anden side ved jeg også godt at det som regel er mere interessant at komme i gang med at skrive noget kode, så derfor vil jeg gøre den teoretiske del lidt kort. Vil man lære lidt mere teori (og det bør man nok), kan man investere i en god bog omkring emnet.
Det mest basale man bør vide omkring J2ME, er dets opdeling. J2ME dækker som sådan ikke over et specifikt stykke software eller specifikation – det betyder som sagt bare Java til små enheder. Det er delt op i 3 ting: Konfigurationer, profiler og ekstra API'er. En konfiguration fortæller om krav til den enhed det skal køres på: Hvor meget hukommelse skal der være, hvor stærk en CPU skal der være osv. Profiler er lidt mere specifikke, og definerer API'er til GUI's, "persistent storage", som er den mekaniske der bruges til at gemme simple indstillinger i enheders hukommelse, samt andre ting. Det sidste er eksra API'er, der er helt specifikt for en enhed. Fx kan Nokia vælge at lave et API deres kameramobiler, der tillader J2ME programmøren at bruge kameraet gennem sine programmer.
Der er to begreber som man i hvert fald bør kende til, og det er MIDP (Mobile Information Device Profile) og CLDC (Connected, Limited Device Configuration), for begge dele har indflydelse på den software du skal skrive. Det første er en profil, det andet er en konfiguration, og dem har du jo lige læst om

. CLDC er nu kommet i version 1.1, og MIDP er kommet i version 2.0. De fleste af de mobiltelefoner der er på markedet i dag er dog stadig baseret på CLDC 1.0 og MIDP 1.0 – kun de nyeste har MIDP 2.0, og kun de allernyeste har også CLDC 1.1. Dette er ikke et problem i sig, om end mulighederne er lidt mere begrænsede i de ældre versioner. Fx har CLDC 1.0 ikke mulighed for at behandle kommatal, hvilket sikkert godt kan virke lidt utroligt for nogen. Man skal dog huske på at de processorer der sider i fx mobiltelefoner ikke har de vilde kræfter – for dem er beregninger med kommatal virkelig hårdt arbejde!
Værktøjer
For at lave vores første MIDlet, som de små programmer til mobilen så fint kaldes (nanvnet kan sammenlignes med Applets til websites), skal vi bruge nogle værktøjer. En editor og en compiler er jo som regel nok, og det er også næsten tilfældet her. MIDlets er jo ikke helt almindelige programmer, og derfor bruger man nogle forskellige værktøjer til de forskellige steps i udviklingsprocessen. Sun, dem der sjovt nok også laver Java, har lavet et ganske godt toolkit, der kan det hele. Har vi det, skal vi bare bruge en editor til at skrive Java koden med, og der kan Notepad jo bruges, selvom jeg personligt foretrækker et IDE som JBuilder til det. Sun's J2ME Wireless Toolkit kan hentes fra følgende adresse:
http://java.sun.com/products/j2mewtoolkit/. Når det er installeret er du sådan set klar til at gå i gang, så lad os da skrive vores første lille applikation!
Hello..? World?
Næsten alle gode begynderartikler starter jo med et "Hello world" eksempel. Det lader dog til at det er ved at blive så stor en cliche at nogen går bort fra det, og skriver "Hello universe" eksempler eller noget helt andet. Derfor vil jeg forsøge at holde den gode gamle "Hello world" tradition ved lige, ved selv at diske op med sådan et eksempel

.
Jeg går ud fra at du har fået installeret J2ME Wireless Toolkit (fra nu af bare WTK), og du skal nu starte det (af uransagelige årsager vil det være oprettet som "KToolbar" i din Start menu). Som du kan se er det dejligt simpelt. Klik på "New project", skriv "HelloWorld" i første felt, og det samme i næste felt – ikke så meget pjat der

. Tryk på "Create project". Nu får vi en masse indstillinger for projektet smidt i hovedet. I første omgang skal vi ikke gøre så meget her. Planlægger du at lægge dette eksempel over på din mobiltelefon, bør du vælge MIDP 1.0 i "Target platform" – ellers betyder det ikke det store. Tryk på "Ok", og dit projekt er oprettet.
Nu skal vi have skrevet lidt kode, og du skal derfor starte den editor du nu foretrækker at bruge til at skrive Java kode med. Notepad er som sagt fin nok, hvis dine krav ikke er specielt store

. Vi starter med at gemme, da det er vigtigt at filen har det rigtige navn og placeres det rigtige sted. Filen skal gemmes som HelloWorld.java, og da mit WTK er installeret i "C:\\WTK21\\", gemmer jeg filen i: "C:\\WTK21\\apps\\HelloWorld\\src\\". Som sagt har dette en betydning, så husk at gøre det som jeg beskriver. Nu skal vi, langt om længe, skrive lidt kode

. Her kommer vores første MIDlet, samt en forklaring af koden.
Koden
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class HelloWorld
extends MIDlet
implements CommandListener
{
private Form mMainForm;
public HelloWorld()
{
mMainForm = new Form("Min første MIDlet");
mMainForm.append(new StringItem(null, "Hello world!"));
mMainForm.addCommand(new Command("Afslut", Command.EXIT, 0));
mMainForm.setCommandListener(this);
}
public void startApp()
{
Display.getDisplay(this).setCurrent(mMainForm);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable s)
{
notifyDestroyed();
}
}
Det kan måske virke lidt voldsomt at der skal så meget kode til så lidt, men der er naturligvis en god forklaring

. Som i kan se i toppen, lader vi vores program nedarve fra MIDlet, og implementere interfacet CommandListener. MIDlet er den klasse som alle MIDlet's nedarver fra, og da det er en abstrakt klasse, lover vi at implementere de abstrakte metoder den har, nemlig startApp(), pauseApp() og destroyApp(). Når man implementerer et interface lover man også at implementere de metoder det har, og da vi vælger at implementere CommandListener skal vi også have en commandAction() metode. Men hvad gør de så? Tjah, som i kan se vælger vi ikke at bruge pauseApp() og destroyApp() – vi har nemlig ikke brug for dem, men de skal være der for at koden kan compile, som jeg forklarede lige før.
Vores program har også en constructor, og det er sådan set primært den vi bruger. Lige efter at den er kaldt, vil vores startApp() blive kaldt. Men hvad sker der i koden? Jo, til at starte med har vi deklareret en såkaldt Form, hvilket udviklere der bruger fx Delphi eller VB nok vil nikke genkendende til. Forms bruges til at placere andre ting på, og ligesom i fx Windows, har en Form en overskrift (eller kan i hvert fald have det), samt noget indhold, fx tekst eller forskellige kontroller. I vores tilfælde opretter vi en tekststreng, som vi "append'er" til vores Form, dvs. vi tilknytter den.
Derudover opretter vi en Command, som er sådan en smart ting der gør at vores MIDlet kan modtage imput fra enheden, som jo i dette tilfælde er en mobiltelefon. Commands er ret stort emne, og jeg vil derfor ikke komme nærmere ind på dem i denne artikel. Vi opretter som sagt en Command, af typen EXIT. Vi opretter den på vores Form, og sørger derefter at formen står og lytter efter commands. Så snart en command bliver kaldt, vil vores commandAction() metode blive kaldt. Den er lige nu meget simpel! Vi ved at vi kun har en kommando, og derfor er det også ret givet hvad der vil ske når den bliver kørt. Med notifyDestroyed() afslutter vi programmet. De parametre der kommer med metoden, gør at vi ret let kan tjekke hvilken en kommando der er kaldt, og reagere på den, men det fortæller jeg nok mere om en anden gang.
Compile & run
Nu er vi sådan set klar til at køre det. Vær sikker på at du har gemt det, og gå så tilbage til WTK. Tryk nu på Build, der gerne efter meget kort tid skulle sige " Build complete". Gør den ikke det, vil den i stedet komme med fejl, og det er så op til dig at få dem rettet. Koden her i artiklen ER testet, så virker det ikke, så tag et ekstra kig, eller copy/paste koden hvis du er utålmodig. Når projektet er bygget (dvs. compilet), kan vi køre det. Sun har været så flinke at inkludere en række emulatorer i toolkit'et, og det er sådan en der bliver brugt når du trykker på "Run". En fin mobiltelefon dukker op på din skærm, og du vil se navnet på vores fine applikation. Tryk på "Launch", og du ser det simple output som vores hårde arbejde har skabt

. Den kan dog også en enkelt ting, udover at udskrive tekst – den kan afslutte! Tryk på den knap der svarer til "Afslut", og du vil se at det stykke kode vi skrev i vores commandAction() rent faktisk virker. Uden det ville der intet ske ved tryk på knappen.
Og det var så det. Jeg satser på at skrive mindst en artikel mere, og gå lidt mere i dybden med nogle af tingene, samt give et lidt mere avanceret eksempel. Håber i kan bruge det til noget