Privatcafé

‘Write once, run anywhere’ hieß es in den FrĂŒhzeiten der Java-Entwicklung. Trotz vieler EnttĂ€uschungen gibt es Möglichkeiten, den Traum zumindest in bestimmten Bereichen zu verwirklichen - etwa auf Smartphones oder PDAs.

vorlesen Druckansicht 4 Kommentare lesen
Lesezeit: 11 Min.
Von
  • Ramon Wartala
Inhaltsverzeichnis

WĂ€hrend der Hype um ‘Wireless Java’ so schöne Akronyme wie J2ME, KVM, MIDP und CLDC hervorgebracht hat, ist eine andere Java-Version auf aktuellen mobilen EndgerĂ€ten bereits benutzbar. PersonalJava bringt einen großen Teil der Bibliotheken von Java 1.1.8 wie java.awt, java.net, java.rmi und java.sql mit. So ist diese Version heute auf modernen PDAs und Smartphones in der Lage, Programme auszufĂŒhren, die vor Jahren noch die gĂ€ngigen Internet-Browser ausgebremst haben. Leider behandelt Sun ausgerechnet diese Java-Version etwas stiefmĂŒtterlich, seit auf der JavaONE 1999 der Slogan ‘one size doesn’t fit all’ die Geburt der Java2-Familie einlĂ€utete.

PersonalJava erblickte das erste Mal vor drei Jahren das Licht der Welt. Damals wollte Sun das Java-Konzept auf die eingebetteten Systeme ĂŒbertragen. Als Ergebnis dieser BemĂŒhungen entstanden EmbeddedJava, JavaCard und PersonalJava. Die von Java her bekannte Klassenbibliothek wurde in zwei Teile zerlegt. Das ‘Mandatory Package’ musste jeder Lizenznehmer implementieren. Zu diesem gehören die APIs java.applet, java.awt und java.net. Hingegen sind java.rmi und java.sql Teil des ‘Optional Package’. Es bleibt den Herstellern ĂŒberlassen, ob und wie sie diese APIs fĂŒr ihre GerĂ€te implementierten.

Auf java.sun.com/products/personaljava/ finden sich zwar die ĂŒblichen VerdĂ€chtigen wie API-Dokumentation und Laufzeitumgebung, aber angepasste Beispielprogramme sind eher spĂ€rlich gesĂ€t. Der Grund dafĂŒr ist wohl der bis vor kurzem anhaltende Run auf die Java2 Microedition (J2ME), die an dieser Stelle [1] schon zu ihrem Recht kam.

Zwei kleine Beispielprogramme demonstrieren die Möglichkeiten dieser Java-Version. Das erste zeigt, wie einfach sich manche Anwendungen, die noch aus Java 1.1.x-Zeiten stammen, auf PersonalJava portieren lassen. Hier geht es um das Programm DocReader zum Lesen und Anzeigen des verbreiteten PalmDOC-Formats. Dieses erfreut sich unter Palm-Besitzern nicht zuletzt deshalb großer Beliebtheit, weil fĂŒr viele Rechnerplattformen kostenlose Konvertierer vorhanden sind, die das Format erzeugen können.

Java machts möglich: Derselbe PalmDOC-Reader fĂŒr PCs (Windows), den Symbian Crystal Emulator und das Nokia 9210 (Abb. 1).

Mit geeigneten Konvertierungsprogrammen fĂŒr Mac oder Windows (siehe ‘PersonalJava im Web’), sind so zum Beispiel die E-Texte des Projekt-Gutenberg auf dem iPAQ oder dem Communicator zu lesen. Trotz einheitlicher Programmiersprache muss man auf GerĂ€tespezifisches achten. Bei den hier gezeigten Beispielen sind dies nur die Display-Auflösung und die Anordnung der GUI-Elemente. Um sicher zu gehen, dass wirklich nur Aufrufe der Java1.1.x-API vorkommen, empfiehlt es sich entweder, auf den JavaChecker von Sun oder einfach auf ein Ă€lteres Java-SDK zurĂŒckzugreifen. Unter java.sun.com/products/jdk/1.1/ bietet Sun nach wie vor die Version 1.1.8 fĂŒr Windows und Solaris an. Nennt man darĂŒber hinaus eine ‘Multi-VM IDE’ sein eigen, etwa Borlands JBuilder Professional, kann man die Programme direkt aus der vertrauten Umgebung heraus auf ihre KompatibilitĂ€t testen und erstellen. Dazu reicht es, als ‘Ziel-JDK’ in den Projekteigenschaften diese Ă€ltere JVM anzugeben.

Nachdem der Quellcode fĂŒr den DocReader den ersten Compilerlauf mit dem installierten JDK 1.1.8 ĂŒberstanden hatte, waren lediglich die FenstergrĂ¶ĂŸe und -positionierung der Anwendung in der Klasse DocReaderView zu modifizieren. Wie fĂŒr das ‘große’ Java ĂŒblich, lassen sich die Bildschirmabmessungen mit der in Zeile 30 aufgerufenen Methode getScreenSize() ermitteln. Um das Anwendungsfester zentriert und hochkant auf dem Bildschirm auszugeben, wurde es ursprĂŒnglich mit

setLocation((screenSize.width - 450)/2,
(screenSize.height - 500)/2);

positioniert. Dies hat jedoch bei kleinen Bildschirmen keinen Sinn. Diesen Aufruf ersetzt jetzt die Zeile 37 (siehe Listing 1). Damit DocReader das gesamte Display nutzen kann, verwendet das Programm in Zeile 34 eine flexible GrĂ¶ĂŸenangabe. An diesem Beispiel zeigt sich, wie sinnvoll Layout-Manager sein können. Das hier verwendete BorderLayout nutzt den vorgefundenen Platz fĂŒr die Darstellung der einzelnen Widgets immer optimal aus. Leider zahlt man dafĂŒr den Preis, dass Java-Anwendungen keinem GUI-Design-Guide mehr entsprechen. Bliebe als Letztes, die GrĂ¶ĂŸe und Art der verwendeten Schrift zu bestimmen. Auch dafĂŒr könnte man sich sicherlich einen schlauen Algorithmus ausdenken, der die SchriftgrĂ¶ĂŸe anhand der BildschirmgrĂ¶ĂŸe wĂ€hlt. Doch gerade dabei kommt es auf den eigenen Geschmack und die persönliche ‘SehschĂ€rfe’ an.

Mehr Infos

Listing 1

AuflösungsunabhÀngige Darstellung im DocReader

1   public class DocReaderView extends Frame implements Observer {
2 public DocReaderView(DocReaderCtrl controller) {
3 setLayout(new BorderLayout());
4
5 // erzeugt die MenĂŒbuttons
6 Panel buttonPanel = new Panel(new GridLayout(1, 6));
7 openButton = createAddButton("Open", controller, buttonPanel);
8 searchButton = createAddButton("Search", controller, buttonPanel);
9 bmkButton = createAddButton("Bookmarks", controller, buttonPanel);
10 topButton = createAddButton("Top", controller, buttonPanel);
11 bottomButton = createAddButton("Bottom", controller, buttonPanel);
12 quitButton = createAddButton("Quit", controller, buttonPanel);
13 add(buttonPanel, BorderLayout.NORTH);
14
15 // erzeugt die TextArea und registriert den KeyListener
16 textArea = new TextWidget();
17 textArea.addKeyListener(controller);
18 add(textArea, BorderLayout.CENTER);
19
20 // erzeugt das Statuslabel
21 statusLine = new Label(" Written by Christopher Y. Wong,
22 ported by Ramon Wartala");
23 add(statusLine, BorderLayout.SOUTH);
24 // ein Scrollbar fĂŒr den Text
25 scrollbar = new Scrollbar(Scrollbar.VERTICAL);
26 scrollbar.addAdjustmentListener(controller);
27 add(scrollbar, BorderLayout.EAST);
28
29 // Ermittlung der Display-Auflösung
30 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
31 setTitle("Doc Reader for Nokia9210");
32
33 // setzen der FenstergrĂ¶ĂŸe
34 setSize(screenSize.width,screenSize.height);
35
36 //setzen der Fensterposition
37 setLocation(0,0);
38 addComponentListener(controller);
39
40 viewBounds = new ViewBounds(textArea);
41}

Das zweite Beispiel realisiert eine etwas grafiklastigere Anwendung. Im Zusammenspiel mit dem kXML-Paket von Stefan Haustein, das unter anderem im Enhydra-Projekt zum Einsatz kommt, soll eine einfache Anwendung erstellt werden. Ausgehend von einem selbst definierten XML-Format berechnet und zeichnet sie eine simple Tortengrafik. Zum Analysieren des XML-Formats wĂ€ren JAXP oder Apaches Xerces sicherlich ĂŒberdimensioniert. Mit dem in kXML implementierten Event-Ansatz lassen sich aber schnell und einfach eigene XML-Parser erstellen. Zum einfacheren VerstĂ€ndnis prĂŒft die eigentliche Parsing-Methode getChartItems() der Java-Klasse xmlChartParser die ausgelesenen Werte nicht auf PlausibilitĂ€t. Das einzulesende XML-Format enthĂ€lt Informationen ĂŒber die Beschriftung, den Wert und die Farbe eines TortenstĂŒcks. Man kann dieses Dateiformat mit einem einfachen Texteditor auch auf dem GerĂ€t selber modifizieren. Der vollstĂ€ndige Quellcode ist auf dem iX-Listingsserver erhĂ€ltlich.

Mehr Infos

Listing 2

XML-Beispieldatei fĂŒr eine Tortengrafik mit drei Segmenten (10 %, 70 % und 20 %)

<?xml version="1.0" encoding='iso-8859-1'?>
<simple_chart title="Piechart 1">
<chart_item>
<label>10.000</label>
<value>10.0</value>
<color scheme="RGB">255,0,0</color>
</chart_item>
<chart_item>
<label>70.000</label>
<value>70.0</value>
<color scheme="RGB">0,255,0</color>
</chart_item>
<chart_item>
<label>20.000</label>
<value>20.0</value>
<color scheme="RGB">0,0,255</color>
</chart_item>
</simple_chart>

Auf dem iPAQ zeigt das Demoprogramm eine XML-Tortengrafik an (Abb. 2).

Wie bei eingebetteten Systemen ĂŒblich, findet die Hauptentwicklungsarbeit auf einem leistungsfĂ€higen System und das Testen innerhalb von Emulatoren statt. Dem folgt die Installation auf dem ZielgerĂ€t.

Nokia verteilt gegen eine kostenlose Registrierung unter forum.nokia.com/main.html ein SDK fĂŒr Windows NT/2000, das neben der ĂŒblichen Dokumentation einen speziellen Emulator mitbringt, der dem eigentlichen Smartphone zum Verwechseln Ă€hnlich sieht. Die Installation eigener Java-Programme setzt ein wenig Aufwand voraus, da Nokia das von Epoc her bekannte Installationsformat SIS vorgesehen hat. Mit dem AIFBuilder (AIF steht in der Epoc-Welt fĂŒr Application Information File) können diese Packages jedoch relativ komfortabel zusammengesetzt werden. Folgende Informationen und Dateien sind dafĂŒr erforderlich:

  • Pkg-Datei, die das Ziel und die einzelnen Komponenten des zu installierenden Programms enthĂ€lt. FĂŒr das Beispielprogramm xmlPieChart kann diese Datei wie folgt aussehen:
    #{"xmlPieChart"},(0x10001123),1,0,0\TYPE=SISAPP
    "xmlPieChart.aif"-"!:\system\apps\xmlPieChart\xmlPieChart.aif"
    "xmlPieChart.txt"-"!:\system\apps\xmlPieChart\xmlPieChart.txt"
    "xmlPieChart.app"-"!:\system\apps\xmlPieChart\xmlPieChart.app"
    "xmlPieChart.jar"-"!:\system\apps\xmlPieChart\xmlPieChart.jar"
    Die erste Zeile nimmt den Namen der Applikation und deren ID auf. Die folgenden geben die benötigten Dateien und das Zielverzeichnis der Installation an. Das Ausrufungszeichen wird bei der Installation durch das Ziel’laufwerk’ ersetzt (Hauptspeicher oder MultiMediaCard).
  • Die Datei xmlPieChart.txt erhĂ€lt die fĂŒr den Aufruf der Applikation nötigen Kommandozeilen-Parameter. Befinden sich alle Klassen- und Ressourcen-Dateien in einem JAR-Archiv, kann man die dort enthaltene Start-Klasse so aufrufen:
    -cp xmlPieChart.jar xmlPieChart
  • Jede Applikation benötigt zwei Icons mit 64x60 beziehungsweise 25x20 Pixeln, um innerhalb des Extra-MenĂŒs sowohl in der Listen- als auch in der Symbol-Ansicht zu erscheinen. FĂŒr deren Erstellung kann man zwar den AIFBuilder verwenden, komfortabler geht es jedoch mit einem gĂ€ngigen Grafikprogramm und einem geeigneten Konverter, der das MBM-Format (Multi-Bitmap) versteht.

Sind alle Dateien erzeugt, baut das Kommandozeilenprogramm makesis die endgĂŒltige Installationsdatei:

makesis.exe -v xmlPieChart.pkg xmlPieChart.SIS

Mit Hilfe der PC-Suite lÀsst sich die entstandene SIS-Datei nun auf dem Communicator installieren.

Viele VorankĂŒndigen zum Nokia 9210 gingen noch davon aus, dass man dort Applets innerhalb des Browsers ausfĂŒhren könnte. Dass diese Funktion im endgĂŒltigen Produkt nicht existiert, liegt vermutlich an der geringen Speicherausstattung. Leider fehlt auch ein einfacher Appletviewer. FĂŒr ein weiteres ‘VersĂ€umnis’ kann man allerdings keine wirkliche Entschuldigung finden. Um die in der SDK-Dokumentation beschriebenen Crystal-AWT-Erweiterungen nutzen zu können, fehlen auf dem Communicator die nötigen Java-Klassen. DafĂŒr mĂŒsste sich die Datei CAWT.jar in System\Java\ext auf dem GerĂ€t befinden. Ohne sie lassen sich native Erweiterungen wie die Communicator-typischen ‘Display-Buttons’ am rechten Rand des Bildschirms oder der virtuelle Cursor nicht implementieren. Ein weiteres Problem stellt die Ausgabe der Streams System.out und System.err dar. Da die JVM nach der Beendigung einer Java-Anwendung nicht auf ein Konsolen-Fenster zurĂŒckkehrt, sind textbasierte Anwendungen ebenso wenig möglich wie die Fehlersuche per print-Aufruf. GlĂŒcklicherweise lĂ€sst sich diese Funktion mit Hilfe der SDK-CD nachrĂŒsten. In <Installationsverzeichnis>\NokiaJava\erj\tools\redirect befindet sich die Installationsdatei Redirect.SIS. Nach erfolgreicher Installation und Start auf dem 9210 werden alle Ausgabeströme der eigenen Java-Anwendung auf dieses Fenster umgeleitet.

Mehr Infos

Auch fĂŒr Compaqs iPAQ gibt es eine PersonalJava-konforme VM. Leider findet man nur wenig Dokumentation zu der Jeode-Architektur von Insignia. So ist der neugierige Entwickler auf sich selbst gestellt oder muss Diskussionsforen nach Neuigkeiten abklappern (siehe ‘PersonalJava im Web’). Die JeodeRuntime bekommt man zwar nicht kostenlos, doch ist der Preis von circa 19 US-$ zu verschmerzen, wenn man wirklich ernsthafte Applikationen fĂŒr diesen PDA erstellen möchte. Im Gegensatz zu Suns kostenloser Vorabversion einer StrongARM-JVM ist diese Software keine Betaversion und lĂ€uft auch als Plugin innerhalb von Microsofts Pocket Internet Explorer.

Etwas schwierig gestalten sich auf dem iPAQ Installation und Start komplexerer Programme, da die JVM nur via Kommandozeile benutzbar ist. NatĂŒrlich möchte man eigene Java-Applikationen wie jedes andere WindowsCE-Programm starten können. Dazu ist ein kleiner Trick notwendig, der nur ĂŒber einen angeschlossenen PC und ein gestartetes ActiveSync funktioniert. Mit dem geöffneten Datei-Explorer erzeugt man auf dem PocketPC eine ProgrammverknĂŒpfung. Diese lĂ€sst sich auf den Host-PC ĂŒbertragen und mit einem einfachen Texteditor Ă€ndern. Eine solche editierte VerknĂŒpfung könnte fĂŒr die xmlPieChart-Applikation folgendermaßen aussehen:

56#\windows\evm.exe -cp \windows\lib\xmlPieChart.jar xmlPieChart

An dieser Zeile lĂ€sst sich nachvollziehen, in welchem Verzeichnis sich die JAR-Datei der Anwendung befinden muss. Kopiert man die geĂ€nderte VerknĂŒpfung wieder auf den iPAQ, ist das Programm dort bequem mit einem Stiftdruck zu starten.

PersonalJava ermöglicht die Anbindung an bestehende Kommunikationsstandards und somit an Enterprise-Lösungen durch die UnterstĂŒtzung der meisten Java-Bibliotheken. Allerdings um den Preis eines ziemlich großen Ressourcenhungers. Auf Nokias 9210 kann man dies ab und zu an der Meldung ‘Nicht genug Speicher’ feststellen. Um Anwendungen zu erstellen, die sich von ihrem C++-Pendant in der Bedienung nicht mehr unterscheiden, ist zumindest unter Symbians SDK einiges an Arbeit nötig.

Ramon Wartala
arbeitet bei der Firma TEMIS (Text Mining Solutions) Deutschland GmbH in Frankfurt und Paris.

[1] Stefan Haustein, Michael Kroll, Ramon Wartala; Palm-Programmierung; Kaffee unter Palmen; Java-Programme fĂŒr den PalmPilot entwickeln; iX 11/1999, S. 196

Mehr Infos

iX-TRACT

  • PersonalJava ist eine Ă€ltere Java-Version, die unter anderem in Nokias aktuellem Communicator installiert ist.
  • Es basiert auf dem JDK 1.1.8, und damit erstellte Java-Anwendungen lassen sich leicht auf KleingerĂ€te portieren.
  • FĂŒr die Installation von PersonalJava-Anwendungen sind je nach GerĂ€t spezielle Verfahren erforderlich.

(ck)