4.
MIDLETIT
Java-teknologia
rakentuu ohjelmointikielestä ja ohjelmistoalustasta. Java-alusta toimii usean
käyttöjärjestelmän kanssa. Puhelinvalmistajat hyödyntävät Java-teknologiaa
voidakseen tarjota avoimen laitealustan sovelluskehittäjille. Kaikkien Java API
(Application Programming Interfaces) -ohjelmointikielellä luotujen sovellusten
pitäisi toimia kaikissa yhteensopivissa laitteissa.
Java-alusta tunnetaan
nimellä Java Platform. Sen mobiiliversio, Java Micro Edition (Java ME), on
puolestaan suunniteltu pienemmille laitteille kuten matkapuhelimille,
kommunikaattoreille ja PDA-päätelaitteille. Tällä ohjelmistoalustalla laaditut
sovellukset ovat midlettejä, MIDP-päätelaitteessa (Mobile Information Device
Profile) eli yleisimmin puhelimessa toimivia Java-ohjelmia.
Java-teknologian
ansiosta puhelimen käyttäjä voi valita, millaisia sovelluksia hän haluaa
puhelimeensa. Kehittäjät voivat mukauttaa sovelluksen käyttöliittymän
joustavasti antaen käyttäjälle vapauden ladata juuri sellaisen version kuin hän
itse haluaa tai tarvitsee. Käyttäjä voi valita erilaisista muotoiluista ja
symboleista omaan tyyliinsä sopivimmat.
Esimerkiksi Nokian
uudet mobiililaitteet sisältävät Sovellukset -valikon, jonka kautta uusia
sovelluksia voi ladata ja tallentaa. Sovelluksia voi hakea WAP-selaimella.
Kätevät WAP-kirjanmerkit ja WAP push-viestit tarjoavat käyttäjälle suoran tien
Java-sovelluksia sisältäville WAP-sivustoille.
Pienikokoiset
kännykkään ladattavat Java-sovellukset voivat olla esimerkiksi pelejä tai
hyötyohjelmia, eikä niiden tekeminen ole sen vaikeampaa kuin Java-sovellusten
yleensäkään. Mobiili-Javasta on jo ilmestynyt kattavia teoksia suomeksikin,
joten tässä luvussa luomme vain lyhyen katsauksen siihen, mitä ovat midletti ja
MIDP, ja millaisia ohjelmia puhelimille voidaan laatia. Lisäksi teemme pienen
esimerkkisovelluksen ilmaisilla Java-työkaluilla.
Java-ohjelmointikieli
samoin kuin sillä kirjoitettuja ohjelmia suorittava Java-virtuaalikone saivat
alkunsa kämmenlaiteprojektista. Nykyisin suurin osa Java-ohjelmista on
kuitenkin tehty palvelimille ja työpöytäkoneille. Mutta tilanne on muuttunut,
sillä muutaman viime vuoden aikana Java on ollut varsin voimallisesti
palaamassa juurilleen.
Sun Microsystems
jakoi vuonna 1998 ilmestyneen Java 2 -version teknologian kolmeen osaan.
Yleisin ja tutuin versio on Java Standard Edition eli JSE, jolla tehdään niin
web-sivujen appletteja kuin tavallisia hyötyohjelmiakin. Järeämpään
palvelinpuolen ohjelmointiin on Java Enterprise Edition eli JEE, joka sisältää
erityisesti tietokantojen ja paremman tietoturvan vaatimia lisäkirjastoja.
Meitä kiinnostaa tässä yhteydessä pienlaitteisiin tarkoitettu Java ME, johon
perustuvat sekä kännyköiden että pda-laitteiden Java-toteutukset.
Suurimmat matkapuhelinvalmistajat
ovat muutaman viime vuoden aikana tuoneet markkinoille useita kännykkämalleja,
joihin voidaan ladata Java-ohjelmia suoritettavaksi puhelimen
Java-virtuaalikoneessa. Ensimmäiset puhelimiin tehdyt Java-sovellukset ovat
luonnollisesti olleet pelejä.
Kännyköiden
perussovellusten joukko vaihtelee yleensä mallista riippuen puhelinmuistiosta
ja tekstiviestieditorista kalenteriin ja muutamaan peliin. Javaa tukevia
kännyköitä on jo käytössä miljoonia, ja sovelluskehittäjät samoin kuin peliohjelmoijatkin
saanevat pikaisesti kiinni Javan potentiaalista.
Uusimmissa
puhelimissa on muistia ja suoritintehoa jo enemmän kuin alkuaikojen mikroissa.
Näyttö tosin on pieni, eikä perinteistä näppäimistöäkään monissa ole, mutta
esimerkiksi pelien pelaamista se ei suuremmin tunnu haittaavan. Ensimmäiset
kännyköihin tehdyt sovellukset ovatkin olleet pelejä. Perinteiset yhden
pelaajan äly- ja "lautapelit" ovat jo varsin pelattavia.
Kun tuntumaa on saatu
viihdepuolelta, tulevat hyötyohjelmat. Erilaisia pörssikurrssi- ja
pikaviestisovelluksia samoin kuin mikroselaimia ja kalenteriohjelmia tuli
mukaan nopeasti. Java-puhelimista yleensä löytyvä nettiyhteys tuo ohjelmille
mahdollisuuden ladata päätelaitteeseen vaikka tv-ohjelmatietoja tai mitä
tahansa muuta dataa. Nyt on jo myös gps-satelliittipaikannuksesta saatavia
tietoja hyödyntäviä sovelluksia.
Java ME voi esiintyä
erilaisina pienlaitteille sovitettuina kokoonpanoina. CLDC (Connected Limited
Device Configuration) on tarkoitettu vähän muistia ja pienen suoritintehon
omaaville laitteille. Tällaisia ovat juuri puhelimet ja pda-laitteet. DCD
(Connected Device Configuration) puolestaan vaatii laitteistolta jo vähän
enemmän muistia ja suoritintehoa, mutta ei sentään läheskään pc:n tehoa. Tässä luomme
katsauksen ensin mainittuun eli kännyköissä käytettyyn CLDC-konfiguraatioon.
Java ME:n profiilit
määrittelevät tietylle laiteperheelle parhaiten soveltuvan yhdistelmän
ominaisuuksia ja ohjelmistorajapintoja, joita ohjelmoijat voivat käyttää
kirjoittaessaan sovelluksia. CLDC voi toimia perustana usealle erilliselle
profiilille. Toistaiseksi sille on määritelty vain yksi profiili, nimeltään MID
Profile (Mobile Information Device Profile). Java-ominaisuuksia kännyköissään
tarjoavat puhelinvalmistajat noudattavat tätä profiilia. Se ilmaistaan
lyhenteellä MIDP.
Java ME:n, kokoonpanojen ja profiilien välinen suhde selviää tarkemmin oheisesta kuvasta.
MIDP -versio 1.0 valmistui vuonna 2000 ja on käytössä kaikissa
Java-kännyköissä. MIDP -version 2.0 määritys valmistui vuoden 2002 lopulla, ja senkin mukaiset puhelimet yleistyivät käytössä nopeasti.
Java-ohjelmiin
liittyvässä sanastossa jokaisen tuntema appletti on nettisivulla toimiva
ohjelma ja servletti palvelimella toimiva ohjelma. Tämän mukaan
MIDP-päätelaitteessa eli yleisimmin puhelimessa toimiva Java-ohjelma on
midletti. Sen englanninkielinen kirjoitusasu on MIDlet. Nuo nimitysten
let-päätteet tulevat lähinnä "käytännön kielenhuollosta";
sovellusohjelmaa alunperin tarkoittava application taipui muotoon applet eli
pikkuohjelma ja service -sanasta muotoutui servlet eli kevytpalvelu. Siten
MIDP-päätelaitteessa toimiva Java-ohjelma on midletti.
Midletin
suorittamisesta vastaa puhelimeen sovitettu Java-virtuaalikone (KVM), joka yleensä
kykenee ajamaan yhtä midlettiä kerrallaan. Kuten pc-ympäristössäkin,
virtuaalikone tulkitsee Java-ohjelman tavukoodit suorituksen aikana.
Virtuaalikoneen yhteydessä ovat CLDC:n ja MIDP:n valmiit luokkakirjastot,
joiden luokkia midletit käyttävät.
Kännykkään midletit
saadaan joko lataamalla matkapuhelinverkon palvelimelta tai siirtämällä pc:ltä
esimerkiksi usb- infrapuna- tai bluetooth -yhteyden avulla. Puhelimen
pysyväismuistissa olevia midlettejä hallitaan erillisellä ohjelmalla, jolla
niitä voidaan myös poistaa muistista. Midleteille varatun pysyväismuistin määrä
on kännyköissä yleensä 30 - 100 kilotavun luokkaa. Tyypillisen midletin koko on
5 - 50 kilotavua. Joissakin puhelinmalleissa midletin koolle on asetettu tietyt
rajat. Käytännössä midletien kokoa kannattaa vahtia jo senkin takia, että
niiden lataaminen ainakaan gsm-yhteydellä ei ole järin ripeää.
Jotta midletit
voitaisiin siirtää puhelimeen, ne täytyy pakata jar-tiedostoksi ja niille on
tehtävä tekstimuotoinen kuvaustiedosto. Samaan pakettiin voidaan laittaa
useitakin midlettejä kokoelmaksi (engl. MIDlet suite), jolloin ne voivat
käyttää yhteisiä kuvatiedostoja ja muita resursseja paketin sisältämistä
tiedostoista.
Midlet-paketit ovat
Java-pakkauksista tuttuja jar-tiedostoja. Paketin kuvaustiedosto on
jad-päätteinen ja sisältää tietoja kokoelman midleteistä, versioista, tekijästä
ja muista määreistä. Paketin ja kuvaustiedoston saa helposti aikaan
työkaluohjelmilla, niitä ei tarvitse tehdä erikseen. Syntyvät jar- ja jad-tiedostot
sijoitetaan esimerkiksi www-palvelimelle.
Ladattaessa midlettiä
verkosta kännykkään Java-sovellusten hallintaohjelma lataa jad-tiedoston ja sen
ilmoittaman jar-pakkauksen. Latauksen jälkeen midletti tallennetaan puhelimen
pysyväismuistiin, josta se voidaan käynnistää sovellushallintaohjelmalla.
Selausistunnossa navigoidaan jad-tiedostoon. Tätä varten palvelimen on
luonnollisesti osattava lähettää kännykän selaimelle oikea mediatyyppi.
Hallintaohjelmalla midletti voidaan myös poistaa puhelimen pysyväismuistista ja
päivittää se tarvittaessa uudempaan versioon.
Tämän luvun lopussa
olevan esimerkkiohjelmamme kuvaustiedosto sisältää joukon MIDP-standardin
mukaisia määritteitä; midletin nimen, jar-pakkaukseen osoittavan URLin sekä
midlettikohtaisia tietoja:
MIDlet-1: PainoVahti, PainoVahti.png, PainoVahti
MIDlet-Jar-Size: 2312
MIDlet-Jar-URL: PainoVahti.jar
MIDlet-Name: PainoVahti
MIDlet-Vendor: Asko Laurila
MIDlet-Version: 1.0
Java-ohjelmoija voi
MIDP:n avulla tehdä midletille yksinkertaisen mutta toimivan käyttöliittymän.
MIDP:n käyttöliittymä on nimeltään LCDUI (Lowest Common Denominator User
Interface). Siihen on tarkoituksella valittu vain joukko sellaisia
peruskomponentteja, jotka suurin osa puhelinvalmistajista kykenee laitteissaan
toteuttamaan, koska komponentit ovat todennäköisesti jo muutenkin käytössä
puhelimen omissa ohjelmistoissa. Pyrkimys on saada Java-ohjelma muistuttamaan
mahdollisimman pitkälle kännykän muita ohjelmia, jotta käyttäjän ei tarvitsisi
opetella erilaisia käyttöliittymiä.
LCDUI toimii
käsitteellisesti suhteellisen korkealla tasolla. Siinä on vain kymmenen
erilaista näyttökomponenttia, joilla rakennetaan ohjelman tarvitsema
käyttöliittymä. Komponentit ovat ohjelmoijan käytössä Java-luokkina, jotka
löytyvät pakkauksesta javax.microedition.lcdui. Lisäksi on käytettävissä
valikoima matalan tason grafiikanpiirto-ominaisuuksia. Esimerkiksi useimmat
pelit käyttävät korkean tason käyttöliittymää harvoin; kaikki peliruudulla
näkyvä saatetaan tehdä piirtämällä suoraan näytölle. Tällöin omat
grafiikkarutiinitkin täytyy luonnollisesti kehitellä itse.
Hyötyohjelmissa
tyydytään yleensä karuun ilmeeseen. Käyttöliittymä perustetaan usein lomakkeen
eli Form-luokan varaan. Lomakkeelle voidaan kätevästi lisätä tekstiä ja kuvia.
Lomakkeen lisäksi korkean tason komponentteja ovat lista (List), tekstimuokkain
(TextBox) ja käyttäjälle annettava ilmoitus (Alert). Kaikki nämä näkyvät aina
koko ruudun kokoisina, kuten myös grafiikan piirtämiseen tarkoitettu piirtopinta
(Canvas).
Käyttöliittymän
kuhunkin näyttöön voi liittyä useita komentoja, jotka saadaan käyttöön
painamalla puhelimen toimintonäppäimiä. MIDP-ohjelma ei kuitenkaan määrää, mitä
kustakin näppäimestä tapahtuu, koska näppäintoiminnot saattavat vaihdella puhelinten
välillä. Hyvin tehty midletti ei myöskään tee olettamuksia sen suhteen,
millaisessa laitteessa sitä suoritetaan.
Midletti koostuu
yhdestä tai useammasta Java-luokasta. Pääluokka täytyy periyttää luokasta
javax.microedition.midlet.MIDlet. Sen metodeja kuormittamalla eli
ylimäärittelemällä midletti saadaan sovitetuksi käyttöliittymään halutulla
tavalla. Ohjelmoija voi tehdä myös omia apuluokkia, ja vaikka uusia
Canvas-luokkaan perustuvia käyttöliittymäkomponentteja. Kaikki midletin tarvitsemat
luokat pakataan samaan jar-tiedostoon.
Yksinkertaisen,
puhelimessa toimivan Java-ohjelman tekemiseen ei vaadita järin valtaisaa
ponnistusta. Esimerkkiohjelmamme lähdekooditiedoston pituus on alle 80
ohjelmariviä.
import
javax.microedition.lcdui.*;
import
javax.microedition.midlet.*;
public class
PainoVahti extends MIDlet implements CommandListener {
private Display display;
private Form inputForm;
private TextField heightField;
private TextField weightField;
private Command exitCommand;
private Command showCommand;
private
Alert message;
public PainoVahti() {
display = Display.getDisplay(this);
message = new Alert("");
inputForm = new Form("Omat
tiedot");
heightField = new
TextField("Pituus (cm):", "", 3, TextField.NUMERIC);
inputForm.append(heightField);
weightField = new
TextField("Paino (kg):", "", 3, TextField.NUMERIC);
inputForm.append(weightField);
exitCommand = new Command("Sulje",
Command.EXIT, 1);
showCommand = new
Command("Laske", Command.SCREEN, 1);
inputForm.addCommand(exitCommand);
inputForm.addCommand(showCommand);
inputForm.setCommandListener(this);
}
public void startApp() {
display.setCurrent(inputForm);
}
protected void pauseApp() {
}
protected void destroyApp(boolean
unconditional) {
}
private void exit() {
destroyApp(true);
notifyDestroyed();
}
public void commandAction(Command c,
Displayable d) {
if (c == exitCommand) {
exit();
}
else if (c == showCommand) {
try {
int heightValue =
Integer.parseInt(heightField.getString());
int weightValue =
Integer.parseInt(weightField.getString());
int bmi =
getBodyMassIndex(heightValue, weightValue);
message.setType(AlertType.INFO);
message.setString("Painoindeksi: " + Integer.toString(bmi));
}
catch (NumberFormatException nfe)
{
message.setType(AlertType.ERROR);
message.setString("Numerovirhe");
}
catch (IllegalArgumentException
iae) {
message.setType(AlertType.ERROR);
message.setString(iae.getMessage());
}
display.setCurrent(message,
inputForm);
}
}
private int getBodyMassIndex(int height,
int weight) {
if (height <= 0 || weight <= 0)
{
throw new
IllegalArgumentException("Ei negatiivisia lukuja!");
}
return ((weight * 10000) / (height *
height));
}
}
Jos käytämme midletin
rakentamiseen Sunin Java ME Wireless Toolkitia, perustetaan ensin uusi projekti
napsauttamalla New Project -painiketta ja syötetään asetukset. Näin syntyy uusi
projektihakemisto C:\WTK20\apps\PainoVahti (jos WTK:n asennuksessa on käytetty
oletushakemistoa). PainoVahti.java sijoitetaan projektihakemiston alla olevaan
src-hakemistoon.
Projektin asetukset
säädetään napsauttamalla WTK:n Settings-painiketta ja täydentämällä tarvittavat
kohdat. Näin ohjelma on valmis käännettäväksi. Se onnistuu Build-painikkeella,
ja samalla syntyy tarvittava jar-pakkaus. Saman voi tehdä Project-valikon Build
-komentoa käyttäen.
Nyt ohjelma voidaan
suorittaa jollakin WTK:n mukana tulevista emulaattoreista (tai WTK:hon
liitetyillä puhelinvalmistajien emulaattoreilla). Valitaan sopiva emulaattori
Device-pudotusvalikosta, ja haetaan emulaattorilla projektin bin-kansiosta
jad-tiedosto. DefaultGrayPhone ja DefaultColorPhone ovat pelkistettyjä
MIDP-laitteita, jotka eivät suoraan vastaa yhdenkään valmistajan puhelimia.
Niillä saa kuitenkin hyvän käsityksen siitä, miten ohjelman logiikka toimii.
Laske -käskyllä
emulaattori vilauttaa ohjelman laskeman painoindeksin ja heläyttää samalla
äänimerkin. Emulaattorin näyttö palautuu samantien tietojen syöttö -sivulle.
Sovellus pysäytetään Sulje-käskyllä.
Painovahti on varsin
yksinkertainen harjoitelma, mutta tekee hyödyllisen laskutoimituksen käyttäjän
puolesta. Useimmat Java-puhelimiin saatavilla olevat midletit ovat
toiminnoiltaan huomattavasti kehittyneempiä, ja valikoimaakin alkaa jo olla
runsaasti. Internetistä löytyy useita midlettejä tarjoavia sivustoja.
Puhelimeen midlettejä
lataavan kannattaa muistaa, että vaikka niiden pitäisi periaatteessa toimia
kaikissa MIDP-laitteissa, koodaajien joukko on perin kirjava ja ohjelmiin
-varsinkin peleihin- väsätään eri
versioita eri puhelinvalmistajien malleille, näyttöjen erilaisuudesta johtuen.
Yhteensopimattomuus johtuu myös siitä, että ohjelmoijat eivät viitsi tai osaa
suunnitella midlettejä siirrettäviksi. Joidenkin ominaisuuksien osalta kännykät
voivat poiketa toisistaan niin paljon, että eri version tekeminen onkin
perusteltua.
Ladattavien
midlettien kokoa on monissa kännyköissä rajoitettu. Syynä tähän voi olla joko
käytettävä siirtotekniikka tai suhteellisen pieni midleteille varattu muistin
määrä. Ensimmäisen sukupolven midletit ja Java-puhelimet jättivätkin vielä
reippaasti petrattavaa, mutta tarjonta paranee kaiken aikaa. Paremmilla
midleteillä riittää potentiaalia.
Sun Microsystems
julkaisee säännöllisesti artikkeleita MIDP-ohjelmoinnista Java ME TechTips -uutiskirjeinä,
joita voi lukea myös webissä osoitteessa
http://java.sun.com/developer/J2METechTips/
MicroJava.com on
puolueeton Java ME -ohjelmointiin keskittynyt verkkosivusto osoitteessa
http://www.microjava.com/, joka myös toimittaa uutiskirjeitä.
Nokian
sovelluskehittäjille tarkoitettu portaali Forum Nokia osoitteessa
www.forum.nokia.com sisältää työkalujen ja emulaattoreiden lisäksi
esimerkkiohjelmia ja artikkeleita.
Bill Day on yksi Java ME -ohjelmoinnin pioneereista ja pitää yllä omaa Java ME Archive-sivustoa osoitteessa http://billday.com/j2me/
MIDlet Central (http://www.midletcentral.com/) oli yksi ensimmäisistä midlettien latauspaikoista webissä (edellyttää ilmaista rekisteröintiä). MIDlet Review (http://www.midlet-review.com/) puolestaan sisältää mobiilipelien arvosteluja.
Suomalaisista
operaattoreista monet tarjoavat Javalla tehtyjä mobiilipelejä puhelimiin.
Suomalaiset pelitalot Sumea (http://www.sumea.com/) ja Mr. Goodliving (http://www.mrgoodliving.com/) tunnetaan värikkäistä Java-peleistä.