2025-02-15

 簡介使用Java編寫Palm OS程序的解決方案


  現在,使用Java語言為 Palm OS編寫程序的領域還沒有完全統一,並且也有許多程度上的差異,目前,市面上有好幾種不同的可用的應用程序接口,每種應用程序接口都給出瞭一個到當前的Palm OS應用程序不同程度的訪問權限。也許這其中大傢最熟悉的是Sun微系統出品的產品;但是能夠為Palm OS寫程序的絕不隻有這一種產品。本文這一部分並不是介紹使用Java編寫Palm程序的教程–因為每種我們將要討論的解決方案都有自己的要求和值得註意的地方–而是一篇向開發者概括介紹開發工具的的文章,我們將縱觀這一領域,找出在使用 Java語言開發 Palm OS應用程序時,你應該使用什麼工具以及你又能夠得到什麼。


  一、Sun的解決方案: KVM、 Configuration和 Profile


  KVM是 Kilobyte Virtual Machine (千字節虛擬機),那麼命名是因為它的內存大小是以千字節來量度,而不是像 Java虛擬機那樣需要兆字節。 因為有這麼苛刻的內存要求, KVM的功能隻是完整 JVM的的子集。 你可以從 Javasoft站點上找到全部的信息,但是值得註意的是它遺漏瞭映射(reflection)、 JNI和自定義類裝載器以及一個可變的安全機制。


  Sun已經制訂一個計劃,提供瞭 configuration和 profile來滿足設備程序設計的需要。configuration是一個應用程序接口,是設計來提供一個基礎,用於一類廣泛的一般的設備,所有的這些設備都有相似的特性,比如說有限的內存,偶然性強的網絡連接性,低電力消耗,可運行在電池上,所以,J2Me被設計得既一般又抽象。 現在 Java 2 Micro Edition(J2ME)可用的configuration有 CLDC(Connected,Limited Device Configuration)和 CDC(Connected Device Configuration)兩種,後者用於比 Palm功能更強大的設備,這就超出瞭我們討論的范圍;而前者,代表有限連接設備配置,是像PDA,雙通道呼叫器以及移動電話。 CLDC包括一個J2SE中的類的子集,但是有一些重要的差別,例如,因為小型設備中的虛擬機使用的無用單元收集機制,CLDC的 java.lang.Object不包含 finalize方法,你應當記住,這個應用程序接口中的某個特定的類可能出現但是它的某個方法卻沒有出現。請參考應用程序接口文檔,這樣的話你就會知道什麼時候該用什麼configuration瞭。


  對於許多剛開始使用 CLDC開發程序的朋友,感到奇怪的是 CLDC不支持浮點數。 這是 KVM默認的實現, KVM是使用 C編寫的,它可以被移植到許多平臺上,它不支持浮點運算,這是因為我們所面對的硬件一般是小型設備,有的還是使用8位的處理器,這些處理器有可能不支持浮點運算。


  profile是特殊的具體的,它的目標是一個比configuration更具體的設備的類,包括用戶界面和事件處理元素,這在 configuration中是沒有出現。 現在, Palm OS或 PDA沒有公開可用的 profile。


  Java Community Process有一個已經開發瞭一段時間的 PDA Profile, 開發者們仍然在等待一個新的 PDA profile版本。與此同時,想要遵循 KVM/Sun解決方案開發者的應當做什麼呢?CLDC版本包括一個可以用作 Palm OS的 最原始的profile的類的最小的集合, 據悉, Sun不贊同使用這些類開發任何商業程序,他們也不計劃對這個應用程序接口做任何更新。 但是如果沒有PDA profile,開發者也可以使用這些類庫。通常我們所知的是Kjava,它包含瞭許多 GUI類:CheckBox、 RadioButton、 List等等。除瞭這些,還有Spotlet類,它被用於處理事件以及Palm OS捕獲手寫筆的輸入和鍵盤按下的事件等等。


  下面是一個使用 kjava來顯示簡單的文本字符串和按鈕的類:


  import com.sun.kjava.*;


  public class HelloKjava extends Spotlet
  {
   private static Button OKButton;
   public static Graphics g = Graphics.getGraphics();
   // 取得Graphics對象


   public static void main(String args[])
   {
    HelloKjava hk = new HelloKjava();
   }


   public HelloKjava() // 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();
   }
  }


  還有一個類 com.sun.kjava.Database,它在一種到達 Palm數據庫應用程序接口的方法。 這就是說,它是非常原始的並且不提供訪問存在Palm數據庫中的任何內容完全的權限。它隻允許設置和獲得字節數組; 它不允許鍵入訪問,除瞭通過記錄標識號 (是一個整數 )。 因為數據庫隻能理解字節數組,給你的數據意味著你需要把這些字節數組解析成有含義的字段。


  二、Kawt的解決方案


  Kawt也是 KVM的一個 Abstract Window Toolkit(抽象窗口工具包),Kaw為Java程序員提供瞭一個更加常見的應用程序接口集合,例如,它使用通用佈局管理器 (除瞭 GridBag)來在屏幕上放置組件,此外它還允許你設置那些組件的監聽者,換言之,Kawt中沒有包括 Spotlet機制。按鈕、面板、標簽以及文本框和其他的 AWT類都可用,而且,還可以有自定義類:FtpShel,TabbedPane和 GifLoader,還有一個類java.io.File,它是一個使用標準的 Palm數據庫文件儲存資料的目錄或文件結構的抽象類。


  使用 Kawt,我們編寫出來的程序如下所示:


  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);
  ??this.add(“South”, OKBtn);
  ??this.add(“Center”, lbl);
  ??pack();
  ??this.show();
  ?}


  ?public void actionPerformed(ActionEvent ae)
  ?{
  ??System.exit(1);
  ?}
  }


  雖然 Kawt提供瞭一個比 kjava更好的類的集合,但是它實際上是基於 kjava的,因此,它缺少數據庫類。對於開發 Palm程序來說,這是一個相當嚴重的問題。 通常來說,任何商用應用程序都需要把數據儲存在設備上,隨後還要與臺式機同步化, kjava.Database的同步化有點問題,因為它不包含 HotSync軟件期待的分類,它也不允許訪問每個包含最初記錄的 “本地 ” palm數據庫文件的屬性位,即使使用瞭 PDA Profile版本,這些也不可能解決,因為 profile的目標是一般的 PDA而不是特別的 Palm OS。 然而, Kawt團隊畢竟也做瞭一件出色的工作,它使剛開始寫Palm程序的程序員很容易使用Java編程。


  三、IBM解決方案


  IBM有自己的虛擬機,叫J9—它在許多方面都優於 KVM,Visual Age Micro Edition支持J9,我們大傢都知道, Visual Age Micro Edition是一個來自 Object Technology International的 IDE,而 Object Technology International又是 IBM擁有的子公司。 而 VAME 是一個完整的開發工具,它可以給對 Palm OS應用程序接口完全的訪問權限, 然而,這需要付出一些代價。 雖然 VAME是一種 Java工具,它所提供的東西都是使用Palm應用程序接口的本地 C方法的包裝。 也就是說, VAME中調用的方法和你在 C中看到的方法完全相同。雖然理解你的應用程序所要運行的操作系統並不是一件壞事,但這需要你非常瞭解開發 Palm的 C應用程序接口的方法特征,如果你隻是一名Java開發者這就成瞭問題瞭。這個是一個缺點,開發VAME的工程師似乎發覺到瞭這一點,並嘗試著去改進。


  下面是一個使用 VAME編寫的例程:


  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();
   }
   }
  }


  正如你所看到的,這個程序與前幾個例子都不太一樣。 如果你能夠越過這個障礙,你的應用程序的性能將遠遠優於一個基於 KVM的應用程序。 VAME其他與眾不同的優點就是它可以訪問所有的本地應用程序接口調用,使

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *