程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME 機型開發bug收集

J2ME 機型開發bug收集

編輯:J2ME
MOTO 小C系列

  常見機型:C650

  手機屏幕:128*128

  游戲屏幕:128*116

  非全屏屏幕:128*100

  Java聯網:CMWAP需要代理

  字體大小:17*17,一行約7個中文字,內置一種字體,任何字體選項均為默認字體

  MIDP:2.0

  CLDC:1.0

  Java單個容量限制:標准100K(實際無限制,小於手機本身內存)

  Java堆棧容量:800K

  特別1:支持MOTO FUNLIGHT API

  特別2:支持MOTO 3D API

  特別3:開啟攝像頭、內部文件訪問權限等需要授權

  特別4:C650機型:setMediaTime該機型不支持,playerUpdate傳過來的player是副本,所以應該用

  equal而不是==。

  --------------------------------------------------------------------------------

  MOTO C550/C370/E380系列

  手機屏幕:96*65

  游戲屏幕:96*64

  非全屏屏幕:96*64

  Java聯網:CMWAP需要代理

  字體大小:不明,可參考MOTO C

  MIDP:1.0

  CLDC:1.0

  Java單個容量限制:100K標准(實際不明)

  Java堆棧容量:512K

  特別1:支持MOTO GAME API,可實現相當於MIDP2.0的功能。

  --------------------------------------------------------------------------------

  MOTO E398、V600系列

  手機屏幕:176*220

  游戲屏幕:176*204

  非全屏屏幕:176*182

  Java聯網:CMWAP需要代理

  字體大小:17*17 一行約10個中文字,內置一種字體,任何字體選項均為默認字體。

  MIDP:2.0

  CLDC:1.0

  Java單個容量限制:無限制,小於手機本身內存

  Java堆棧容量:800K

  特別1:E398支持MOTO FUNLIGHT API

  特別2:支持MOTO 3D API

  特別3:開啟攝像頭、內部文件訪問權限等需要授權

  特別4:V300系列,鍵值正好與E398互為相反數,可以歸為同一個版本,取鍵值的判斷其絕對值。

  --------------------------------------------------------------------------------

  MOTO C975/C980/V980系列

  手機屏幕:176*220

  游戲屏幕:176*204

  非全屏屏幕:176*182

  Java聯網:CMWAP需要代理

  字體大小:內置三種字體

  MIDP:2.0

  CLDC:1.1

  Java單個容量限制:無限制,小於手機本身內存

  Java堆棧容量:1.5M

  特別1:支持標准 3D API

  特別2:支持藍牙

  --------------------------------------------------------------------------------

  MOTO E680系列

  手機屏幕:240*320

  游戲屏幕:240*320

  Java聯網:CMWAP需要代理、直聯

  字體大小:內置三種字體

  MIDP:2.0

  CLDC:1.1

  Java單個容量限制:無限制,小於手機本身內存

  Java堆棧容量:1.5M(預想)

  特別1:支持標准 3D API

  特別2:支持藍牙

  特別3:E680上5個空格占一個字符寬度

  特別4:E680加載代碼是分段加載,盡量避免寫超長的方法,否則可能會有延遲。

  --------------------------------------------------------------------------------

  NOKIA S40 V1

  手機屏幕:128*128

  游戲屏幕:128*128(FullCanvas)

  非全屏屏幕:128*???

  Java聯網:CMWAP直接聯

  字體大小:三種字體大小,最小字體12*12,一行約10個中文字

  MIDP:1.0

  CLDC:1.0

  Java單個容量限制:64KB

  Java堆棧容量:不明

  特別1:按鍵會有延遲,中斷後原線程還會在後台繼續運行直到調用repaint,內存開銷不當會死機

  ----------------------------------------------------------------------------------

  NOKIA S40 V2

  手機屏幕:128*128

  游戲屏幕:128*128(FullCanvas 或 setfullscreenmode(ture))

  非全屏屏幕:128*???

  Java聯網:CMWAP直接聯

  字體大小:三種字體大小,最小字體12*12,一行約10個中文字

  MIDP:2.0

  CLDC:1.0

  Java單個容量限制:110~128KB不等

  Java堆棧容量:不明

  -------------------------------------------------------------------------------------

  NOKIA 6230i

  手機屏幕:128*128

  游戲屏幕:208*208(這裡指分辨率)

  Java聯網:CMWAP直接聯

  字體大小:不明,可參考S40

  MIDP:2.0

  CLDC:1.0

  Java單個容量限制:不明

  Java堆棧容量:不明

  --------------------------------------------------------------------------------------

  NOKIA S60 MIDP1.0

  手機屏幕:176*208

  游戲屏幕:176*208(FullCanvas)

  非全屏屏幕:176*144

  Java聯網:CMWAP直接聯

  字體大小:不明,一行可顯示約12-13個中文字

  MIDP:1.0 (但是可增加多媒體播放API)

  CLDC:1.0

  Java單個容量限制:不明

  Java堆棧容量:不明

  特別1:3650機型:setClip和drawRegion搭配不能正確設置裁減框。

  特別2:3650機型:頻繁I/O操作會死機,應盡量在游戲初始化時將數據一次讀入。

  特別3:N-Gage機型:在背景緩沖上setClip和drawRegion搭配完全不能設置裁減框聲音播放有問題,建

  特別4:N-Gage機型:聲音播放有問題,建議在I/O操作等跟系統底層有關調用之後再播放聲音

  ---------------------------------------------------------------------------------------

  NOKIA S60 MIDP2.0

  手機屏幕:176*208

  游戲屏幕:176*208(FullCanvas 或 setfullscreenmode(ture))

  非全屏屏幕:176*144

  Java聯網:CMWAP直接聯

  字體大小:不明,一行可顯示約12-13個中文字

  MIDP:2.0

  CLDC:1.0

  Java單個容量限制:不明

  Java堆棧容量:不明

  特別1:6600機型:調用readFully不能按指定字節數讀取,readByte代替。

  特別2:6600機型:setClip和drawRegion搭配在歐版6600上不能正確設置裁減框,導致繪圖錯誤

  特別3:7610機型:drawRegion在這個機型上會拖慢速度,建議使用Nokia UI API上的drawImage。

  特別4:7610機型:繪圖函數調用不當會當機。

  特別5:6681機型:頻繁I/O操作會死機,應盡量在游戲初始化時將數據一次讀入。

  特別6:6681機型:使用2.0的drawRegion會造成內存洩露,盡量減少使用翻轉,尤其是畫地圖時應盡量使用1.0的drawImage來實現

  ----------------------------------------------------------------------------------------

  索愛K700C

  手機屏幕:176*220

  游戲屏幕:176*220(setfullscreenmode(true))

  游戲屏幕:176*208(com.nokia.mid.ui.FullCanvas)

  非全屏屏幕:176*176(setfullscreenmode(false))

  Java聯網:CMWAP需要代理

  字體大小:不明,一行中文字數約10個,內置一種字體,任何字體選項均為默認字體。

  MIDP:2.0

  CLDC:1.1

  Java單個容量限制:???

  Java堆棧容量:512K(實際使用中感覺不止)

  特別1:支持NOKIA UI API,但是drawpixels(),getpixels()這2個表現差勁不能使用

  特別2:支持標准3D API

  特別3:單個類文件不能超過70K(JAR包壓縮後的大小),否則無法加載

  ------------------------------------------------------------------------------------

  波導S689

  手機屏幕:128*160

  游戲屏幕:128*144

  非全屏屏幕:128*128(估計)

  Java聯網:CMWAP需要代理

  字體大小:不明, 一行約8個中文字,內置一種字體

  MIDP:2.0

  CLDC:1.0

  Java單個容量限制:200K

  Java堆棧容量:512K

  ------------------------------------------------------------------------------

  阿爾卡特 OT556/557

  手機屏幕:128*160

  游戲屏幕:128*160

  非全屏屏幕:128*129

  Java聯網:CMWAP需要代理

  字體大小:14*14,一行中文字個數約8個,內置一種字體font(0,0,0)

  MIDP:2.0

  CLDC:1.0

  Java單個容量限制:256k

  Java堆棧容量:512K

  ----------------------------------------------------------------------------------

  三星X108/X608

  手機屏幕:128*128

  游戲屏幕:128*128(全屏補丁實現)

  非全屏屏幕:128*110

  Java聯網:CMWAP需要代理

  字體大小:不明,一行中文字個數不明,內置一種字體font(0,0,0)

  MIDP:1.0

  CLDC:1.0

  Java單個容量限制:???

  Java堆棧容量:不明

  手機Java之怪現象

  2008-01-08 21:09

  下面記載的都是手機Java實現中各種奇怪的毛病,bug,或者……特性,是根據某項目的開發經驗總結出來的。但是涵蓋的手機型號還是有限。因此很有可能某些“特性”會存在於更多的采用了相同JVM(比如平台相同、生產廠商)的手機上。

  Java手機網[www.cnjm.Net]== 早期S60的內存洩漏 ==

  這個bug可以上溯至2003年,甚至更早。表現為Java應用中如果使用了Class.getResourceAsStream("本地文件")無法釋放其占用的內存,是的,沒有任何辦法,無論是調用獲得的的InputStream實例的close()或將其設為null,甚至顯式強制System.gc (),都沒有效果。結果就是至少和本地文件同尺寸的內存成為了無法回收的垃圾。這個問題還影響到以Class.getResourceAsStream ()為基礎的Image.createImage()(這個是最要命的,如何能夠不使用圖片資源呢!)。

  這個bug據說在新的S60上已經解決了。但是Nokia3230(4.0526.2ch)、Nokia7610(6.0525.0ch)都存在這個問題。對於這些個有問題的機型,在 java程序中是無法完美解決這個問題的,只能盡量避免。比如集中、統一載入資源,永不釋放(也就是說,盡量控制洩漏的次數)。當然,這會對已有代碼造成很大影響。畢竟手機Java應用是內存受限系統的典型,大多數情況下,珍貴的內存中只保留需要的資源。

  == 鍵盤響應事件 ==

  在MIDP1 中,獲取鍵盤事件只能自己實現Canvas.keyPressed()。但是MotorolaE398和SonyEriCSSonK700c的實現卻很奇怪。表現為左右軟鍵有可能在這個方法中捕獲不到。而是否能夠成功捕獲,取決於keyPressed()方法中代碼的行數……

  我承認我沒徹底搞清楚這其中的玄機。鬼知道Motorola和SonyEriCSSon是怎麼實現的JVM。我只知道把keyPressed中的所有代碼提取到另外一個函數中,在keyPressed只把參數傳遞給新函數,問題就消失了……

  == 超慢的drawRegion ==

  除了N-Gage QD,幾乎所有的NokiaS60手機都實現了MIDP2的支持。MIDP2中,最為重要的幾個特性之一就是Graphics.drawRegion。這個API可以方便的將圖片旋轉、剪切之後畫到畫布上。

  但是,這個API在Nokia3230、Nokia7610等手機上的實際性能表現讓人實在不敢恭維。於是,這個最重要的API成了擺設……沒什麼怎麼辦,只能急需延用MIDP1的做法,自己實現剪切和旋轉,或者像我一樣懶,直接要求美工把旋轉之後的圖片全都做出來……

  Java手機網[www.cnjm.Net]

  == 詭異的內存容量 ==

  按照官方Spec,Java在Nokia3125上的可用內存(即Java Heap Size)為512k。但是實際測試的結果是,Nokia3125只有412k左右的實際內存,相差整整100k。不過好在Nokia3125並不是種市場保有量很高的型號。但是它是我正在使用的型號……

  == 無法repaint ==

  這個問題只存在於SonyEriCSSonK700c。表現為在keyPressed()中調用repaint()進行屏幕重畫沒有任何反映。

  Java手機網[www.cnjm.Net]

  解決辦法是,在keyReleased()中補一個repaint()……

  == UTF8 ==

  還是SonyEricssonK700c的問題。問題存在於new String(byte[], charset)上。也就是說,當獲得了某個byte[],並希望用UTF8作為字符集將其轉換為字符串的時候,使用上述方法在 SonyEriCSSonK700c上會出現丟失字符的現象。這個現象很詭異,以至於我目前沒有搞清楚什麼情況下會丟失字符(我甚至專門寫了個測試程序在真機上跑,得出的結論是丟失字符的原因可能會很復雜,簡單的拿被丟掉字符附近的一個子串來測沒有任何問題)。

  幸虧還是有解決辦法的。不用 new String就完了,而要用更加麻煩的辦法,比如像我一樣,用ByteArrayInputStream,外面套InputStreamReader (bais, "UTF8"),然後用StringBuffer一個一個char讀進來,最後再toString()……

  == 不可*的copyArea ==

  這是Motorola機器上的問題,V3和E398都有。copyArea是Graphics的作整塊屏幕像素copy的常用API(2D動態背景的游戲幾乎是必不可少)。按照Sun官方的Spec,手機廠商有義務來保證其API實現不存在覆蓋沖突問題。但是Motorola顯然做得不夠好。在 Motorola手機上使用這個API會隨機產生貼圖混亂的情況……

  解決辦法是自己實現另外一套機制。比如使用另外一張至少和屏幕同樣大小的Image作為緩沖,用兩次drawImage來替代copyArea……不過這個方法顯而易見的缺點是消耗了更多的內存(那可是不小於屏幕尺寸的 Image啊!)。如果內存實在吃緊,只能退而再求其次,作為緩沖的Image繼續縮水,drawImage的次數繼續增加……不過這個時候需要自己手工解決覆蓋沖突……

  Java手機網[www.cnjm.Net]

  == 無法安靜下來的3220 ==

  不知道這個問題是不是在S40平台上都有,手裡S40又支持MIDI的手機實在是太少了……

  3220的一個很明顯的特征就是聲音大。以至調用了VolumeControl.setLevel(0)之後還是有聲音,和Sun官方的Spec完全不符……沒辦法,只能在需要靜音的時候,再補一個VolumeControl.setMute(true)。

  == 永不ready ==

  這是一段手機Java獲取網絡數據的常用代碼:while(InputStream.ready()) { InputStream.read() }。

  Java手機網[www.cnjm.Net]但是經測試,在Nokia3230上,這個ready永遠返回false……沒辦法,如果不改上述代碼的話,就自己實現一個繼承類吧。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved