在 Java 語言開發 Palm OS 應用程式的領域中,技術標準尚未完全統一,市面上存在多種不同的應用程式介面 (API),各自提供不同層級的 Palm OS 系統存取權限。雖然 Sun Microsystems (現為 Oracle) 的解決方案最為人熟知,但絕非唯一選擇。本文將深入探討四大主流開發方案:Sun 的 KVM/CLDC/KJava、Kawt、IBM J9/VAME,以及 Waba/SuperWaba,並透過程式碼範例說明其架構差異與適用場景。
Sun 推出的核心技術是 KVM (Kilobyte Virtual Machine),專為記憶體以 KB 為單位計算的嵌入式裝置設計。KVM 是標準 JVM 的子集,移除了反射、JNI、自定義類載入器及可變安全機制等功能,以滿足嚴苛的記憶體限制。
為了適應不同裝置特性,Sun 制定了 Configuration (配置) 與 Profile (設定檔) 機制:
java.lang.Object 缺少 finalize 方法,且預設不支援浮點運算 (因 8 位元處理器常無浮點單元)。由於 Palm OS 專屬的 PDA Profile 遲遲未發布,開發者常使用 CLDC 內建的最小類別集 (Sun 不建議用於商業開發) 或第三方 KJava 函式庫。KJava 提供豐富的 GUI 元件 (CheckBox、RadioButton、List) 及事件處理核心 Spotlet 類別,可捕捉手寫筆輸入與鍵盤事件。資料庫存取透過 com.sun.kjava.Database 進行,但僅支援位元組陣列的讀寫,需自行解析欄位結構。
import com.sun.kjava.*;
public class HelloKjava extends Spotlet {
private static Button OKButton;
public static Graphics g = Graphics.getGraphics();
public static void main(String args[]) {
new HelloKjava();
}
public HelloKjava() {
OKButton = new Button("OK", 84, 140);
register(NO_EVENT_OPTIONS);
drawScreen();
}
public void penDown(int x, int y) {
if (OKButton.pressed(x,y)) System.exit(1);
}
public void drawScreen() {
g.clearScreen();
g.drawString("Hello KJava", 20, 10);
OKButton.paint();
}
}
Kawt 是建立在 KVM 之上的 Abstract Window Toolkit 實現,提供 Java 開發者熟悉的 java.awt 介面:佈局管理器 (除 GridBag)、事件監聽器模型、Button、Panel、Label、TextField 等標準元件,並擴充 FtpShell、TabbedPane、GifLoader 及模擬檔案系統的 java.io.File。Kawt 移除了 Spotlet 機制,大幅降低學習曲線。
import java.awt.*;
import java.awt.event.*;
public class HelloKawt extends Frame implements ActionListener {
Button OKBtn = new Button("OK");
Label lbl = new Label("Hello Palm");
public static void main(String args[]) { new HelloKawt(); }
public HelloKawt() {
OKBtn.addActionListener(this);
add("South", OKBtn);
add("Center", lbl);
pack(); show();
}
public void actionPerformed(ActionEvent ae) { System.exit(1); }
}
缺陷:Kawt 底層仍依賴 KJava,繼承其資料庫存取弱點,缺乏 HotSync 同步所需的分類與屬性位支援,難以滿足商業應用的資料同步需求。
IBM 自研的 J9 VM 效能優於 KVM。VAME (VisualAge Micro Edition) 是基於 Eclipse 的完整 IDE,提供 Palm OS 原生 C API 的完整 Java 包裝。開發者直接呼叫對應的 C 函式 (如 FrmNewForm、EvtGetEvent),擁有系統級的存取權限與極高效能,並能建立符合 HotSync 標準的資料庫。
import com.ibm.oti.palmos.*;
import com.ibm.oti.palmos.util.OSX;
public class HelloJ9 implements OSConsts {
public static void main(String[] args) {
CharPtr title = new CharPtr("IBM Vame Demo");
EventType event = new EventType();
try {
FormType form = OS.FrmNewForm(0, title, 0, 0, 160, 160, 0, 0, 0, 0);
OS.FrmSetActiveForm(form);
OS.FrmDrawForm(form);
OSX.WinDrawChars("Hello J9!", 5, 30);
while(true) {
OS.EvtGetEvent(event, -1);
if (OS.SysHandleEvent(event)==0) {
if (event.getEType() == appStopEvent) {
OS.FrmEraseForm(form);
OS.FrmDeleteForm(form);
return;
}
}
}
} finally {
title.dispose(); event.dispose();
OS.FrmCloseAllForms();
}
}
}
挑戰:程式碼風格接近 C 語言,要求開發者精通 Palm OS C API,對純 Java 開發者門檻極高。
Waba 是獨立虛擬機,GUI 元件豐富度介於 KJava 與 Kawt 之間,採用座標定位而非佈局管理器。優勢在於:
import waba.ui.*;
import waba.fx.*;
public class HelloWaba extends MainWindow {
Button closeButton;
public HelloWaba() {
Title title = new Title("HelloWaba");
title.setRect(0, 0, this.width, 15);
add(title);
closeButton = new Button("Close");
closeButton.setRect(0, this.height - 15, 44, 15);
add(closeButton);
}
public void onEvent(Event event) {
if (event.type == ControlEvent.PRESSED && event.target == closeButton)
exit(0);
}
}
選擇 Java 開發 Palm OS 方案需權衡多重因素:
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Sun KVM/KJava | 官方標準、文件完整、KJava GUI 豐富 | 無浮點、資料庫原始、缺官方 Profile | 簡單工具類應用、學習研究 |
| Kawt | AWT 風格易上手、標準事件模型 | 資料庫同步缺陷、依賴 KJava | 需快速開發 UI、不需複雜資料同步的應用 |
| IBM J9/VAME | 效能最強、完整原生 API 存取、商業級同步支援 | 需懂 C API、工具收費、學習曲線陡峭 | 高效能、深度系統整合、商業級企業應用 |
| Waba/SuperWaba | 速度快、跨平台 (Palm OS/WinCE)、功能實用 | 非標準 API、社群較小 | 跨平台部署、追求效能與開發效率平衡的專案 |
這一領域技術演進迅速,最終決策前建議驗證最新工具版本與社群支援狀況。