Błażej Pietrzak blazej.pietrzak@cs.put.poznan.pl J2ME CLDC MIDP 1.0 Błażej Pietrzak blazej.pietrzak@cs.put.poznan.pl
Plan prezentacji Przegląd technologii Java J2ME CLDC MIDP 1.0 OTA Provisioning CLDC MIDP 1.0 API Problemy implementacyjne
Przegląd technologii Java
Skróty CLDC – Connected Limited Device Configuration CDC – Connected Device Configuration KVM – Kilobyte Java Virtual Machine JVM – Java Virtual Machine MID – Mobile Information Device MIDP - Mobile Information Device Profile
Stos J2ME
Stos J2ME - Konfiguracje
CLDC – Charakterystyka urządzeń 160kB – 512 kB pamięci dla platformy Java Procesor 16-bit lub 32-bit Niskie zużycie energii Dostęp do sieci, często bezprzewodowej, o niskiej przepustowości (często 9600 bps i niższej)
CLDC – Zakres Podstawowe biblioteki Java java.lang.*, java.util.* Wejście / Wyjście java.io.* Sieć (tylko interfejs) Generic Connection Framework Bezpieczeństwo Lokalizacja (ang. Internationalization) zapis/odczyt Unicode ze strumieni
CLDC – Zakres c.d. System properties microedition.platform java.lang.System.getProperty(key) microedition.platform microedition.encoding microedition.configuration microedition.profiles
CLDC – Bezpieczeństwo Weryfikacja pobranych klas Aplikacje uruchamiane są w piaskownicy (ang. Sandbox) Klasy w chronionych pakietach systemowych nie mogą być nadpisane przez aplikacje
CLDC – Ograniczenia Ograniczenia w stosunku do J2SE Brak danych typu zmiennoprzecinkowego float double Brak finalizacji (ang. finalization) instancji klas Object.finalize() nie istnieje Obsługa błędów brak większości podklas java.lang.Error Błędy są obsługiwane w sposób zależny od urządzenia
CLDC – Ograniczenia c.d. Brak Java Native Interface (JNI) Brak class-loaders zdefiniowanych przez użytkownika Brak mechanizmu refleksji (ang. reflection) Brak obsługi grup wątków i wątków demonów Brak słabych referencji (ang. weak references)
CLDC/KVM – Weryfikacja klas
CLDC/KVM – Weryfikacja klas c.d. Do klasy dodany jest atrybut „stack map” nie występujący w J2SE Zwiększony rozmiar klasy o około 5% Szybciej niż w J2SE mniejsze zużycie pamięci niż w J2SE ten sam poziom bezpieczeństwa co w J2SE Klasy mogą nadal być uruchamiane w J2SE
MIDP – Charakterystyka MID Wyświetlacz (wymagania minimalne) Rozmiar 96x54 pikseli Głębia koloru 1-bit Kształt piksela (Aspect ratio) około 1:1 Wejście One-handed keyboard (ITU-T phone keypad) Two-handed keyboard (QWERTY keyboard) Ekran dotykowy
MIDP - Zakres Interfejs użytkownika Generic Connection Framework Structured (Screen) wysokopoziomowy dostęp większa przenoszalność Unstructured (Canvas) niskopoziomowy dostęp mniejsza przenoszalność Generic Connection Framework protokół http
MIDP – Zakres c.d. Dostęp do pamięci „stałej” urządzenia Record Store Dane zapisywane w postaci rekordów Możliwość prostego filtrowania rekordów Cykl życia aplikacji MIDlet System properties microedition.locale
OTA Provisioning MIDlet Suite - dystrybucja aplikacji J2ME *.jad JAva Descriptor *.jar JAva aRchive
OTA Provisioning – c.d.
OTA Provisioning – c.d.
OTA Provisioning – c.d. HTTP 401 (unauthorized) lub 407 (proxy authentication required) Implementacja przynajmniej Basic Authentication Scheme cookie jako identyfikator sesji MIME text/vnd.sun.j2me.app-descriptor jad Kodowanie przynajmniej UTF-8
OTA Provisioning – c.d. Identyfikacja urządzenia User-Agent Accept-Language Accept
OTA Provisioning – c.d. Plik JAD – wymagane atrybuty Atrybut Opis MIDlet-Name Nazwa MIDlet Suite MIDlet-Version Numer wersji MIDlet Suite MIDlet-Vendor Organizacja MIDlet-<n> Nazwa, ikona, klasa <n> MIDletu MIDlet-Jar-URL URL, z którego można pobrać plik jar MIDlet-Jar-Size Liczba bajtów pliku jar MicroEdition-Configuration Wymagany profil J2ME MicroEdition-Profile Wymagana konfiguracja J2ME
OTA Provisioning – c.d. Plik JAD – opcjonalne atrybuty Atrybut Opis MIDlet-Data-Size Minimalna liczba bajtów pamięci MIDlet-Delete-Confirm Treść pytania przy usuwaniu MIDlet Suite MIDlet-Description Opis MIDlet Suite MIDlet-Icon Ikona MIDlet Suite MIDlet-Info-URL URL do dodatkowej informacji MIDlet-Install-Notify Status pobierania MIDlet Suite
OTA Provisioning – c.d. Fragment przykładowego pliku jad MIDlet-Name: Sample MIDlet-Version: 1.0 MIDlet-Vendor: BP MicroEdition-Profile: MIDP-1.0 MicroEdition-Configuration: CLDC-1.0 ... MIDlet-1: Sokoban, /icons/Sokoban.png, com.bp.sokoban.Sokoban MIDlet-2: HttpTest,,com.bp.http.HttpTest
API - MIDlet Pakiet javax.microedition.midlet
API – interfejs użytkownika Command
API – interfejs użytkownika Command – c.d.
API – interfejs użytkownika Pakiet javax.microedition.lcdui
API – Hello World
API – HelloWorld.jad MIDlet-1: Hello World, , HelloWorldMIDlet MIDlet-Jar-Size: 100 MIDlet-Jar-URL: HelloWorld.jar MIDlet-Name: HelloWorld MIDlet-Vendor: BP MIDlet-Version: 1.0 text: JUG rulez!
API – HelloWorldMIDlet.java public class HelloWorldMIDlet extends MIDlet { private Displayable form = new HelloWorldForm(getAppProperty("text")); public HelloWorldMIDlet() { form.setCommandListener( new HelloWorldListener(this)); } protected void startApp() throws MIDletStateChangeException { Display.getDisplay(this).setCurrent(form); protected void pauseApp() { } public void destroyApp(boolean unconditional) notifyDestroyed();
API – HelloWorldForm.java import javax.microedition.lcdui.*; public class HelloWorldForm extends Form { public static final String EXIT = "Wyjście"; public HelloWorldForm(String text) { super("Hello World"); append((text == null) ? "" : text); addCommand(new Command(EXIT, Command.EXIT, 1)); }
API – HelloWorldListener.java public class HelloWorldListener implements CommandListener { private HelloWorldMIDlet owner = null; public HelloWorldListener(HelloWorldMIDlet owner) { this.owner = owner; } public void commandAction(Command c, Displayable d){ if (c.getLabel().equals(HelloWorldForm.EXIT)) { try { owner.destroyApp(false); } catch (MIDletStateChangeException ex) { }
API – Generic Connection Framework Pakiet javax.microedition.io
API – Generic Connection Framework – Przykłady Connection conn = Connector.open({scheme}:[{target}][parms]); Pliki (StreamConnection) Connector.open(„file://bp.txt”); HTTP (HttpConnection) Connector.open(„http://localhost:8080/”); Sockets (DatagramConnection) Connector.open(„socket://129.14.11.2:9000”);
API – Record Store pakiet javax.microedition.rms
API – RecordStore – Przykład public class FilterComparator implements RecordFilter, RecordComparator { public boolean matches(byte[] candidate) { return (candidate[0] == ‘A’ ? false : true; } public int compare(byte[] arg1, byte[] arg2){ if (arg1[0] > arg2[0]) { return 1; } if (arg1[0] == arg2[0]) { return 0; } if (arg1[0] < arg2[0]) { return –1; }
API – RecordStore – Przykład public void openRecordStore(String name) { try { recordStore = RecordStore.openRecordStore(name, true); } catch (RecordStoreException ex) { } }
API – RecordStore – Przykład public void addPerson(String name, int age) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream outputStream = new DataOutputStream(baos); try { outputStream.writeInt(age); outputStream.writeUTF(name); } catch (IOException ex) { } byte[] b = baos.toByteArray(); recordStore.addRecord(b, 0, b.length); } catch (RecordStoreException ex) { } }
API – RecordStore – Przykład public void printPeople(RecordFilter filter, RecordComparator comparator) { RecordEnumeration re = null; ByteArrayInputStream bais = null; DataInputStream inputStream = null; try { re = recordStore.enumerateRecords(filter, comparator, true); while (re.hasNextElement()) { int id = re.nextRecordId(); bais = new ByteArrayInputStream( recordStore.getRecord(id)); inputStream = new DataInputStream(bais); ...
API – RecordStore – Przykład try { int age = inputStream.readInt(); String name = inputStream.readUTF(); } catch (EOFException ex) { } ....
Implementacja Problemy Rozmiar pamięci Szybkość działania Rozmiar kodu Rozmiar ekranu Klawiatura Błędy w implementacji KVM Garbage Collector
Literatura Mobile Information Device Profile (MIDP) 1.0 Final http://jcp.org/aboutJava/communityprocess/final/jsr037/index.html MIDP APIs for Wireless Applications http://java.sun.com/products/midp/midp-wirelessapps-wp.pdf Applications for MIDs http://java.sun.com/products/midp/midpwp.pdf MIDP 1.0 Style Guide http://java.sun.com/j2me/docs/zip/style-guide-html.zip Forum Nokia http://www.forum.nokia.com/ Motocoder http://developers.motorola.com/developers/default.asp
Koniec Dziękuję za uwagę i oczekuję pytań