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

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

J2ME入門:建立一個MIDlets應用程序(圖)

2019-11-18 15:53:51
字體:
來源:轉載
供稿:網友

  移動信息設備簡表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運

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 常熟市| 青州市| 新巴尔虎右旗| 上林县| 乌鲁木齐县| 比如县| 来安县| 浠水县| 仙游县| 永泰县| 台前县| 叶城县| 油尖旺区| 昭觉县| 聂荣县| 香河县| 保山市| 勐海县| 四川省| 汤阴县| 巴彦淖尔市| 乐平市| 金川县| 江西省| 玉树县| 龙泉市| 拉萨市| 庆云县| 化州市| 赫章县| 兰州市| 桐梓县| 吉安市| 武宣县| 广安市| 寿阳县| 邹平县| 革吉县| 达拉特旗| 仪陇县| 陆川县|