亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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只是一種規范,所有廠商都可以自由選擇自己的實現方式?,F在有很多MIDlet的開發工具并且一般都是免費的。

   最主要的工具應當是sun的MIDP標準實現,它包含一個預審工具(preverify tool),一個MIDP設備模擬器,部分源碼和說明文檔??梢詮膕un的官方下載。但通常我們都不用這些標準實現,除非你對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.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美综合一区第一页| 8090成年在线看片午夜| 高清欧美性猛交| 国模极品一区二区三区| 狠狠躁18三区二区一区| 国产精品久久久久久久久久久久久| 一本久久综合亚洲鲁鲁| 日韩美女在线观看| 中文字幕在线看视频国产欧美| 尤物tv国产一区| 亚洲精品永久免费精品| 亚洲成色777777女色窝| 亚洲男人天堂视频| 国产精品88a∨| 亚洲电影在线看| 在线中文字幕日韩| 国产欧美最新羞羞视频在线观看| 国产亚洲精品日韩| 亚洲成人免费网站| 91精品国产综合久久香蕉的用户体验| 精品中文字幕在线2019| 亚洲国产欧美久久| 亚洲视频日韩精品| 亚洲精品视频免费在线观看| 国产成人一区二区三区小说| 91精品国产高清久久久久久久久| 国产精品色悠悠| 亚洲视频在线看| 色偷偷88888欧美精品久久久| 欧美视频专区一二在线观看| 日韩欧美精品免费在线| 国内精品久久久久久| 国产色综合天天综合网| 欧美性一区二区三区| 国产欧美一区二区三区在线| 国产日韩欧美视频在线| 亚洲黄色片网站| 国产精品一区二区性色av| www.欧美免费| 91精品国产乱码久久久久久久久| 久久久久国产精品免费网站| 国产精品久久久| 精品久久久久久久久久久久久久| 法国裸体一区二区| 亚洲国产精品成人一区二区| 国产亚洲成av人片在线观看桃| 国产亚洲精品高潮| 亚洲精品免费网站| 91欧美精品午夜性色福利在线| 久久九九有精品国产23| 精品福利樱桃av导航| 亚洲午夜精品久久久久久性色| 欧美亚洲激情在线| 国产视频久久久久久久| 91探花福利精品国产自产在线| 成人激情视频免费在线| 亚洲欧美成人一区二区在线电影| 久久中文字幕视频| www.日韩欧美| 国产精品久久婷婷六月丁香| 高清日韩电视剧大全免费播放在线观看| 欧美激情免费观看| 成人a视频在线观看| 欧美在线精品免播放器视频| 国产精品 欧美在线| 亚洲国产成人久久综合| 国产精品久久77777| 一区二区三区视频观看| 欧美日韩国产综合新一区| 亚洲欧美制服第一页| 国产精品久久久久久久久久新婚| 国产视频欧美视频| 国产色婷婷国产综合在线理论片a| 国产亚洲aⅴaaaaaa毛片| 91精品久久久久久久久不口人| 亚洲性av在线| 粉嫩老牛aⅴ一区二区三区| 午夜精品一区二区三区在线视| 国产成人综合亚洲| 国产精品国产三级国产专播精品人| 国产黑人绿帽在线第一区| 在线观看久久久久久| 精品久久中文字幕久久av| 夜夜嗨av一区二区三区四区| 亚洲一区二区在线播放| 日本成人黄色片| 韩国三级电影久久久久久| 欧美在线亚洲一区| 青草青草久热精品视频在线网站| 亚洲综合精品一区二区| 97欧美精品一区二区三区| 国产69精品久久久久9| 亚洲无限av看| 伊人久久综合97精品| 国产精品一区二区三区成人| 欧美洲成人男女午夜视频| 久久精品国产亚洲精品| 久久久久久久影视| 成人精品网站在线观看| 亚洲毛片在线免费观看| 国产精品丝袜白浆摸在线| 韩国精品美女www爽爽爽视频| 91老司机精品视频| 亚洲欧洲在线看| 8090理伦午夜在线电影| 97精品国产97久久久久久| 成人啪啪免费看| 日韩成人激情视频| 国产精品v片在线观看不卡| 精品国产一区二区三区四区在线观看| 最新国产成人av网站网址麻豆| 久久久久久久久久国产精品| 日韩av在线影视| 在线亚洲男人天堂| 日韩在线激情视频| 清纯唯美亚洲综合| 在线观看国产欧美| 亚洲激情成人网| 中文字幕国内精品| 国产日韩欧美另类| 精品无码久久久久久国产| 色婷婷综合成人| 久久影视电视剧免费网站清宫辞电视| 亚洲专区中文字幕| 欧美大片第1页| 精品亚洲夜色av98在线观看| 亚洲精品久久久久国产| 国产在线观看一区二区三区| 欧美高清在线播放| 亚洲精品日韩欧美| 一区二区三区回区在观看免费视频| 国产精品久久久av| 亚洲激情在线视频| 91chinesevideo永久地址| 国产亚洲精品久久久久动| 亚洲老头同性xxxxx| 大胆人体色综合| 欧美一区在线直播| 国产精品极品美女在线观看免费| 国产精品男人的天堂| 亚洲国产精品福利| 热久久免费视频精品| 亚洲国产精品一区二区三区| www.色综合| 亚洲国产精品va在线观看黑人| 91久久国产精品91久久性色| 久久91精品国产| 日韩有码在线播放| 亚洲第一av网站| 欧美视频国产精品| 国产精品日日摸夜夜添夜夜av| 98精品国产高清在线xxxx天堂| 国产亚洲精品日韩| 国产精品欧美日韩| 午夜免费久久久久| 韩日欧美一区二区| 精品国产91久久久久久| 亚洲欧美福利视频| 国内偷自视频区视频综合| 国产91精品最新在线播放| 亚洲国产精品久久91精品| 亚洲男人天堂2024| 精品久久久久久久久久国产| 中文字幕精品一区久久久久|