利用Java 編寫手機應用程式--Motorola iDEN篇(2) (轉)

來源:互聯網
上載者:User
程式 █對MIDlet進行調試
    編寫PalmOS上的Spotlet時,我們可以利用System.out.println()函式幫我們印出一些訊息以協助調試,那么在手機上的MIDlet呢? 原則上,我們還是可以利用System.out.println()函式做一些輸出。當模擬器執行時,就會在命令列上輸出一些訊息。
    另外,在PalmOS上,有KVMutil.prc可以協助我們紀錄程式所輸出的訊息。那手機上呢? 因為沒有實際的機器可以測試,因此這個問題到現在還不得而知,相信Motorola到時候會有完善的解決方案吧!
在Motorola J2ME SDK內附的說明檔案之中,概略地提到了調試的問題,裡頭提到,往後如果我們要進行機上調試(on-device debugging)的話,必須要滿足幾個條件:
  1. 機器本身要具備調試相關功能,並與KDWP(Kvm Debug Wire Protocol)相容。因為調試時,調試工具需要利用KDWP和機器上交談以取得調試資訊。
  2. 製造廠商本身要提供下載MIDlet到手機上以進行調試的方法。
  3. 提供對MIDlet調試的工具,必須支援手機在利用KDWP調試時所使用的傳輸介面(例如串列口或UDP)。

    嗯,看起來能夠進行調試,MIDlet程式的編寫應該是很方便的事情了。

█Motorola J2ME SDK對中文的支援
    相信看過RUN!PC 11月號的文章「利用Java 編寫PalmOS應用程式基底礎篇」的讀者,在編寫PalmOS上的Spotlet時一定會遇到中文無法正常顯示的問題。中文的問題分成兩個部分,一個是在使用者介面上的中文問題,一個是在命令列輸出(利用System.out.println()函式所做的輸出)上的中文問題,請大家做個小實驗,將前面我們所編寫的程式改如下:
HelloMIDlet.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet
{
  private Display firstDisplay ;
  private Form firstForm ;
  HelloMIDlet()
  {
    firstDisplay = Display.getDisplay(this) ;
    firstForm = new Form("哈羅!MIDlet") ;
    StringItem firstStrItem = new StringItem("哈羅","米德列特") ;
    firstForm.append(firstStrItem) ;
    System.out.println("MIDlet啟動") ;
  }
  protected void startApp() throws MIDletStateChangeException
  {
    firstDisplay.setCurrent(firstForm) ;
  }

  protected void pauseApp()
  {
  }

  protected void destroyApp(boolean unconditional)
                throws MIDletStateChangeException
  {
  }
}
    將本MIDlet編譯並經過預身審核之後,我們開啟模擬器來執行此MIDlet,底下為執行結果:
使用者介面輸出: 命令列輸出 http://www.csdn.net/expert/wangsen/artic013.jpghttp://www.csdn.net/expert/wangsen/artic014.jpg     我們從結果發現,預設的編譯指令會讓使用者介面正常輸出中文,而命令列無法輸出正確的中文。
我們從結果發現,預設的編譯指令會讓使用者介面正常輸出中文,而命令列無法輸出正確的中文。

接著請將compileAll.bat之中原本的指令
javac -O -bootclasspath ..\..\lib %COMPILECLASS%
修改為
javac –encoding ISO8859_1 -O -bootclasspath ..\..\lib %COMPILECLASS%
之後,重新編譯此MIDlet執行結果: 使用者介面輸出: 命令列輸出 http://www.csdn.net/expert/wangsen/artic015.jpghttp://www.csdn.net/expert/wangsen/artic016.jpg     我們從結果發現,預設的編譯指令會讓使用者介面無法正常輸出中文,而命令列卻可以輸出正確的中文。
    這個結果與PalmOS上所做的中文測試結果有所不同。
    當您編寫Spotlet時,如果您使用javac 。。。指令時,您會發現模擬器上的使用者介面輸出是亂碼,可是命令列上的輸出卻可以正常輸出中文。但是如果您使用的是javac -encoding ISO8859_1 。。。指令,則CLDC內附模擬器上的使用者介面輸出或是命令列上的輸出全部都變成亂碼,無法正常輸出中文(這個部分是因為CLDC內附模擬器實做的問題,造成與實際機器的結果有差異)。
    總之,如果之前您所編寫的Spotlet無法在裝有中文系統的實際機器或POSE上正常輸出中文,請您也如法炮製,在編譯指令中加入-encoding ISO8859_1,就可以在實際機器或POSE上看到正常的中文字了。

    會產生此問題的主因,主要是因為編譯好的Java類檔案(byte code)之中,所有的文字編碼都採用UTF8。舉例來說,當您在程式碼裡用到"啟動"這兩個中文字時,
    "起"這個字的Big5編碼為B1D2。
    "動"這個字的Big5編碼為B0CA。
我們會使用javac xxxx.java來編譯原始碼以產生類檔案。其實這行指令,在繁體中文的Windows環境底下,相當於javac -encoding "Big5" xxxx.java。也就是說,當編譯器讀取到Big5編碼範圍的中文字時,會自動將此Big5碼經過「Big5è Unicode 對照表」將Big5轉為Unicode,也就是說,經過查表之後,
    “起”這個字的Unicode編碼為555F。
    “動”這個字的Unicode編碼為5272。
然後再利用UTF8編碼將此Unicode轉為UTF8,儲存在類檔案之中,因此,如果您用UltraEdit之類的文字編輯器查看類檔案時,您會看到,
    "起"這個字的UTF8編碼為E5959F。
    "動"這個字的UTF8編碼為E58B95。

    接著,當我們在程式執行時如果要將中文輸出,則JVM會負責讀進UTF8碼,然後將其轉回Unicode,最後依據您所使用的系統內容預設的編碼轉回Big5,再輸出至螢幕上。
    可是經過測試結果,KVM似乎只有做到把UTF8讀進來,轉換回Unicode之後就直接輸出了。少了轉回Big5的步驟,因此,作業系統把Unicode當作Big5來處理,自然就找不到該碼所對應的中文字了,也因此輸出的是一堆 ????? 的符號。這也是我們在PalmOS上即使裝了中文系統,也無法正常顯示中文的緣故。
    OK,既然知道KVM只幫我們做了一半的工作,那事情就好辦了,我們只要讓UTF8轉回之後,仍然保有Big5的編碼方式即可,於是我們使用指令javac -encoding ISO8859_1 xxxx.java,請編譯器不要將程式碼中中文Big5編碼的兩個byte視為一體(因為視為一體就會引發查詢Big5 è Unicode對照表的工作),只要將中文當作是普通的西歐字母字集即可,因此,當我們使用了上述指令,您會發現類檔案之中的中文變成,
    "起"這個字的UTF8編碼為C2B1 C392。
    "動"這個字的UTF8編碼為C2B0 C38A。
大家可以發現編譯器把B1、D2、B0、CA個別當作一個碼來處理。於是,當KVM讀到此編碼時,就會將他們轉回B1D2以及B0CA,然後KVM直接輸出,就可以正常地使用中文了。

    最後總結整個問題,就筆者的推斷,CLDC內附的模擬器再沒有使用 javac –encoding ISO8859_1 xxxx.java指令之前,會在使用者介面使命令列輸出亂碼,這才是正常的結果, 而Motorola J2ME SDK內附模擬器的使用者介面中文之所以沒問題,很可能只是因為模擬器操作的差異。因此根據KVM的輸出結果來看,很可能在實際的手機上,我們都必須加上 -encoding ISO8859_1選項才能正確輸出中文吧!

    在此特別感謝靜宜大學資管系的唐愷隆(kailung.tang@msa.hinet.net)同學。因為筆者於他經過熱烈的討論之後,我們才能對J2ME的中文問題有更深入的認識
█支援Motorola J2ME SDK的開發工具
    在編寫本文的時候,支援MIDlet開發的整合式開發環境(IDE)只有Motorola J2ME SDK附帶檔案之中所提到的CodeWarrior而已。相信其它廠商,如Borland,應該也會很快地利用其產品JBuilder的OpenTools API來支援MIDlet的開發才對,更何況Borland JBuilder目前已經有Spotlet的解決方案了。
    因為筆者無法拿到CodeWarrior作測試,所以無法在此提供大家相關資訊,相信如果有機會的話,會另外以專文向大家介紹如何利用CodeWarrior編寫MIDlet。
    Motorola J2ME SDK附帶檔案在附錄的部分有對利用CodeWarrior開發MIDlet做簡單的介紹,相信對初學者來說,已經相當足夠了。

█Motorola J2ME SDK內含的輔助開發工具
    在Motorola J2ME SDK之中內含三項輔助開發工具,可以便利我們的程式開發工作,它們分別是:
  • J2ME模擬器(J2ME Emulator)
        讓您可以在您的PC上類比Motorola將來會支援J2ME的手機裝置。如此一來就可以在PC上直接測試寫好的程式。  
  • Bytecode驗證器(Bytecode Verifier)
        此驗證器用來驗證類檔案(classfile)之中的bytecode不會對儲存空間做非法的存取。並確認載入虛擬機器的類檔案所做的所有動作皆符合Java虛擬機器規格(Java Virtual Machine Specification)。
  • 配置編輯器(Configuration Editor)
        讓您能夠建立或修改device profile。

    在Motorola J2ME SDK內附的檔案之中對這三個工具有詳細的說明,筆者在此就不再贅述了。

█總結
    呼!好累人,終於到了該做總結的時候了! 大家以為MIDlet就這樣結束了嗎?不! MIDlet還有許多好玩的玩意兒呢! 我們將在本系列之後的文章中為大家更深入探討MIDlet。咱們下次見。

█附錄:範常式序
    Motorola J2ME SDK之中內附許多有趣的範例,它們位於demo/midlets/目錄底下。有興趣繼續精進的讀者可以由這些範例學到更多有關MIDlet的深入技巧,由於這些範例的執行畫面過大,所以在本文之中就將他們省略,請讀者們自行參考說明檔案。
這些範常式序有:
Bounce
com.mot.j2me.midlets.bounce.Bounce
PaddleBall
com.mot.j2me.midlets.paddleball.PaddleBall
Scribble
com.mot.j2me.midlets.scribble.Scribble
FontDemo
com.mot.j2me.midlets.tutorials.FontDemo
GraphicsDemo
com.mot.j2me.midlets.tutorials.GraphicsDemo
RecordStoreDemo
com.mot.j2me.midlets.tutorials.RecordStoreDemo
UDP Tutorial Application
com.mot.j2me.midlets.tutorials.UDPReceive
AlertTest
com.mot.j2me.midlets.tests.AlertTest
ChoiceGroupTest
com.mot.j2me.midlets.tests.ChoiceGroupTest
DateFieldTest
com.mot.j2me.midlets.tests.DateFieldTest
FormTest
com.mot.j2me.midlets.tests.FormTest
GaugeTest
com.mot.j2me.midlets.tests.GaugeTest
KeyEventsTest
com.mot.j2me.midlets.tests.KeyEventsTest
TextBoxTest
com.mot.j2me.midlets.tests.TextBoxTest
TextFieldTest
com.mot.j2me.midlets.tests.TextFieldTest
TickerTest
com.mot.j2me.midlets.tests.TickerTest

█網路資源
◎網站
名稱 URL
Motorola官方網站 http://www.motorola.com/java/
Metrowerks(CodeWarrior) http://www.Metrowerks.com

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。