天天看點

J2me的基本概念

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

  本文主要介紹J2me的基本概念。因為注意到國内的java站點介紹J2me的還比較少,是以就寫了本文。如果有什麼不妥的地方,歡迎您email我,讨論商榷。

  如您要轉貼,請保留原出處,并勿做删改。謝謝。

  1.名詞

  這裡我列出一些常見的關鍵詞,友善與下文參照.具體解釋見後文.

  me/' target='_blank' />J2me(Java2 Platform, Micro Edition)

  CLDC(Connected, Limited Device Configuration)

  MIDP(Mobile Information Device Profile)

  KVM(The K Virtual Machine)

  2.背景

  随着無線應用與嵌入式系統的愈來愈受到人們的重視,SUN也推出了J2me來迎合這一趨勢.(實際上道也不能算是新推出,熟悉Java曆史的人都知道,java原先本是為了開發消費性電子産品而研制的.誰知,無心插柳柳成蔭,因在網絡應用上的出色表現而流行,以緻現在的J2EE、EJB等等,發展地越來越龐大。這次實質是殺了個回馬槍。至于表現如何,還得拭目以待)sun認為,未來的資訊裝置将比我們今天的更為customizable 和 personal。這一點我們已經可以從手機和pda的流行程度看出。是以為了開發面向這些裝置的applications。sun推出了J2me(Java2 Platform, Micro Edition)。

  3.j2me的基本結構

  j2me把裝置分為兩類,一種是聯接裝置( connected device),一種是有限聯接裝置(Connected, Limited Device)。前一種對應于那些有電源的,電力充裕,較大的裝置。例如:電視機,冰箱等,後一種對應于主要使用電池,小型的裝置,例如:手機,pda等。這裡我隻涉及第二種,有限聯接裝置(Connected, Limited Device)。

  3.j2me的基本結構

  sun把J2me分為兩個部分:configuration 和 profile。

  configuration包括虛拟機(virtual machine),核心的類庫與API。configuration層定義一個java虛拟機的特性與java類庫的最小子集。也就是說,configuration層提供了開發人員一個最基礎,最核心的Java平台。就像我前文提到的,j2me把裝置分為兩類,一種是聯接 裝置(connected device),一種是有限聯接裝置(Connected, Limited Device)。對應這兩種裝置就有了兩種J2me configuration。分别為CDC(Connected Device Con-figuration )和CLDC(Connected, Limited Device Configuration)。這裡請注意,CDC使用經典的javaVM,而CLDC使用的是KVM(The K Virtual Machine)。

  注:kvm是sun為使用16/32位RISC/CISC微處理器或控制器,并其可用記憶體為160kb~512kb 的的裝置而開發的。

  Profile層也包含一組API,主要針對于特定的某一族系的裝置而定義。profile層在特定的configuration層上實作,而我們程式員則負責在特定的profile上編寫應用程式。對于手機,pda等Connected, Limited Device。它們的profile層稱為MIDP(Mobile InformationDevice Profile)。于是MIDP與CLDC合在一起就構成了一個完整的J2me架構。

  順便說一句,對于MIDP上的應用程式sun也有獨特的叫法,它們被稱為MIDlet。你是不是覺得有點眼熟。想想java中的applet。

  ┌───────┐┄┄┄┄┄┄┄

  │MIDlet │ 應用程式

  ├───────┤┈┈┈┈┈┈┈

  │ MIDP │ proflie層

  ├───────┤┄┄┄┄┄┄┄

  │J2me核心API │ configuration層

  ├───────┤ CLDC

  │ KVM │

  ├───────┤┈┄┄┄┄┄┄

  │特定的硬體 │

  └───────┘

  圖1 J2me的CLDC&MIDP架構

  4。深入了解CLDC

  本節的部分内容譯自J2me White Paper,比較枯燥,但請記住,畢竟,正确的觀念重于一切。

  CLDC的目的

  ·為小型的,且資源有限,Connected Limited的裝置定義一個标準的Java平台。

  ·允許動态的向這些裝置釋出内容與應用程式。

  ·友善第三方軟體廠商與開發者向這些裝置移植内容與應用程式。

  CLDC的範圍

  ·Java語言與虛拟機的特性

  ·核心Java類庫(如java.lang.*, java.util.*)

  ·輸入/輸出

  ·對網絡的支援

  ·對安全性的支援

  ·對國際化的支援

  CLDC不包括的範圍(即由MIDP解決的)

  ·對應用程式life-cycle的管理(就是指一個應用程式是如何安裝,運作,删除的)

  ·UI界面(User Interface)

  ·Event處理

  ·進階應用程式模式(這裡指使用者與應用程式的互動)。

  CLDC的安全性

  低端的基于虛拟機的安全性由下載下傳時對class檔案的稽核(verification)步驟來保證。(如果你寫過并編譯過MIDlet程式,就會知道這一步是必須的。這裡有一個概念就行了,我會在以後講述如何建立MIDlet程式時,詳細介紹具體的步驟)。

  基于應用程式的安全性通過使每個應用程式分别運作在相對獨立的封閉環境中來保證并且處于被保護的系統package中的類不能被應用程式重載(overridded)。

  對于Java語言支援的特殊的方面

  CLDC總的來說是與Java語言完全相容的,但需注意以下幾點:

  不支援浮點資料類型(即沒有float和double)(這實際上主要是由于CLDC所面向的裝置,其硬體因其記憶體限制或是基于安全性的考慮不支援浮點運算)

  不支援類執行個體(class instance)的終結(finalization),即不存Object.finalize ()方法。(注:finalization指的是java中提供的有别與garbage collection的另外的一種對象清理方法。具體可參看侯捷老師譯的Bruce Eckel的《Thinking in Java 第二版》,可以在www.jjhou.com中下載下傳)

  有限的錯誤處理,即大部分Java.lang.Error的子類都未被支援。與此相反,CLDC包括了相當完備的異常(exception)類。

  對于Java虛拟機(Java Virtual Machine)支援的特殊的方面

  實質上CLDC在其嚴格的記憶體限制下達到了對Java虛拟機相當程度的相容性。不過還是有下列不同點。

  ·不支援浮點資料類型(沒有float和double)

  ·不支援JNI (the Java Native Interface )

  ·不支援使用者自定義的Java級的類載入器(class loaders )

  ·沒有反射(reflection)特性(注:reflection指java通過java.lang.reflect提供的,可以對類的能力進行分析的功能。常用來對類的結構進行檢查,在JavaBeans上有廣泛運用可參見Gary Cornell的Core Java2 volumeI,II,機工有出中譯本)

  ·不支援線程組(thread groups)或守護線程(daemon threads)

  ·不支援類執行個體(class instance)的終結(finalization)

  ·沒有弱參考(weak references)(注:weak reference提供了一種解決指向已經被garbage collector清除的對象的方法。在Java2中被介紹。具體請參考java.lang.ref API文檔,和sun網站上關于Reference Objects和Garbage Collection的文章。)

  ·有限的錯誤處理(error handling)

  4。深入了解CLDC (part II)

  本節的部分内容譯自J2me White Paper,比較枯燥,但請記住,畢竟,正确的觀念重于一切。

  類檔案稽核過程(classfiles Verification)

  CLDC要求其下層的虛拟機能夠辨識并拒絕非法的class檔案。但由于CLDC本身面向小記憶體消耗的小型裝置這一前提。其類檔案檢測機制與J2SE中定義的标準類檔案稽核機制還有所不同。請注意看下圖:

  MyApp.java

  │

  ↓

  ┌───┐

  │Javac │┄編譯器

  └───┘

  ↓

  MyApp.class

  ↓

  ┌──────┐

  │preverifier │┈預稽核器

  └──────┘

  ↓

  MyApp.class

  │

  ↓download...

  ┌────────┒

  │ ┠┄┄KVM運作環境

  │┌──────┐┃ (目标裝置)

  ││ verifier │┃

  │└──────┘┃

  │ ┃

  │┌──────┐┃

  ││ │┃

  ││interpreter │┃

  ││ │┃

  │└──────┘┃

  ┕━━━━━━━━┛

  圖2 CLDC/KVM中類檔案的稽核過程

  請注意CLDC中的預稽核(preverification)過程。這是CLDC差別于通常的類檔案稽核過程的關鍵。如上圖所示,當源程式被編譯後,必須被預稽核器預稽核,然後才能被下載下傳到目标裝置上去。之是以有這一步驟,主要是為了減輕KVM中稽核器的負擔,加快稽核速度。就像我前文提到的,這是出于對CLDC支援的硬體的考慮(畢竟手機和PDA并沒有我們PC機那樣奔騰的“芯”呀!^-^)。這裡記住這個概念就行了。具體的操作方法我會在以後講述編寫MIDlet程式時介紹。

  類檔案格式

  sun要求通過Jar(compressed Java Archive)給Java應用程式打包,這裡也不例外。是以如果你想把你的MIDlet程式下載下傳到裝置上運作,你就得先用jar打包。具體的操作方法我會在以後講述編寫MIDlet程式時介紹。

  CLDC的類庫

  如果不嚴格的說,CLDC的類庫是J2SE的一個小的子集,有以下這種近似關系成立,即J2SE包含CDC包含CLDC。但要注意CLDC并未完全包含于J2SE,它還包括一 些專門針對無線設施的類。是以可以把CLDC的類庫簡要劃分為兩部分:從J2SE繼承的類和CLDC專有的類。

  (1)從J2SE繼承的類

  這部分包括三個package,即java.lang,java.util和java.io。注意即使這些從J2SE繼承的的類,也是大大“縮了水”的。例如java.util的類與接口由J2SE的47個縮減到10個。另外兩個也有相應縮減。

  系統類

  From java.lang:

  Object, Class, Runtime, System, Thread, Runnable,

  String, StringBuffer, Throwable

  資料類型類

  From java.lang:

  Boolean, Byte, Short, Integer, Long, Character

  容器類(container class)

  From java.util:

  Vector, Stack, Hashtable, Enumeration

  I/O 類

  From java.io:

  InputStream, OutputStream, ByteArrayInputStream,

  ByteArrayOutputStream, DataInput, DataOutput,

  DataInputStream, DataOutputStream, Reader, Writer,

  InputStreamReader, OutputStreamWriter, PrintStream

  日期與時間類

  From java.util:

  Calendar, Date, TimeZone

  附加的實用類

  java.util.Random, java.lang.Math

  異常類(Exception Classes)

  From java.lang:

  Exception, ClassNotFoundException,

  IllegalAccessException, InstantiationException,

  InterruptedException, RuntimeException,

  ArithmeticException, ArrayStoreException,

  ClassCastException, IllegalArgumentException,

  IllegalThreadStateException, NumberformatException,

  IllegalMonitorStateException, IndexOutOfBoundsException,

  ArrayIndexOutOfBoundsException,

  StringIndexOutOfBoundsException,

  NegativeArraySizeException, NullPointerException,

  SecurityException

  From java.util:

  EmptyStackException, NoSuchElementException

  From java.io:

  EOFException, IOException, InterruptedException,

  UnsupportedEncodingException, UTFDataformatException

  錯誤類

  From java.lang:

  Error, VirtualMachineError, OutOfmemoryError

  (2)CLDC專有的類

  這裡sun提供了javax.microedition.io包。用它來提供與外界溝通的橋梁。(注:就像在J2SE中我們利用java.net.*)注意,所有的連接配接都由javax.microedition.Connector建立。例如:你可以打開一個http連接配接通過 Connector.open("http://www.chinajavaworld.com")

  javax.microedition.io的接口包括:

  Connection, InputConnection, OutputConnection,

  StreamConnection, ContentConnection, DatagramConnection,

  StreamConnectionNotifier

  這裡再說明一點,實際上你也可以看出,CLDC所包括的類庫,并不足以開發應用程式。例如,沒有UI界面的支援等。這也正是CLDC的設計理念。CLDC本身就從未想過要解決所有的問題。這些問題要靠其上層的Profile-MIDP來解決。例如javax.microedition.lcdui就是定義在MIDP中的UI包。

  計算機世界開發者俱樂部 http://www.dev-club.com

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>