Mit der Connected Limited Device Configuration CLDC 1.0 gibt es seit der JavaOne 2000 eine offizielle Java-Version von Sun für den PalmPilot. Die Linux-Portierung der CLDC ermöglicht den Aufbau einer kostenlosen professionellen Entwicklungsumgebung.
Unterthema: iX-TRACT
Unterthema: Linux-Portierung der KVM-CLDC
Unterthema: kAWT: Aktueller Stand
Unterthema: RESSOURCEN IM WEB
Unterthema: LISTING 1: KJavas Bitmap-Klassen
Unterthema: LISTING 2: Show()-Methode
Seit Java 1990 innerhalb des Green-Projekts (http://java.sun.com/people/jag/green) als PDA-Programmiersprache entstand, hat sich der Schwerpunkt der Entwicklung auf Desktops und Server verlagert. Mit der Java 2 Micro Edition (J2ME) kehrt Java nun auf Handys und PDAs zurück. Entworfen für kleine Geräte mit 128 bis 512 KByte Speicher, 16-bis 32-MHz-CPUs und 9600 bps Bandbreite stellt die K Virtual Machine (KVM) die Basis der J2ME dar. Auf dem PalmPilot benötigt diese Miniatur-VM lediglich 40 bis 80 KByte RAM.
Für horizontale Familien von Geräten mit ähnlichen Leistungsmerkmalen definieren Konfigurationen die minimalen Eigenschaften der KVM. Der ersten von Sun freigegebenen Konfiguration, der Connected Limited Device Configuration (CLDC), dient der PalmPilot als Referenzplattform. Neben der KVM schließt die CLDC 1.0 Netzunterstützung, I/O, Sicherheit, Ereignisse und Internationalisierung ein. Das Java Native Interface (JNI) fehlt absichtlich, da Handy-Hersteller Manipulationen durch direkten Zugriff auf ihre Geräte befürchten.
Auf die Konfigurationen bauen Profile für horizontale Gerätefamilien mit gleichem Einsatzgebiet wie Handys auf. Im Rahmen des Java Community Process entwickeln 18 Hersteller zurzeit das Mobile Information Device Profile (MIDP). Die frühe Version eines Handy-Emulators mit MIDP-Unterstützung ist bei Motorola erhältlich (http://www.motorola.com/java/j2me.html), Sun und RIM (www.rim.net) bieten Ähnliches an.
Java auf mobilen Geräten erlaubt den Wechsel von statischen WAP-Seiten zu dynamischen interaktiven Angeboten. Beispielsweise können Handy-Besitzer kostenpflichtige Java-Applikationen auf dem Handy per Internet bezahlen und anschließend auf ihrem Gerät installieren und nutzen. Auch die integrierte Nutzung von Internet und Sprache auf Handys oder grafikintensive Applikationen wie netzbasierte Navigationssysteme sind denkbar.
Nach den Milliardeninvestitionen in UMTS-Lizenzen brauchen die Netzbetreiber Techniken wie J2ME, um interaktive Inhalte anzubieten und Kunden für das neue Übertragungsverfahren zu gewinnen. Neben der sicheren Übertragung von Informationen und Programmen verspricht die Java 2 Micro Edition die Portabilität von Applikationen innerhalb eines Profils. Damit gehört die explizite Unterstützung verschiedener Handys wie bei WAP der Vergangenheit an. Allerdings ist noch einige Arbeit zu leisten, bis Java auf der Mehrzahl von Handys läuft.
Die Portierung der KVM-CLDC 1.0 liefert das fehlende Puzzleteil zum Aufbau einer Java-Entwicklungsumgebung für den PalmPilot. Alle benötigen Werkzeuge sind im Internet kostenfrei verfügbar und lassen sich mit wenigen Handgriffen integrieren.
Nach dem Herunterladen der KVM und der CLDC für den Palm von Sun (siehe Kasten `Ressourcen im Web') erhält man die Tools zur Generierung von .prc-Dateien für den Palm und einen Pilot-Emulator. Bisher unterstützt Sun nur die Plattformen Solaris und Win32. Die KVM-CLDC kann man nach dem Einspielen des Linux-Patches 1.2 von KVMWorld.com mit
cd build/linux; make all
für Linux erstellen. Anschließend ist die Übersetzung und manuelle Konvertierung von Java-Applikationen für den PalmPilot möglich. Für die spätere Verwendung von JBuilder muss der Preverifier von <J2ME-PATH>/tools/ preverifier/build/linux/preverify nach <J2ME-PATH>/bin/preverify kopiert oder ein passender Link angelegt werden.
Als Beispielapplikation soll das `KVM für Linux'-Logo dienen. Es basiert auf der Bitmap-Klasse aus dem Package com.sun.kjava (vgl. Listing 1). KJava ist Suns Übergangslösung für die Entwicklung von Benutzeroberflächen auf mobilen Geräten. Das MIDP-Profil enthält bereits eine fortgeschrittene Version. Zurzeit existiert mit kAWT (siehe Kasten `kAWT: Aktueller Stand') eine Alternative zur Entwicklung von Applikationen, die mit AWT auf dem Desktop und dem Palm laufen.
In KJava sind Bitmaps auf 32 Pixel Breite beschränkt. Das Tool PBM2Palm generiert aus PBM-Grafiken KJava-konforme Bitmaps. Sie werden in vertikale Streifen mit maximal 32 Pixeln Breite aufgeteilt und mit einer show()- Methode in einer eigenen Klasse abgelegt (vgl. Listing 2). Die Beispielapplikation verwendet die mit PBM2Palm generierte Klasse KVMLogo, basierend auf einer GIF-Datei des Autors. PBM2Palm ist in Java geschrieben und ebenfalls über KVMWorld.com verfügbar. Die Erzeugung der Klasse KVMLogo.java geschieht durch
java PBM2Palm kvm4linux.pbm KVMLogo > KVMLogo.java
sofern PBM2Palm im CLASSPATH enthalten ist. Im zweiten Schritt müssen die Klassen KVMLogo.java und KVM4Linux.java mit dem Compiler des JDK übersetzt werden:
javac -classpath <J2ME-PATH>/api/classes *.java
Der Preverifier in der Java 2 Standard Edition benötigt mehr Speicher und CPU-Leistung, als auf Handys und PDAs verfügbar ist. Deshalb existiert für die KVM ein eigener Preverifier, der Klassen für den Einsatz auf der KVM modifiziert:
<J2ME-PATH>/bin/preverify \ -classpath <J2ME-PATH>/api/classes:. \ KVM4Linux KVMLogo
Letzter Schritt vor der Installation auf dem PalmPilot ist die Erzeugung der .prc-Datei
java -cp <J2ME-PATH>/tools/palm/ \ classes.zip:output \ palm.database.MakePalmApp -v \ -bootclasspath <J2ME-PATH>/api/classes.zip \ KVM4Linux
Da es in der KVM keinen CLASSPATH mehr gibt, sorgt -bootclasspath <BOOTPATH> für die Verwendung der Systemklassen. Die Installation der Applikation auf dem Pilot gestaltet sich mit den pilot-link-Tools einfach. Von der Kommandozeile aus startet man die Synchronisation mit
pilot-xfer -i <PRC-FILE>
und lässt den Piloten mit HotSync den Rest erledigen. Dazu müssen die Rechte der seriellen Schnittstelle, an der der PDA angeschlossen ist, Lesen und Schreiben gestatten. Alternativ kann KVM4Linux.prc mit jedem anderem Synchronisationstool wie kpilot installiert werden. Falls noch keine KVM auf dem Pilot vorhanden ist, sind zunächst die Programme <J2ME-PATH>/bin/KVMUtil.prc und <J2ME-PATH>/bin/KVM.prc zu übertragen. Der erste Start einer Java-Applikation auf dem Palm zeigt immer einen Lizenzdialog und verzweigt anschließend in KVMUtil. Ein erneuter Start der Applikation führt dann zum gewünschten Ergebnis.

Java-Applikation KVM4Linux auf dem PalmV (Abb. 1).
Als Teil der KVM-CLDC wird ein Palm-ähnlicher Simulator bereitgestellt, der zwar keine vollständige Emulation bietet, aber die direkte Ausführung aller für die KVM entwickelten .class-Dateien erlaubt:
<J2ME-PATH>/kvm/VmUnix/build/kvm -classpath \ <J2ME-PATH>/api/classes.zip:output KVM4Linux
Inprise bietet mit Handheld Express eine Integration zwischen seiner Java-Entwicklungsumgebung JBuilder und der Java 2 Micro Edition an. Die IDE und Handheld Express Beta sind über die Homepage von Inprise zu beziehen, zur Installation folge man der Beschreibung in Setup_Handheld_Express.html. Über das Menü `File|New' lässt sich nun per Dialog ein Handheld Express Project anlegen. Auf dem gleichen Wege fügt man Spotlets, das heißt Palm-Applikationen, hinzu. Zeit spart HandHeld Express durch den Deployment Wizard. Dort klickt man die Klassen einer KVM-Applikation zusammen und überlässt JBuilder anschließend die Erzeugung der .prc- Datei.
Palm, Inc., stellt mit POSE einen Emulator für alle PalmPilot-Modelle, den Workpad, den Symbol 1700 und den Visor bereit. POSE muss für Linux allerdings erst kompiliert werden, Voraussetzung dafür ist die Installation des Fast Light Tool Kit (FLTK, ftp://ftp.fltk.org/pub/fltk). Anders als beim KVM-Palm-Emulator ist zusätzlich ein ROM-Abzug des jeweiligen Geräts erforderlich. Dies ist nach Zustimmung zu den Lizenzbestimmungen über das Solution Provider Program von Palm erhältlich.
Alternativ kann man das mit POSE gelieferte Übertragungsprogramm auf dem Palm installieren und mit dem Emulator eine ROM-Kopie erstellen. Das Programm pi-getrom aus dem Paket pilot-link ist ungeeignet für einen ROM-Abzug, da es keine gültige Prüfsumme speichert.

Borlands JBuilder ermöglicht das Zusammenstellen von Java-Klassen für den Palm (Abb. 2).
Mit dem Menüsystem von POSE lassen sich elegant die KVM und weitere Programme in der Simulation installieren. Nach einem mittels Menüoption ausgelösten Reset ist die KVM auf POSE lauffähig. Gegenüber dem Emulator der J2ME erlaubt POSE die exakte Simulation der CPU, des Speichers und des ROMs eines Palm-Modells.
Linux-KVM, JBuilder und POSE bilden eine professionelle Werkzeugsammlung unter Linux, Solaris und Win32. Die Überprüfung der Linux-Version mit dem 4300 Tests umfassenden Technology Compatibility Kit verlief erfolgreich. (ck)
ist Java-Architekt im Java-Center Langen von Sun Microsystems und beschäftigt sich unter anderem mit J2EE, J2ME und XP.
[1] Andreas Heilwagen; Porting the KVM CLDC 1.0 FCS to Linux; http://www.kvmworld.com/Articles/LinuxKVM.shtml
[2] Stefan Haustein, Michael Kroll, Ramon Wartala; Palm-Programmierung; Kaffee unter Palmen; Java-Programme für den PalmPilot entwickeln; iX 11/1999, S. 196
Die erste Linux-Version der KVM-CLDC entstand auf dem Flug des Autors zur JavaOne 2000. Mit Linux-Laptop, Palm III und der KVM bewaffnet, dauerte es wenige Stunden, bis die erste unter Linux entwickelte Applikation auf dem PDA lief. Basis für die Kompilierung der in C implementierten Tools und des Simulators sind erweiterte Makefiles mit automatischer Erkennung von Plattform, CPU und Byteorder. Die Parameter aus den Makefiles ersetzen nun die #defines WIN32 und SOLARIS in den C-Quellen durch WIN32, UNIX, SOLARIS, LINUX, CPU, LITTLE_ENDIAN und BIG_ENDIAN. Die üblichen Anpassungen wie zusätzliche #include-Dateien und Bibliotheken kosteten wenig Zeit. Besonders unangenehm waren dagegen #defines, die Byteorder-spezifischen Code abhängig vom Betriebssystem auswählen. Eine Falle, da im Gegensatz zu Win32 sowohl Solaris als auch Linux auf unterschiedlichen Architekturen laufen. Die Tools für die KVM, das heißt Java CodeCompact (JCC) und der Preverifier sind vollständig portiert. JCC verkleinert Java-Programme, sodass sie auf PDAs weniger Platz benötigen. Noch nicht komplett ist die Unterstützung aktueller XFree86-Versionen im Emulator. Zurzeit liefert das Missiles-Demo der KVM in Suns Emulator noch Artefakte bei animierten Icons.
Als Erweiterung des KVM-Simulators von Sun könnte man nun Netzunterstützung integrieren. Bisher steht sie nur auf dem Palm VII zur Verfügung.
Ziel des kAWT-Projekts ist es, eine für KVM-Applikationen geeignete Untermenge des AWT (Abstract Windowing Toolkit) bereitzustellen [2]. Die aktuelle Version 0.81 der Klassenbibliothek umfasst mittlerweile die Pakete java.awt, java.awt.event, java.awt.image, java.net und java.io. Allerdings sind aus Rücksicht auf die beschränkten Ressourcen der KVM nicht alle Klassen dieser Packages implementiert, und die implementierten Klassen bieten nicht alle Methoden. Beispielsweise fehlen `deprecated' Methoden und Klassen grundsätzlich, sie werden in Zukunft nicht mehr im JDK enthalten sein. Deshalb lässt sich nicht jede AWT-Applikation ohne kleinere Anpassungen auf dem Palm ausführen. Umgekehrt sind jedoch die kAWT-Klassen eine echte Untermenge des großen AWT, sodass trotz eventueller Änderungen die Anwendungen weiter auf dem Desktop funktionieren. Die wesentlichen Klassen wie Buttons, Checkboxen, Choices, Labels und Textfelder sowie die dazugehörigen Listener mit den entsprechenden Events sind mittlerweile alle im kAWT enthalten. Bis auf das GridBagLayout werden auch alle Standardlayouts unterstützt. Zur Fertigstellung der Version 1.0, die mit Erscheinen dieses Heftes verfügbar sein sollte, fehlt zurzeit noch eine Editiermöglichkeit der TextArea, die bisher nur zur Anzeige nutzbar ist.
Neben der Vervollständigung der Klassenbibliothek hat sich auch auf dem Gebiet der unterstützten Plattformen einiges getan. War kAWT bisher nur für die KVM auf dem PalmPilot verfügbar, bietet es mittlerweile die Schweizer Esmertec AG für ihre Jbed VM an, die neben dem Palm diverse embedded Systeme unterstützt. Außerdem kann kAWT nun auch auf das MIDP-Profil für Mobiltelefone aufsetzen. Eine Unterstützung für den RIM-Pager und Erweiterungen für Geräte ohne Pointer-Devices befinden sich in Vorbereitung. Offizielle Anerkennung hat das kAWT-Projekt mittlerweile gefunden, indem Stefan Haustein, einer der beiden kAWT-Autoren, als `invited Expert' in die von Palm vorgeschlagene und seit Anfang August angenommene Expertengruppe für die Ausarbeitung eines Java-PDA-Profiles (JSR-75) im Java Community Process aufgenommen wurde.
Neben dem eigentlichen AWT enthält kAWT einige Klassen aus den Paketen java.net und java.io. Die Klasse java. net.Socket ist ein Wrapper für das in der Microedition eingeführte Generic Connection Framework, um die Socket-Kommunikation konform zur Java2 SE zu kapseln. Eine analoge Implementierung des javax.comm Pakets geplant. Da weder die Linux- noch die Windows-KVM von Sun bisher Netzwerkschnittstellen bieten, ist java.net nur mit der KVM für PalmOS nutzbar. Aus demselben Grund kann man Applikationen, die TCP/IP nutzen, nur im POSE, nicht jedoch in Suns Emulator testen.
java.io bietet eine komplette Datei-Emulation auf Basis palmspezifischer Datenbanken. Dieses Paket stellt die Klassen File, RandomAccessFile, FileInputStream, FileOutputStream und FileNotFoundException zur Verfügung. Somit ist es möglich, applikationsspezifische Daten nicht mehr nur in einer Datenbank anzulegen, sondern wie auf dem Desktop in Dateien zu speichern und wieder zu laden. Das Dateiformat ist dokumentiert und wäre somit auch von nativen Palm-Applikationen nutzbar. Auf der kAWT-Homepage finden sich zwei nützliche Beispielapplikationen zur Datei-Emulation: KFtp stellt eine Verbindung mit einem FTP-Server her und ermöglicht es, Dateien zwischen dem virtuellen Dateisystem und dem FTP-Server auszutauschen. Mit dem Norton-ähnlichen Dateimanager KCmd kann das virtuelle Dateisystem verwaltet werden.
Stefan Haustein/Michael Kroll
| Offizielle Sun J2ME-Seite | http://java.sun.com/j2me |
| KVM-Mailingliste | kvm-interest@java.sun.com |
| KVM-Patch für Linux | http://www.kvmworld.com/Downloads/KVM/VMachines.shtml |
| JBuilder | http://www.inprise.com/jbuilder/foundation |
| JBuilder Handheld Express | http://www.borland.com/jbuilder/hhe |
| pilot-link | ftp://ryeham.ee.ryerson.ca/pub |
| POSE | http://www.palmos.com/dev/tech/tools/emulator |
| FLTK | ftp://ftp.fltk.org/pub/fltk |
| PBM2Palm | http://www.kvmworld.com/Downloads/Graphics/PBM2Palm.shtml |
| kAWT | http://www.kawt.de |
import com.sun.kjava.*;
public class KVMLogo {
final static public int width = 136;
final static public int height = 159;
final static public int bitmaps = 5;
final static public void show (Graphics aContext,
int x, int y) {
aContext.drawBitmap (x + 0, y, bitmap0);
aContext.drawBitmap (x + 32, y, bitmap1);
aContext.drawBitmap (x + 64, y, bitmap2);
aContext.drawBitmap (x + 96, y, bitmap3);
aContext.drawBitmap (x + 128, y, bitmap4);
}
final static public Bitmap bitmap0 = new Bitmap
((short)4, new byte[] {
(byte)0, (byte)0, (byte)0, (byte)0,
[...]
}
import com.sun.kjava.*;
public class KVM4Linux extends Spotlet
{
static private Graphics context =
Graphics.getGraphics ();
static public void main (String[] args)
{
context.clearScreen ();
KVMLogo.show (context, (160 -- KVMLogo.width) / 2,
(160 -- KVMLogo.height) / 2);
}
}