天天看點

j2me工具指令行攻略及常見問題解決

wtk的工具使用eclipseme+eclipse非常友善,但是我們必需熟悉一些常用的指令行操作,以便在開發過程中出現問題時可以排除錯誤.例如,我今天在用wtk的模拟器通過OAT方式運作程式時,就出現了如下錯誤:

Warning: Running JAM, Ignoring all other options (but "-Xheapsize", and OTA flags if provided)

正在通過存儲根 QwertyDevice 來運作

Running with locale: Chinese_People's Republic of China.936

Running in the identified_third_party security domain

** Error installing suite (39): The JAD matches a version of a suite already installed.

Execution completed.

3653833 bytecodes executed

24 thread switches

1665 classes in the system (including system classes)

19019 dynamic objects allocated (571732 bytes)

1 garbage collections (0 bytes collected)

然後模拟器就退出了,大家注意有一行:

** Error installing suite (39): The JAD matches a version of a suite already installed.

提示相同版本的jad已經安裝了,好,那改一個版本吧,修改後運作依然出錯:

** Error installing suite (17): The application is an older version of one that is already installed

可見,錯誤很明顯:因為此應用已經安裝過了,使用如下指令檢視安裝了哪些應用:

D:\WTK2.5.1\apps\test>emulator -Xjam:list

正在通過存儲根 DefaultColorPhone 來運作

Running with locale: Chinese_People's Republic of China.936

Running in the identified_third_party security domain

[1]

Name: myjm Midlet Suite

Vendor: Midlet Suite Vendor

Version: 2.0.0

Storage name: #Midlet%0020#Suite%0020#Vendor_myjm%0020#Midlet%0020#Suite_

Size: 8K

Installed From: http://localhost:8080/ota/myjm/j2me.jad

MIDlets:

    HelloWorldPlusMIDlet

    MyTestMIDlet

    CalendarTest

[2]

Name: test

Vendor: Unknown

Version: 1.0

Description:this is my test Midlets

Storage name: #Unknown_test_

Size: 6K

Installed From: http://10.17.33.191:1260/test/bin/test.jad

MIDlets:

    TinyMIDlet

    HelloWorldPlusMIDlet

既然這樣,那換一個名稱吧,OK了,運作成功!

原因找到了,那我們就可以将原來的程式删除後再安裝,指令如下:

D:\WTK2.5.1\apps\test>emulator -Xjam:remove=all

正在通過存儲根 DefaultColorPhone 來運作

Running with locale: Chinese_People's Republic of China.936

Running in the identified_third_party security domain

Execution completed.

3693460 bytecodes executed

22 thread switches

1665 classes in the system (including system classes)

19407 dynamic objects allocated (583992 bytes)

1 garbage collections (0 bytes collected)

也可以用安裝的序号删除指定的程式,如:

D:\WTK2.5.1\apps\test>emulator -Xjam:remove=1

其實,删除還可以直接在模拟器上完成,運作下 emulator -Xjam 看看就知道了.

實際上我們如果隻是測試下程式,可使用這個參數,在運作後程式将會自動删除:

emulator -Xjam:transient=http://localhost:8080/ota/myjm/j2me.jad

另外,提醒大家一下,通過OAT下載下傳的時候一定要将httpserver的MIME類型設定正确,不然模拟器會提示MIME類型不正确,正确的MIMI類型應該如下:

<mime-mapping>

<extension>jad</extension>

<mime-type>text/vnd.sun.j2me.app-descriptor</mime-type>

</mime-mapping>

<mime-mapping>

<extension>jar</extension>

<mime-type>application/java-archive</mime-type>

</mime-mapping>

在運作程式時,無論是直接運作JAD,還是OAT方式,都需要将midp和midlet的版本設定正确,檢視模拟器支援的版本指令如下:

D:\WTK2.5.1\apps\test>emulator -version

Sun Java(TM) Wireless Toolkit 2.5.1 for CLDC

Profile: MIDP-2.1

Configuration: CLDC-1.1

Optional: J2ME-WS-1.0,J2ME-XMLRPC-1.0,JSR179-1.0.1,JSR180-1.0.1,JSR184-1.1,JSR211-1.0,JSR226-1.0,JSR229-1.1.0,JSR234-1.0

,JSR238-1.0,JSR239-1.0,JSR75-1.0,JSR82-1.1,MMAPI-1.1,SATSA-APDU-1.0,SATSA-CRYPTO-1.0,SATSA-JCRMI-1.0,SATSA-PKI-1.0,WMA-1

.1,WMA-2.0

以上指令主要針對sun的WTK,對于其它廠商的SDK,指令格式應該類似.

=============================================================

下面着重對NOKIA的s60sdk3的常見問題進行一下讨論.

在eclipseme中使用s60的sdk作為模拟器運作OAT方式時,會提示:

Failed to resolve application name

Caught exception:

java.lang.IllegalStateException:No application specified in Jad or command line

...

可見,s60的sdk是不支援OAT方式運作的.即s60的emulator不支援-Xjam參數(參見安裝目錄的S60_SDK_User_Guide_v3.0a.pdf),隻支援-Xdescriptor:<jad file name>

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

通過jad的方式運作吧,在eclipse提示:

java.io.FileNotFoundException

...

原來是sdk不支援這個格式的檔案參數:file:\E:\,在eclispe的run配置中将"file:"去掉後可運作成功,同樣在指令行下也可運作成功:

emulator -Xdescriptor:E:\sylilzy\silyWork\eclipse32workspace\myjm\deployed\j2me.jad

(注意:此方式運作時有可能會出現以下錯誤:

Failed to launch the emulator:

Caught exception:

java.lang.RuntimeException:command failed with Symbian error code:-10508

at com.symbian.tools.j2me.sei.emulator...

...

),将jad的MIDP版本修改為模拟器支援的版本(emulator -version檢視)可解決該問題.

然後直接以class的方式運作jar中的類,在eclipse中提示:

Jar file could not be initialized

Caught exception:

java.til.zip.ZipException:invalid entry compressed size(expected 993 but got 996 bytes)

...

用以下指令行出現同樣的錯誤:

E:\sylilzy\silyWork\mgs>emulator -classpath E:\sylilzy\silyWork\eclipse32workspace\myjm\deployed\myjm.jar com.sily.s60.HelloWorldPlusMIDlet

可見eclipse的classs運作應該就是采用上述指令行

分析原因,可能是因為eclipse所打的jar包,在sdk中無法被解壓導緻,但是為什麼采用jad方式運作時可以正确讀取jar包中的類呢,無可得知...

但是,在eclipse中create package後,再create obfuscated package後,再通過指令行運作:

emulator -classpath E:\sylilzy\silyWork\eclipse32workspace\myjm\deployed\myjm.jar com.sily.s60.HelloWorldPlusMIDlet

則是OK的,是因為proguard3.9對原myjm.jar包作了修改,反而可以正常運作了 : )

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

那現在直接運作class目錄中的class會怎樣呢,如下:

E:\sylilzy\silyWork\mgs>emulator -classpath E:\sylilzy\silyWork\eclipse32workspace\myjm\bin com.sily.s60.HelloWorldPlusMIDlet

java.lang.Error: ClassFormatError: Inconsistent or missing stackmap at target

- java.lang.Class.invoke_verify(), bci=0

- java.lang.Class.initialize(), bci=117

- java.lang.Class.forName(), bci=0

- com.symbian.midp.runtime.MIDletExecutor$MIDletConstructorThread.run(), bci=43

Uncaught exception: java.lang.RuntimeException: java.lang.Error: ClassFormatError: Inconsistent or missing stackmap at t

arget

- com.symbian.midp.runtime.MIDletExecutor$MIDletConstructorThread.run(), bci=183

-VM verbose connection exited

提示ClassFormatError,這是由于編譯的class沒有preverify導緻的,換SUN WTK編譯試試,一樣.但是,運作另外一個程式卻可以通過:

emulator -classpath E:\sylilzy\silyWork\eclipse32workspace\myjm\bin com.sily.j2me.MyTestMIDlet

the program is running...

-VM verbose connection exited

其實這說明有些類在preverify的時候并沒有改變

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

另外,對于s60的模拟器,啟動後可不關閉,因為在模拟器上有一個叫做"DebugAgent"的程式專門是用來調試的,這樣可在調試時節約啟動模拟器的時間.

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

綜上所述,可見nokia的sdk在與eclipseme的相容上還存在一些問題,也就是說在 eclipse3.2+eclipseme1.7+nS60_jme_sdk_3rd_e的環境下,想在eclipse下正常運作midlet程式是不可能的,需要手工修改一些配置,或者通過指令行的方式才可将程式正确地運作起來.

轉自:http://ming-fanglin.iteye.com/blog/548873

繼續閱讀