轉貼(電腦報):J2ME無線通訊編程入門

來源:互聯網
上載者:User

J2ME無線通訊編程入門  
  尹華成 附錄文章

  隨著支援Java軟體的手機問世,開發應用於手機上的程式已經不再是夢想。本文將向讀者介紹如何利用J2ME開發手機及行動裝置的應用程式。

  一、基礎篇:J2ME體繫結構詳解
  1.什麼是J2ME
  J2ME即JAVA 2 Micro Edition,它是Java 2的組成部分,與J2SE、J2EE並稱。J2ME是一種高度最佳化的Java運行環境,應用於大量的消費類電子裝置,如Cellular Phones(蜂窩電話)、Screen Phones(可視電話)、Digital Set-top Boxes(數字機頂盒)、Car Navigation Systems(汽車導向系統)等,同時也廣泛被移動通訊裝置所採用,如行動電話、雙向傳呼機、智慧卡、個人電腦記事本(Personal Organizer)和掌上型電腦(Palmtop)等。J2ME技術將Java語言的與平台無關的特性移植到小型電子裝置上,允許移動無線裝置之間共用應用程式。

  2.J2ME體繫結構和配置
  (1)J2ME體繫結構

  J2ME體繫結構基於裝置的系列和類別,一個類別定義了一個特定種類的裝置。行動電話、呼叫器和個人電腦記事本都是單獨的類別。對儲存空間和處理能力有相近需求的若干類別的裝置構成裝置的一個系列。行動電話、呼叫器和個人電腦記事本一起就是佔用資源很小的裝置的一個系列。圖1定義了在J2ME環境中裝置的系列和類別之間的關係。

 

  另外,為了支援資源受限裝置所要求的那種靈活性和可定製部署,人們將J2ME體繫結構設計成模組化和可伸縮。J2ME技術在一個完整的應用程式運行模型中定義了這種模組性和延展性,在該模型中的4個軟體層都構建在裝置的主機作業系統上。J2ME的體繫結構2所示。

 

  JAVA 虛擬機器層(Java Virtual Machine Layer):是Java虛擬機器的一個實現,它是為特定裝置的主機作業系統定製的,而且支援特定的J2ME配置(Configuration)。

  配置層(Configuration Layer):配置層定義了Java虛擬機器功能上和特定類別裝置上可用的Java類庫的最小集。從某種程度上說,一個配置定義了Java平台功能部分和庫的共同性,開發人員可以假設這些功能組件和庫在屬於某一特定類別的所有裝置上都是可用的。

  架構層(Profile Layer):架構層定義了特定系列裝置上可用的API(API)的最小集。架構在一個特定的配置上實現。應用程式是針對特定架構編寫的,因此可以移植到支援該架構的任何裝置上。一個裝置可以支援多個架構。使用者和應用程式供應商看到最多的就是這一層。

  MIDP(Mobile Information Device Profile)層:移動資訊裝置架構。是Java API集合,它處理諸如使用者介面、持久儲存和連網等問題。

  (2)J2ME配置

  由上可知,J2ME組件都圍繞一個中心,這些中心被稱為“配置”(Configuration)。它們用於消費電子和嵌入裝置的特別的類。目前J2ME定義2個“配置”,這2種“配置”由於其處理運算的能力不同而支援不同的裝置對象。

  Connected Limited Device Configuration(CLDC,有限串連裝置配置):該“配置”定義Java應用程式介面以及支援手持功能的技術。如手機、掌上型電腦等。

  Connected Device Configuration(CDC,串連裝置配置):該“配置”支援“插入牆”式裝置的應用程式介面,如機頂盒等。

  上述兩種“配置”,其區別在於它們應用於的裝置的能力:

  CLDC裝置的處理器能力有限(與台式機比較),且儲存空間大小一般只在128KB到512KB之間,而CDC系統則不同,它可能有32位或64位處理器,以及有限的儲存容量,不過它的下限也超過512KB。它們共同所遵循的原則是,每個不同功能的硬體裝置都將被不同的虛擬機器支援。

  3.J2ME的簡表
  雖然,“配置”為一組通用裝置提供了最小的Java平台,但是開發人員感興趣的是為個別裝置設計應用程式,當他們只使用“配置”進行開發,那麼所編寫的應用程式肯定會有所欠缺。“配置”必須滿足所有裝置的最小要求,而使用者介面、輸入機制和資料持久性都具有高度的裝置具體性,每一種裝置都有自己的方法,這些往往不在“配置”所能滿足的最小要求範圍之內。

  現在,5個已知簡表已經有了規範。而每個簡表的責任都是為了完善配置的不足。

  (1)MIDP簡表

  MIDP(Mobile Information Device Profile,移動資訊裝置簡表)是第一個實現的簡表,它補充了CLDC配置,並且提供應用程式語義和控制項、使用者介面、持久儲存空間、網路和用於行動電話的計時器、雙通道呼叫器和其他無線電裝置。

  (2)PDA簡表

  Palm公司是開發PDA簡表規範的領頭人,該簡表完善了CLDC配置,在相當長的時間內,它都將是KJava類程式包的替代品。Java規範建議該簡表至少應當提供2個核心功能片段,即使用者介面顯示工具包,適合於“有限的尺寸和深度顯示”,另一個則是持久資料存放區器機制。顯示工具包應該是抽象視窗工具包的一個子集,而持久機制將為應用程式、資料、配置/環境資訊提供簡單的資料存放區。

  (3)Foundation簡表

  Foundation簡表的任務是擔任一個基礎簡表,便於以後開發出來的提供圖形使用者介面、 網路等功能的簡表附著在它之上。除了用於基礎簡表,Foundation簡表還提供完整網路的支援,不管有沒有使用圖形使用者介面。

  (4)Personal簡表

  在當前規範的需求下, Personal簡表提供下一代Personal Java環境。該簡表允諾,提供互連網串連性和Web逼真度以及一個能夠運行Java Applets的GUI。

  (5)RMI簡表

  我們知道CDC配置為共用的、固定網路連接資訊裝置提供最小的Java環境。該簡表將通過提供Java到Java的RMI來協助提供更好的網路連接性。

  二、入門篇:MIDP簡表應用執行個體
  前面我們介紹了J2ME的基礎知識,同時也提到了MIDP簡表的作用。現在我們來看看如何利用J2ME與MIDP開發應用程式。

  注意:遵照MIDP簡表和CLDC配置規範編寫的Java應用程式,我們稱其為MIDlet。

  1.MIDP/CLDC API概述
  由於MIDP/CLDC API將在一個效能有限的裝置上運行,因此Java的一些功能被移除或者修改。

  (1)MIDP的類庫

  如上所述,SUN在CLDC配置之上定義了MIDP層,用以提供對使用者介面(User Interface,UI)、永久儲存介質(Persistinace Storage)和網路等支援。下面,我們來看看MIDP的類庫。

  MIDP由四個javax.microedition包組成,包括:

  javax.microedition.rms:關於永久儲存介質(rms即Record Management System)。

  javax.microedition.midle:定義了MIDlet的架構,以及MIDlet與環境的互動。

  javax.microedition.io:提供網路支援。

  javax.microedition.lcdui:關於使用者介面(UI分為High Level和Low Level兩種API)。

  (2)構件

  MIDP簡表和CLDC配置組合起來,為建立行動電話和簡單雙向傳呼機上的應用程式提供了完整的開發環境。

  MIDP架構的核心是一個MIDlet應用程式。這個應用程式繼承了MIDlet類,以允許應用程式管理軟體對MIDlet進行控制、從應用程式描述檢索屬性以及對狀態變化進行通知和請求。所有MIDlet都繼承MIDlet類──運行時環境(應用程式管理器)和MIDlet應用程式代碼之間的介面。MIDlet類提供了用於調用、暫停、重新啟動和終止MIDlet應用程式的API。應用程式管理軟體可以在運行時環境內管理多個MIDlet的活動。此外,MIDlet可以自己發出一些狀態變化,並把這些變化通知給應用程式管理軟體。

  MIDP API類的完整集合可以分為兩個類別:

  用於使用者介面的MIDP API:設計這些API是為了能以一系列螢幕顯示為基礎,與使用者進行互動操作,每一螢幕顯示適量的資料給使用者。這些API允許應用程式決定下一屏顯示什麼、執行什麼、計算和使用網路服務的何種請求。

  用於處理資料庫的MIDP API:這些API負責組織和操作裝置資料庫,這個資料庫由在MIDlet的多個調用之間跨越時保持持久的資訊組成。底層的CLDC API用於處理字串、對象和整數。還提供了Java 2 API的一個子集,用於處理I/O和網路通訊。

  (3)使用者介面設計(UI)

  MIDP API儘管維護的是一個受限的架構,但它還是提供了使用者介面元素的完整集合。以下是最重要的UI元素:

  Alert:用於在螢幕上顯示異常情況或錯誤的資訊。

  Choice:用於實現從既定數量的選項中進行選擇。

  ChoiceGroup:提供一組相關選項。

  Form:作為其使用者介面元素的容器。

  List:提供一個選項列表。

  StringItem:只顯示字串。

  TextBox:允許使用者輸入和編輯文本的螢幕顯示。

  TextField:允許使用者輸入和編輯文本。多個TextField可放到一個Form中。

  DateField:是一個可編輯的組件,用於表示日期和時間資訊。DateField可以放到Form中。

  Ticker:用於文本的可滾動顯示。

  (4)裝置資料庫管理

  MIDP簡表提供了一組用於組織和操作裝置資料庫的類和介面:RecordStore、RecordComparator和RecordFilter。RecordStore由大量的記錄組成,這些記錄在MIDlet的多個調用之間跨越時保持持久。對RecordStore中的記錄進行比較,或者從RecordStore中抽取若干組記錄,都是RecordComparator和RecordFilter介面提供的功能。

  2.配置編程環境
  與其他程式設計語言不同,在開發一個J2ME程式之前首先要配置好J2ME編程環境。

  (1)軟體準備

  在開發一個MIDlet之前,需要下載:

  Java Development Kit(JDK),1.2版本以上。

  Connected, Limited Device Configuration(CLDC)。

  Mobile Information Device Profile(MIDP)。

  (2)軟體安裝

  JDK安裝:JDK已經預設了用於安裝檔案的目錄,當然你也可以選擇安裝在一個你自己選定的路徑。如E:/jdk1.3。

  安裝CLDC配置:將下載到CLDC軟體解壓到硬碟,筆者推薦路徑為E:/j2me。解壓以後,E:/j2me路徑的結構如下所示:

  E:/j2me

   |

  j2me_cldc

  安裝MIDP簡表:同上,解壓MIDP軟體到硬碟目錄E:/j2me,現在該目錄結構如下所示:

  E:/j2me

  |

  j2me_cldc

  midp-fcs

  (3)配置軟體

  PATH環境變數是Windows作業系統用來定位可執行程式的,我們需要更新PATH來指向Java編譯器和CLDC、MIDP程式的路徑。

  更新JDK的PATH:如果是在Windows NT/2000環境中,請在控制台中雙擊“系統”表徵圖,在出現的對話方塊中單擊“進階”選項卡,單擊“環境變數”按鈕,在出現的對話方塊中“系統變數”列表中找到並雙擊PATH,在出現的對話方塊中的“變數值”的末尾添加JDK安裝路徑的/bin目錄。假設你安裝JDK是1.3版本並選擇預設安裝路徑,本例為E:/jdk1.3。如果是在Windows 98環境中,請在C:/Autoexec.bat檔案的最後加上以下兩行即可。

  set path= E:/jdk1.3/bin;%path%

  set classpath=.;

  更新CLDC路徑:你還需要更新你的PATH環境變數來指向存放CLDC可執行檔的目錄。按照上面講述的相同步驟添加到PATH中:

  E:/j2me/j2me_cldc/bin

  更新MIDP路徑:更新PATH環境來指出存放MIDP可執行檔的目錄,該檔案是用於測試MIDlet的行動電話模擬器。

  按照上面講述的步驟添加到PATH中,這裡是E:/j2me/midp-fcs/bin。

  下面讓我們來更新CLASSPATH環境變數。CLASSPATH告訴Java編譯器到什麼地方搜尋那些不是JDK平台本身附帶的類庫,在本例中,我們需要更新CLASSPATH來指向MIDP類。你還需要有目前的目錄的引用("."),作為CLASSPATH的一部分,按照上面概述的相同的步驟,更新CLASSPATH: CLASSPATH=e:/j2me/midp-fcs/classes;。

  注意:最後的點“.”表示當前的工作目錄。

  最後,讓我們來添加SCREEN_DEPTH環境變數。MIDP含有一個測試MIDlet用的行動裝置模擬器,這個模擬器可以以有色模式運行,也可以運行於黑白兩色構成的灰階梯度模式。為了指定顏色數,你可以添加環境變數 SCREEN_DEPTH。如CREEN_DEPTH=8。添加該環境變數與處理PATH和CLASSPATH變數的方法類似。

  下表中給出了SCREEN_DEPTH值和顏色的對應關係。

  


顏色數

顏色數

 

1
2
2
4

 

4
16
8
256

 

 

  3.編寫代碼
  現在我們編寫“Hello World!”應用程式來瞭解J2ME程式的結構及編寫方法,在這裡,程式名是HelloJ2ME,程式碼如下:

  import javax.microedition.midlet.*;

  import javax.microedition.lcdui.*;

  public class HelloJ2ME extends MIDlet implements CommandListener

  {

    private Display display;

  private TextField tfHello;

  private Command cmExit;

  private Form fmMain;

   public HelloJ2ME()

   {

  display = Display.getDisplay(this);

     //建立主表單

   fmMain = new Form("HelloJ2ME");

     //建立“Exit”按鈕

   cmExit = new Command("Exit", Command.SCREEN,1);

     //建立一個可以容納15個字元的文本單行

   tfHello = new TextField("Text","Hello World!",15,TextField.ANY);

     //把控制項增加到主表單

     fmMain.addCommand(cmExit);

   fmMain.append(tfHello);

   fmMain.setCommandListener(this); 

   }

  正如我們所看到的那樣,HelloJ2ME程式擴充了MIDP基本應用程式MIDlet類,並匯入了兩個包名稱空間:javax.microedition.midlet和javax.microedition.lcdui。前者包括該應用程式的MIDlet基類,而後者則提供了一組類似Swing的GUI元素供應用程式使用。

  MIDlet類提供了3種抽象方法供裝置應用程式管理器與其啟動並執行應用程式通訊。只要應用程式被啟用、構造器執行完畢之後就會立即調用startApp方法,而不是在應用程式最初啟動時就這樣做。應用程式在一次運行過程中會在活動和不活動狀態之間多次轉變,這樣你就不必編寫單獨啟動並執行初始化代碼了,因為這類代碼很可能會執行好多次。為此應該採用構造器來完成同一功能。

  管理器指示應用程式關閉之後就會調用destroyApp方法。和startApp方法不一樣的是該方法只在應用程式生存期內調用一次,所以在這個方法內編寫清除代碼是很安全的。實際上,由於MIDP並沒有為對象包括finalize函數,所以你不得不在以上方法處執行清除功能。同時,由於典型的行動裝置比通常情況下的標準平台欠缺穩定,經常被使用者進行開關機或者複位操作。所以你也不能真正指望destroyApp派上大用場。

  最後的抽象方法就是pauseApp了。該方法主要作用是發出這樣的通知。因為使用者轉換到其他應用或者採用了裝置的某項功能促使應用程式不能繼續運行而暫時停止應用程式的運行。由於大多數行動裝置都缺乏執行多任務的處理能力,以上的這類情況是完全可能發生的。所以在這個方法中應該編碼釋放所有資源。一旦應用程式重新開發運行則應用程式管理器會再度調用startApp方法。

  三、進階篇:無線訊息傳送系統分析
  針對手機軟體的特殊性,我們有必要瞭解“無線訊息傳送”的基本原理。下面我們將重點為大家介紹幾種常用的無線Message Service方式。

  1.GSM簡訊服務與小區廣播服務
  無線訊息傳遞的思想為J2ME開拓了全新的前景。由無線訊息傳遞支援的J2ME應用程式能獨立於平台來訪問無線通訊資源,如全球移動通訊系統(Global System for Mobile Communication,GSM)網路(一種允許跨國通訊的行動電話系統)的簡訊服務(SMS)和小區廣播服務(CBS)。

  (1)GSM 簡訊服務(SMS)

  SMS是GSM網路中行動電話、傳真機與IP地址之間簡短簡訊的傳遞。所傳遞的訊息不得超過160個字母、數字字元,且不包含映像或圖形。這一服務的主要特性是迅速、價廉並能保證訊息會到達目標使用者。

  訊息一經發送,就會由簡訊服務中心(SMSC)接收,該中心必須隨即將訊息發送到適當的行動裝置。為了做到這一點,SMSC會向歸屬位置寄存器(Home Location Register,HLR)發送SMS請求以找到漫遊使用者。一旦HLR接收到該請求,就會以使用者的狀態(如1.不活動或活動,2.漫遊位置)來響應SMSC。如果響應為不活動,則SMSC將保留訊息一段時間。當使用者使用其裝置時,HLR會向SMSC發送一個SMS通知,而SMSC則嘗試進行發送。

  SMSC以簡訊發送點對點(Short Message Delivery Point-to-Point)格式將訊息發送到GSM訊息發送系統。該系統會呼叫裝置,若裝置做出響應,則發送訊息。同時,SMSC會收到驗證,即訊息已經由終端使用者接收,然後將該訊息歸類為已發送,並且將不再嘗試發送它。

  (2)GSM小區廣播服務

  GSM小區廣播服務允許將訊息發送到當前位於某個特定小區的每個移動台(Mobile Station,MS),如行動電話、傳真機和IP地址。在一段時間內重複小區廣播訊息,從而使在第一次發送之後才進入小區的MS也能接收到訊息。可以用位元據或ASCⅡ文本的形式最多發送15頁的資料,每頁最多有93個字元,測試裝置僅提供對ASCⅡ訊息的支援。小區廣播訊息按主題分類,給每條訊息都分配了通道號、訊息代碼、更新號和語言。

  通道號:標識訊息主題的頭部號(如'氣象報告'或'交通訊息')。

  訊息代碼:標識特定的訊息,這樣當MS收到的訊息代碼與以前收到的相同時,會意識到這是一條重複訊息,就會不顯示給使用者。

  更新號:用來標識訊息的特定版本。

  語言:指明訊息所用的語言。更改此參數不會使訊息的原文得到翻譯。

  2.無線訊息傳送系統解析
  簡單地講,我們可以把一個無線訊息傳送系統看作一個三層體繫結構,由介面層(Interface Layer)、實現層(Implementation Layer)和傳輸層(Transport Layer)組成。

  介面層構成了一組通用的訊息傳遞介面,它們獨立於所有訊息傳遞通訊協定。這些介面提供訊息的基本定義,定義發送和接收訊息的準系統,以及提供向MIDlet代理程式更新進入訊息的機制。

  實現層包含這樣的類,它們實現每個介面層以訪問無線訊息傳遞,如GSM行動裝置上的SMS或CBS功能。例如,就SMS而言,這一層提供了用於SMS訊息的訊息串連實現,以及具有文本或二進位屬性的SMS訊息的實現。實現層還執行用於底層協議的訊息分段和共置。然後,MIDlet可以在MessageConnection中指定應該將某條訊息拆分成幾段。

  傳輸層包含這樣的類,它們實際實現了將訊息傳送到行動裝置的協議。

  3.通用訊息傳遞API──javax.wireless.messaging

  此API由javax.wireless.messaging包定義,該包定義了所有用於發送和接收無線訊息的介面。

  Message:提供訊息的基本定義,充當一個容器來容納訊息的地址、承載及關於發送和阻塞的標誌。它是TextMessage和BinaryMessage的超介面(Super Interface),後兩個分別是帶文本承載屬性和帶二進位承載屬性的訊息對象。Message的結構3所示。

 

  MessageConnection:提供接收和發送訊息的準系統。它包含一個發送和接收訊息的方法、一個建立新Message對象的工廠(Factory)方法和一個計算髮送某指定Message對象所需底層協議段數量的方法。

  通過調用 Connector.open()可將這個類執行個體化。

  在客戶機方式串連中,只能發送訊息。通過將標識目的地址的字串傳遞到 Connector.open()方法來建立客戶機方式串連。該方法返回MessageConnection對象。

  clientConn=(MessageConnection)Connector.open("sms://+18643630999:5000");

  在伺服器方式串連中,可以發送或接收訊息。通過將標識本地主機上端點(取決於協議的標識符,例如,連接埠號碼)的字串傳遞給Connector.open()方法來建立伺服器方式串連。

  serverConn =(MessageConnection)Connector.open("sms://:5000");

  MessageListener:它提供了向MIDlet代理程式更新有進入訊息的基本機制。當可以讀取新到訊息時,它允許MIDlet接收一個回調。

  (1)簡訊服務API

  J2ME的com.sun.midp.io.j2me.sms包提供了用於簡訊服務訊息傳遞系統的API,並允許MIDlet訪問GSM行動裝置上的SMS功能。

  該包主要包括MessageObject和Protocol兩個主要組件,用於支援SMS訊息的發送和接收。

  MessageObject:用於SMS訊息實現。

  在實現層,javax.wireless.messaging.Message介面是作為緩衝區實現的。MessageObject處理訊息緩衝區的建立和緩衝區之外的輸入/輸出操作。此外,它有兩個子類,即TextObject和BinaryObject。這些類實現具有文本或二進位承載的SMS訊息。

  Protocol:它實現發送SMS訊息所需的與低層傳輸(Transport)機制的訊息串連。在這一過程中,它檢查所有的回合組態參數,並處理與無效URL文法、安全性違規、I/O違規和無效參數有關的異常。Protocol還處理使用資料包或序列埠串連的訊息發送與接收。

  (2)小區廣播訊息傳遞API

  J2ME的com.sun.midp.io.j2me.cbs包提供用於小區廣播訊息傳遞系統的API,並允許MIDLlet訪問GSM行動裝置上的CBS功能。

  該包的主要組件com.sun.midp.io.j2me.cbs.Protocol支援CBS訊息的接收。CBS與SMS的不同之處在於,URL連接字串不支援指定的主機,而且它僅用於入站協議。有CBS能力的MIDlet可接收訊息,但不能發送它們。

  四、執行個體分析篇:一個J2ME訊息傳遞應用程式
  下面我們通過分析一個樣本程式WMAServer來介紹J2ME是如何?訊息傳送的?樣本程式的主要功能是:等候進入的SMS訊息,然後將它們顯示在電話螢幕上。javax.microedition.lcdui包提供了一組功能,用於實現應用程式的使用者介面。

  WMAServer MIDlet通過將標識本地主機上端點(取決於協議的標識符,例如連接埠號碼)的字串傳遞給Connector.open()方法來建立伺服器方式串連。為了能收到進入訊息的通知,MIDlet在MessageConnection執行個體serverConn處註冊一個MessageListener對象。

  serverConn.setMessageListener(MessageListener ml);

  它還在MessageListener介面中實現notifyIncomingMessage()。當進入訊息到達 MessageConnection時,就調用notifyIncomingMessage()方法。應用程式必須使用 MessageConnection的receive()方法來檢索該訊息。

  WMAServer應用程式從進入訊息讀取文本或二進位的承載資料,然後將其儲存在字串對象中供以後顯示。

  public void notifyIncomingMessage(MessageConnection conn) {

  Message msg = null;

  // Try reading (maybe block for) a message

  try {

    msg = conn.receive();

  }

  catch (Exception e) {

    // Handle reading errors

    System.out.println("processMessage.receive " + e);

  }

  // Process the received message

  if (msg instanceof TextMessage) {

    TextMessage tmsg = (TextMessage)msg;

    msgReceived = tmsg.getPayloadText();

  }

  else

  {

    // process received message

    if (msg instanceof BinaryMessage) {

     BinaryMessage bmsg = (BinaryMessage)msg;

     byte[] data = bmsg.getPayloadData();

     // Handle the binary message...

    msgReceived = data.toString();

   }

  }

  當必須釋放串連資源和相關聯的接聽程式對象時,應用程式提供destroyApp()方法。

  public void destroyApp(boolean unconditional){

   try {

    if(serverConn != null){

    serverConn.setMessageListener(null);

    serverConn.close();

    }

  }

  Catch(IOException e){

    //Handle the exception...

    e.printStacktrace();

  }

  五、實踐篇:編寫“捕捉鍵盤輸入的ASCⅡ碼”程式
  通過前面的介紹,我們對J2ME已經有了一個直觀的認識。下面我們將通過編寫一個具體的執行個體程式,來進一步說明J2ME編寫手機應用程式的方法。本常式序應用於摩托羅拉388手機,常式完成後,將捕捉鍵盤輸入的ASCⅡ碼。

  1.關於開發工具
  MotoJ2SDK是摩托羅拉388手機定製的命令列開發套件,其中整合的開發環境包括有CodeWarrior、JCreator等。

  無線手持功能(MDIP)簡易開發套件(MDIP的安裝方法前文中已有介紹)。

  Java 2 SDK 1.3是必備的,它提供開發、測試和運行Java程式的平台(安裝方法見前文)。

  開發環境筆者推薦使用JCreator。

  2.JCreater+MotoJ2SDK的配置與使用
  這是必須而且是極其重要一步,如果配置不正確,你的程式將無法運行。我們假設所有開發工具的安裝路徑如下:

  JCreator:D:/Program Files/Xinox Software/JCreator LE

  MotoJ2SDK:D:/Motoj2sdk

  JDK:D:/jdk1.3.1

  開始配置之前,我們首先要啟用類比環境。運行D:/MotoJ2SDK/generic/scripts/runConstructor.bat,並正確選擇手機型號、選擇語言、選擇Normal,最後點擊“建立”即可。完成以上工作後,我們就可以進行配置了。

  第一步,選擇Configure→Options→JDK Profiles。

  注意:一定建立profile and select“D:/jdk1.3.1”。

  將該名字更改為“J2ME 388”;Add classes path更改為“D:/Motoj2sdk/lib”;Add documentation path更改為“D:/Motoj2sdk/docs”。

  第二步,選擇 Configure→Options→JDK Tools。

  選擇Complier,選中And Edit It項,將parameters更改為“-O -bootclasspath D:/motoj2sdk/lib $[JavaFiles]”。

  第三步,選擇Configure→Options→Tools。

  單擊“New”按鈕,選擇DOS command建立一個名字為“Preverifier”的DOS command,並將arguments更改為“d:/Motoj2sdk/bin/preverifier.exe -classpath "d:/Motoj2sdk/lib" -d . .”;將initial directory更改為“$[PrjDir]”。

  第四步,按上面的方法在建立一個名字為“Run Emulator”的DOS command。

  將arguments更改為“java–D java.library.path=d:/MotoJ2SDK/lib -classpath "d:/MotoJ2SDK/bin/Emulator.jar";"d:/MotoJ2SDK/ConfigTool.jar" com.mot.tools.j2me.emulator.Emulator -classpath$[PrjDir];"d:/MotoJ2SDK/lib" –deviceFiled:/MotoJ2SDK/bin/resources/device.props javax.microedition.midlet.AppManager $[CurClass] -JSA 1 1"

  將initial directory 更改為 “d:/Motoj2sdk/bin”。

  第五步,同樣按照上面的方法建立一個名字為“Create Jar”的DOS command。 

  將arguments更改為“"$[JavaHome]/bin/jar.exe" cvfM $[PrjName].jar

   META-INF/MANIFEST.MF *.CLASS *.png”。

  將 initial directory 更改為“$[PrjDir]。”

  3.編寫執行個體代碼
  選擇“Empty Project”建立一個工程,並取名為myJ2 。JCreater會自動在你的工作目錄中產生子目錄“myJ2”。選擇“java File”建立一個java檔案。編寫以下代碼:

  import javax.microedition.lcdui.*;

  import javax.microedition.midlet.*;

  public class test extends MIDlet implements CommandListener {

  private KeyEventsDemoCanvas myCanvas;

  private Display myDisplay;

  private Command okCommand = new Command("OK", Command.OK, 1);

  myJ2() {

  myDisplay = Display.getDisplay(this);

  myCanvas = new KeyEventsDemoCanvas();

  myCanvas.addCommand(okCommand);

  myCanvas.setCommandListener(this);

  }

  public void commandAction(Command c, Displayable s) { }

  protected void startApp() throws MIDletStateChangeException {

  myDisplay.setCurrent(myCanvas);

  }

  protected void pauseApp() { }

  protected void destroyApp(boolean unconditional) { }

  class KeyEventsDemoCanvas extends Canvas {

  public final int BACKGROUND_COLOR = 0xFFFFFF;

  public final int FOREGROUND_COLOR = 0x000000;

  private int lastKey;

  public void paint(Graphics g) {

  g.setColor(BACKGROUND_COLOR);

  g.fillRect(0, 0, getWidth(), getHeight());

  g.setColor(FOREGROUND_COLOR);

  g.drawString("Press a key!", 0, 0, Graphics.TOP | Graphics.LEFT);

  if (lastKey != 0) {

  g.drawString("Key Code: " + lastKey, 0, g.getFont().getHeight(),

  Graphics.TOP | Graphics.LEFT);

  try {

  g.drawString("Action: " + getGameAction(lastKey), 0,

  2 * g.getFont().getHeight(),

  Graphics.TOP | Graphics.LEFT);

  g.drawString("Key Name: " + getKeyName(lastKey), 0,

  3 * g.getFont().getHeight(),

  Graphics.TOP | Graphics.LEFT);

  } catch (Exception e) {

  }

  }

  }

  public void keyPressed(int keyCode) {

  lastKey = keyCode;

  repaint(); 

  }

  public void keyRepeated(int keyCode) {

  System.out.println("Key repeated" + keyCode);

  }

  }

  儲存檔案,並命名為myJ2.java。在Project中單擊“Add file”按鈕,在出現的對話方塊中選中你剛才的myJ2.java檔案,編譯器,運行即可。
 

相關文章

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.