對於android的紅火,以及Windows Mobile的跟進,移動OPhone看起來還像是別人的技術。不過如何將J2ME API移植到OPhone,本文就談論這些。
中國擁有世界最龐大的電信客戶群,僅移動用戶就達4億,3G在中國有最大的市場做後盾,無論現在的市場發展如何的困難,3G費用的降低是大勢所趨,不久的將來,必然形成巨大的3G浪潮,3G手機會如雨後春筍一般,充滿祖國大地,如今各大移動通信運營商和移動終端開發商都看到廣大的前景,在為3G做最後的准備。最近作為中國移動業務最大的運營商中國移動公司推出了自己的開發平台:OPhone OS系統。OPhone OS采用Linux2.6內核,兼容android應用。
OPhone是中國移動在這次3G浪潮來臨前打造的主力航空母艦,與中移動無線業務平台的對接,OPhone將承載大量3G業務應用。大量的軟件開發企業將會把新的陣地放到移動平台上來,軟件如:手機電視、炒股、網游,企業應用MIS,移動辦公,都將會是移動設備發展的熱點,這樣也就需要大量的開發人員,由於手機開發人員稀少,收入比一般pc開發人員會更高。由於現在中國移動的大力推廣,如果企業和創業者依托mmarket也會有不錯的前景,OPhone作為中國移動大力推廣的戰略平台潛力巨大。
android移植除了硬件外最重要的是Java平台之間的移植,目前市面上Java VM主要使用的是Sun公司的Java Micro Edition。而Google android平台采用的是自己開發的Dalvik。如何從過去J2ME移植到谷歌手機平台呢?
雖然是不同的開發環境,但是所要實現的功能都是相近的,因此從功能的角度可以很好的理解OPHONE OS平台和J2ME平台之間的聯系和區別。總結一下,可以發現從以下四個方面可以很好的理解兩個平台之間移植。
如果代碼框架寫得好,邏輯部分基本不需要怎麼變化,只需要把和平台相關的接口轉換一下就可以了。
1)用戶界面
這一點是J2ME移植到Dalvik上最麻煩的地方,android的圖形類和Sun Jave ME有了很大的不同,同時m3到m5 SDK上也有更大改變的趨勢,導致了移植時出現很多需要自己去實現相關類,使最終程序的運行效率可能會受影響,真機沒有出現的情況下通過開發板可以適當的測試出性能損失。這一點需要花費很長時間去學習,也是未來我們著重需要講解的。
2)數據存儲
這方面就顯示出android 平台比Sun Java強大的地方了,android平台附帶了一個SQLite數據庫,和Sun J2ME中的Record Management System (RMS)相比在功能上有了很大的提升,同時在性能上也會有不俗的表現,在過去開發J2ME軟件時一直都采取的是如果數據比較簡單使用自定義的二進制格式或XML代替。
3)網絡數據
這部分android平台的做法是import Sun中的I/O讀寫庫InputStream這樣的類,同時網絡相關的仍然采用Sun的URLConnection類進行操作,基本上沒有變化,移植時注意下設備的棧空間簡單的調整下就可以了。
4)媒體播放
這部分在android系統上就有了大幅的改變,官方推薦使用MediaPlayer播放類,該類支持mp3、mid、wav、mp4等常規媒體格式的播放,相比J2ME中提供的就靈活強大的多。
下面我們一步一步實現J2ME API在OPHONE OS上的移植。
1、 入口程序MIDlet
學過J2ME的開發人員都知道J2ME有一個主體類MIDlet類,它是程序管理接口,調用startApp(),進入應用程序。
同樣,在OPHONE OS平台中同樣有一個主體類Activity,調用onCreate(savedInstanceState)進入某個交互界面。
下面我們將通過繼承Activity模擬實現J2ME中的MIDlet類和方法。
- public abstract class MIDlet extends Activity {
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- startApp();
- }
- public abstract void destroyApp(boolean unconditional);
- public String getAppProperty(String key) {
- return null;
- }
- public abstract void startApp();
- public void notifyDestroyed() {
- }
- public void notifyPaused() {
- }
- public void pauseApp() {
- }
- public void platformRequest(String URL) {
- }
- public void resumeRequest() {
- }
- }
2、Canvas
同樣在J2ME中畫板Canvas類與OPhone OS中的VIEw類相似。
- public abstract class Canvas extends Displayable {
- public Canvas(MIDlet context) {
- super(context);
- }
- Graphics g = new Graphics();
- public void onDraw(android.graphics.Canvas canvas) {
- g.bind(canvas);
- paint(g);
- }
- int getGameAction(int keyCode) {
- return 0;
- }
- int getKeyCode(int gameAction) {
- return 0;
- }
- String getKeyName(int keyCode) {
- return "key";
- }
- boolean hASPointerEvents() {
- return true;
- }
- boolean hASPointerMotionEvents() {
- return true;
- }
- boolean hasRepeatEvents() {
- return true;
- }
- protected void hideNotify() {
- }
- boolean isDoubleBuffered() {
- return true;
- }
- protected void keyPressed(int keyCode) {
- }
- protected void keyReleased(int keyCode) {
- }
- protected void keyRepeated(int keyCode) {
- }
- protected abstract void paint(Graphics g);
- protected void pointerDragged(int x, int y) {
- }
- protected void pointerPressed(int x, int y) {
- }
- protected void pointerReleased(int x, int y) {
- }
- void repaint() {
- }
- void repaint(int x, int y, int width, int height) {
- }
- void serviceRepaints() {
- }
- void setFullScreenMode(boolean mode) {
- }
- protected void showNotify() {
- }
- protected void sizeChanged(int w, int h) {
- }
- }
3、Graphics
J2ME 中的Graphics類和OPhone OS中的paint類相似。在移植中,要用OPhone OS類庫實現J2ME中的Graphics類,我們在實現的過程中可以對Graphics對象進行修飾,通過整合OPHONE OS 中Canvas並調類庫中的Paint類和Color類的方法來實現。比如:
- Graphics
- public class Graphics {
- public final static int VCENTER = 0;
- public final static int TOP = 1;
- public final static int SOLID = 2;
- public final static int RIGHT = 3;
- public final static int LEFT = 4;
- public final static int HCENTER = 5;
- public final static int DOTTED = 6;
- public final static int BOTTOM = 7;
- public final static int BASELINE = 8;
- Canvas dist;
- private final Paint paint = new Paint();
- public void bind(Canvas canvas) {
- dist = canvas;
- }
- public void setColor(int eraseColour) {
- }
- public void drawImage(Image img, int x, int y, int anchor) {
- dist.drawBitmap(img.getTp(), x, y, paint);
- }
- }}
上面是我們重新定義的Graphics類,在其方法的實現上,我們調用了OPHONE OS的一些具體實現方法,從而用OPhone OS類庫實現了J2ME的框架,做到了兩個平台之間很好的移植。
從上面幾個例子可以看出兩個平台的框架具有很多相似性,這就為兩個平台之間的移植創造了條件。同時我們也會看到,兩個平台之間存在一定的差異性,一些在 J2ME中的類和方法無法通過直接繼承或者調用OPhone OS來實現,這時候就需要移植人員,自己來實現一些相關的類,這也是移植過程中需要我們去努力克服的困難。