国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

J2ME入門:建立一個MIDlets

2019-11-18 16:21:02
字體:
來源:轉載
供稿:網友
J2ME入門:建立一個MIDlets

作者:Jonathan Knudsen,Sing Li

翻譯:rochy


版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
原文地址:
http://www.javaworld.com/javaworld/jw-05-2005/jw-0502-midlet.Html
中文地址:
http://www.matrix.org.cn/resource/article/43/43796_MIDlets_J2me.html
關鍵詞: J2ME MIDlets

     移動信息設備簡表MIDP(Mobile Information Device PRofile)應用程序,即MIDlets,它的命名延續了applets和servlets的風格。對于一個有經驗的java程序員來說寫MIDlets程序相對容易的多。畢竟編程語言仍是java,而且,MIDP中很多來自java.lang和java.io的基本API和J2SE中的一樣,學習新的API(主要來自javax.microedition的)也不是很難。

    然而實際運行起來,比起J2SE來,MIDlets顯得稍微復雜一點。除了基本編譯環境,MIDlets還需要一些額外的開發包。完整的編譯過程包含:編輯,源碼,編譯,類包,測試。

    為了說明MIDlets的開發過程,這篇文章將建立和運行一個簡單的MIDlet,讀完這篇文章你應該對MIDlet開發有個全局上的了解。

工具準備

   MIDlets可以在一般的桌面系統上開發,盡管它本身是專門為小設備設計的。首先你需要從Sun或者其他廠商那里獲得一些工具。記住MIDP只是一種規范,所有廠商都可以自由選擇自己的實現方式。現在有很多MIDlet的開發工具并且一般都是免費的。

   最主要的工具應當是sun的MIDP標準實現,它包含一個預審工具(preverify tool),一個MIDP設備模擬器,部分源碼和說明文檔。可以從sun的官方下載。但通常我們都不用這些標準實現,除非你對MIDlets編譯和打包特別感興趣。(當然如果你想要把MIDP運行時環境移植到一個新的設備或者平臺就去深入鉆研吧。)

   對于初學者另外一個較好用的工具是J2ME 的無線工具包WTK(WirelessToolKit)。WTK中的GUI接口隱藏了多數的MIDlets實現和打包細節,提供了從源碼到實現MIDlets的簡單方法。而且WTK占用資源很小,可以說是一個微型的IDE,幾乎不會影響到你的機器性能。

    其他還有很多來自設備制造商,無線運營商,IDE開發商和一些開源組織的大一點的IDE工具,典型的幾個列在下面(包含可用鏈接):
Borland JBuilder X Mobile Edition
IBM WebSphere Studio Device Developer
Research In Motion BlackBerry Java Development Environment
Sun Java Studio Mobility
NetBeans IDE 4.x
Eclipse J2ME plug-in
Nokia Developer's Suite for J2ME

實際上你可以用任何你認為合適的開發工具,不過我們這里建議使用WTK,我們一下的內容將以WTK2.2進行講解。畢竟其他的IDE都是用WTK作為Plug-in的,這樣一來你的開發經驗并不取決于你用的什么工具。在這篇文章里我們將詳細介紹開發環境,開發工具以及模擬器的詳細細節。

調試你的MIDlets

上文中提到的任何一款IDE都集成了完整的調試工具。如果單獨使用WTK外加一個文本編輯器,你可以使用System.out.println()方法將調試結果在控制臺中輸出,WTK中的控制臺可以顯示給你所有的調試信息。

編寫代碼

我們仍然像在其他環境一樣編寫代碼:用你最喜愛的文本編輯器編寫擴展名為.java的文件。后面我們會給出一個可以加深你對黑客詞典理解的的MIDlet程序實例Jargoneer,主要是在Jargon文件中查找特定的單詞。當你在Jargoneer中輸入一個詞,它會連接到服務器去查找定義。這個MIDlet會讓你公司里的黑客朋友覺得你很“cool”哦,呵呵。當有人使用一些例如“cruft”或者“grok”等不常見的詞語時,你就可以通過在你的手機里面輸入它并且在很短的時間里找到它的解釋。下面就是Jargoneer的完整代碼(你可以到Apress網站下載這個程序)。

源碼如下:

import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Jargoneer extends MIDlet
   implements CommandListener, Runnable {
   private Display mDisplay;

   private Command mExitCommand, mFindCommand, mCancelCommand;

   private TextBox mSubmitBox;
   private Form mProgressForm;
   private StringItem mProgressString;

   public Jargoneer() {
      mExitCommand = new Command("Exit", Command.EXIT, 0);
      mFindCommand = new Command("Find", Command.SCREEN, 0);
      mCancelCommand = new Command("Cancel", Command.CANCEL, 0);

      mSubmitBox = new TextBox("Jargoneer", "", 32, 0);
      mSubmitBox.addCommand(mExitCommand);
      mSubmitBox.addCommand(mFindCommand);
      mSubmitBox.setCommandListener(this);

      mProgressForm = new Form("Lookup progress");
      mProgressString = new StringItem(null, null);
      mProgressForm.append(mProgressString);
   }

   public void startApp() {
      mDisplay = Display.getDisplay(this);

      mDisplay.setCurrent(mSubmitBox);
   }

   public void pauseApp() {}

   public void destroyApp(boolean unconditional) {}

   public void commandAction(Command c, Displayable s) {
      if (c == mExitCommand) {
         destroyApp(false);
         notifyDestroyed();
      }
      else if (c == mFindCommand) {
         // Show the progress form.
         mDisplay.setCurrent(mProgressForm);
         // Kick off the thread to do the query.
         Thread t = new Thread(this);
         t.start();
      }
   }

   public void run() {
      String Word = mSubmitBox.getString();
      String definition;

   try { definition = lookUp(word); }
   catch (IOException ioe) {
      Alert report = new Alert(
         "Sorry",
         "Something went wrong and that " +
         "definition could not be retrieved.",
         null, null);
      report.setTimeout(Alert.FOREVER);
      mDisplay.setCurrent(report, mSubmitBox);
      return;
   }

   Alert results = new Alert("Definition", definition,
      null, null);
   results.setTimeout(Alert.FOREVER);
   mDisplay.setCurrent(results, mSubmitBox);
   }

   private String lookUp(String word) throws IOException {
      HttpConnection hc = null;
      InputStream in = null;
      String definition = null;
      try {
         String baseURL = "http://65.215.221.148:8080/wj2/jargoneer?word=";
         String url = baseURL + word;
         mProgressString.setText("Connecting...");
         hc = (HttpConnection)Connector.open(url);
         hc.setRequestProperty("Connection", "close");
         in = hc.openInputStream();

         mProgressString.setText("Reading...");
         int contentLength = (int)hc.getLength();
         if (contentLength == -1) contentLength = 255;
         byte[] raw = new byte[contentLength];
         int length = in.read(raw);

      // Clean up.
      in.close();
      hc.close();

      definition = new String(raw, 0, length);
   }
   finally {
      try {
         if (in != null) in.close();
         if (hc != null) hc.close();
      }
      catch (IOException ignored) {}
   }

   return definition;
   }
}


編譯MIDlet

寫MIDlets應用程序是一種交叉編譯,意味著你要在一個平臺編譯而在另外一個平臺運行。
具體說就是要在我們自己的電腦平臺上使用J2SE編譯MIDlets,編譯好的MIDlet可以運行于移動電話,尋呼機,或者其他支持MIDP的移動信息設備。只要你將源程序放在正確的目錄下,WTK可以完成所以的細節工作。

1 啟動Ktoolbar
2 從工具欄選擇新建工程命令建立一個新項目。
3 看到WTK提示,輸入Jargoneer作為工程名MIDlet類名。
4 點擊建立工程按鈕,然后“OK”來關閉工程設定窗口。

圖示如下:

J2ME入門:建立一個MIDlets(圖一)
圖1 新建工程對話框

WTK將工程保存在默認目錄/apps下。以下是目錄說明:
<J2ME Wireless Toolkit Directory>
   apps
      Jargoneer
         bin
         lib
         res
         src


將上文源碼命名Jargoneer.java保存到src目錄下,你可以簡單的單擊工具欄上的Build按鈕編譯已經打開的MIDlet工程。接著,WTK使用J2SE的編譯器進行編譯。一般說來,如果你編譯J2SE程序,classpath環境變量會指向所有你程序需要聯系的類。當你使用javac命令進行編譯文件的時候,一些例如java.lang的API就會被導入,意思即是說在你的MIDlet中使用了類java.lang.System。那么怎樣才能讓編譯器知道你要使用的是這個類的MIDP版本而不是J2SE版本呢?其實我們有一個命令行選項-bootclasspath,它允許你指出描述你將要使用的基礎API的classpath。這個選項這個時候就用來改變MIDP安裝默認的classes目錄。例如如下的命令所示:

javac -bootclasspath/midp/classes Jargoneer.java

如果你的MIDP安裝在不同的路徑,你需要把它調整到classes路徑下。

預審類文件

下一個全新的編譯步驟就是預審了。由于小設備的存儲限制,MIDP(確切的說CLDC,即Connected Limited Device Configuration,受限設備配置簡表)詳細說明了比特碼的驗證被分成兩個部分,preverify將在設備以外的那部分起作用。而設備本身僅僅用來在加載class以前做一些輕松的二次驗證工作。如果使用WTK,你完全不用擔心預審,你單擊Build的時候它會幫你自動完成,你甚至都無法意識到。如果你想要了解更多關于預審器的東西,就繼續看下去,否則可以直接跳過這一節。比特碼驗證在java運行時安全模型中是很基礎的步驟。在一個class被動態的加載之前,比特碼驗證器會檢查類文件以確定它工作正常并且不會對JVM(java Virtual Machine)造成危害。但是同時完成比特碼驗證任務的代碼又太大了,無法在類似移動電話的小設備上面運行。CLDC執行了下面的兩步驗證:

1設備以外的部分,類文件被預審。執行指定的檢查步驟并且把類文件轉化成下一步驗證器可以輕松操作的格式,同時預審器在里面加了一些額外的數據。

2設備上,類加載的時候執行第二步驗證。如果類文件沒有被預審,這一步拒絕執行。MIDP參考實現和WTK包含了一個叫做預審器的工具在上面的第一步里面起作用。

預審器以類文件作為輸入,輸出一個審查類文件。在使用預審器之前,你需要設置classpath到相應路徑下,就好像設置其他類路徑那樣。最后,可以利用參數-d更改輸出路徑。如果使用預審器覆蓋一個已經存在的類文件,你可以使用一下所示的命令:

preverify -classpath .;/ midp/ classes -d . Jargoneer

這個示例中,-d告訴預審器將預審類文件寫到正確的目錄下。同時別忘了要將內類(inner class)一同預審。

注意:像這樣把比特碼驗證分開為兩部分存在嚴重的安全漏洞。設備應該通過安全的方式只從可信的來源下載代碼,因為一部分比特碼是在設備以外檢查的。攻擊者可能提供看起來已經通過驗證的惡意代碼,即使它是無法通過J2SE驗證器的。而對于MIDP第二步驗證來說,它看起來可能是完全正確的并且會被加載和執行。

Sun’s J2ME WTK 模擬器
WTK包含了許多不同類型的模擬器,你可以選擇任何一個測試你的程序。當Run按鈕被單擊的時候,默認的模擬器被加載。

WTK設備
WTK2.2含有一下四個主要設備模擬器:
1.DefaultColorPhone,240*320彩屏,下圖2示意。
2.DefaultGrayPhone,108*208黑白屏幕。
3.MediaControlSKIN,類似于默認手機模擬器,108*208caise 屏幕,帶有音樂效果的標簽等。
4.QwertyDevice,是個smartphone,636*235彩屏,一個小型QWERTY鍵盤。

運行MIDlets
sun 的MIDP參考實現包含一個名為midp的模擬器。
它模擬一個圖形MID,一個移動電話,一些標準按鍵和一個182*210的屏幕。WTK包含了類似的模擬器,其他第三方模擬器也都差不多。一旦得到預審類文件,你就可以在模擬器上面運行了。模擬器是在J2SE環境下運行的應用程序,就像一個MIDP設備。它在你電腦屏幕上面顯示為一個普通的的移動設備。如果你已經將/midp/bin加進PATH中,那么就可以在命令行中輸入命令midp Jargoneer來運行應用程序了。

如果使用WTK,你只要選擇一個模擬器然后單擊run按鈕就ok了。假設一切運行正常,你會看到類似于下一節中圖2 示意的那種效果,那么恭喜你,你已經成功完成了你的第一個MIDlet應用。
使用模擬器控制

下圖是一個模擬器的示意圖

J2ME入門:建立一個MIDlets(圖二)
圖2 WTK 模擬器

Sun的WTK帶有的模擬器可以模擬很多真實設備的功能:
1.一個小規格屏幕,一定的輸入容量。
2.兩個可用的軟鍵(soft button),沒有固定的功能。一般說來,它們各自的功能被顯示在屏幕靠近它們的地方。在MIDlets種,軟鍵用來操作命令。
3.方向鍵提供用戶滾動瀏覽和選擇多項的功能。
4.一個選擇鍵允許用戶確認選擇的項目。

小結
本文引導讀者做了一次MIDP開發的觀光。對于編碼,還是和在J2SE環境下一樣,但是編譯的過程截然不同。首先,源碼必須使用javac的-bootclasspath命令編譯為MIDP識別的文件。其次,類文件必須經過命令行工具預審器的預審。(在WTK中,這個步驟是被自動執行的,用戶只要點擊build按鈕就好)。而且,在WTK中,應用程序可以很輕松的在模擬器上測試。

關于作者
Jonathan Knudsen是一個Java開發人員,也是一位知名作者,其作品包括Wireless Java: Developing with J2ME, 第二版, Mobile Java, The Unofficial Guide to LEGO MINDSTORMS Robots, Learning Java, 以及Java 2D Graphics。Knudsen最初從NeXT OS中的Objective-C開始他的面向對象編程生涯,之后不久就經歷了在微軟的Visual C++的幾年煉獄般的時間,并在1996年轉向Java。關于Java及LEGO機器人,他寫了大量的書。其成績包括5本書,一個名為“Bite-Size Java”的聯機月刊欄目,并在JavaWorld, EXE, NZZ Folio, 以及O'Reilly Network上發表的一些文章。Jonathan擁有普林斯頓大學的機械工程學的學位。

1978年在遭遇到計算機的bug的困擾后,Sing Li對微機技術變得精通起來。他的第一臺PC機是一個99美元的COSMIC ELF組裝機,有256字節的內存,以及一個1位的液晶顯示器。在接下來的二十多年時間里,Li先后當過開發人員,作家,顧問,演講家,導師,以及企業家。他的豐富經驗涉及到分布式架構,Web應用/服務系統,計算機與電信集成,以及嵌入式系統。自從Java, Jini以及Jxtar的第一個alpha版本發布以來,Li就一直使用它們(并寫這些方面的書及文章)。他既是P2P技術的傳道者,還是Jxta社區里的參與人員。

資源
本文是Beginning J2ME, Jonathan Knudsen and Sing Li (Apress, April 2005; ISBN: 1590594797)中第2章"Building MIDlets"的節選。
http://java.apress.com/book/bookDisplay.html?bID=426
下載本文的源碼:
http://java.apress.com/book/download.html?APRESSESSID=f887f2ef01605e5c12b5f1135e6a37c8
下載MIDP參考實現:
http://java.sun.com/prodUCts/midp/
Sun的J2ME 無線工具:
http://java.sun.com/products/j2mewtoolkit/
Borland JBuilder X 移動版本:
http://www.borland.com/mobile/jbuilder/index.html
IBM WebSphere Studio Device Developer:
http://www-306.ibm.com/software/wireless/wsdd/
Motion BlackBerry Java 開發環境的研究:
http://www.blackberry.com/developers/na/java/tools/jde/index.shtml
Sun Java Studio Mobility:
http://wwws.sun.com/software/products/jsmobility/index.html
NetBeans IDE 4.x:
http://www.netbeans.org/
Eclipse J2ME 插件:
http://eclipseme.org/
Nokia 關于J2ME的Developer's Suite:
http://www.forum.nokia.com/main/0,6566,034-2,00.html
Jargon文件是黑客術語的全面詞典:
http://www.catb.org/~esr/jargon/
更多關于加強MIDlets安全性的內容, 閱讀 "Secure Data Files Embedded in MIDP applications," Simon Ru (JavaWorld, 2005年5月):
http://www.javaworld.com/javaworld/jw-05-2005/jw-0502-midp.html
J2ME開發的更多文章,瀏覽JavaWorld主題索引的Java 2 Platform, Micro Edition (J2ME) 部分:
http://www.javaworld.com/channel_content/jw-j2me-index.shtml?

設備開發的更多文章,瀏覽JavaWorld主題索引的Devices部分:
http://www.javaworld.com/channel_content/jw-devices-index.shtml

(出處:http://www.survivalescaperooms.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 马尔康县| 延寿县| 棋牌| 马山县| 灌阳县| 抚远县| 临猗县| 乡城县| 林口县| 青岛市| 安乡县| 长沙市| 堆龙德庆县| 凭祥市| 安龙县| 自贡市| 阳原县| 屯留县| 米泉市| 雷波县| 抚顺县| 云南省| 从江县| 阿鲁科尔沁旗| 观塘区| 堆龙德庆县| 湟中县| 诸暨市| 梓潼县| 玉溪市| 嘉义市| 花莲县| 班玛县| 吉木乃县| 林西县| 清河县| 鲁甸县| 霍邱县| 高台县| 德江县| 朝阳县|