- 如何將現(xiàn)有分段的 MIDP 項目移植到 NetBeans
- 如何使用 IDE 的內置設備破碎解決方案
本教程使用的示例程序是流行的 J2ME 游戲 "Marv The Miner",這是在 GPL 下發(fā)布的程序,并且編寫為在幾個不同的移動平臺上運行。
完成本教程大約需要兩個小時的時間,并且包括以下主題:
- 從現(xiàn)有 MIDP 項目導入源。
- 創(chuàng)建和定制每個分發(fā) Jar 的項目配置。
- 標記特定于每個配置的源代碼段。
- 為項目生成幾個分發(fā) Jar。
- 通過 IDE 使用外部仿真器。
要完成本教程,您需要 MarvTheMiner_120_all.zip 文件,該文件包含此程序的原始源文件。單擊此處,下載“Marv the Miner v1.2.0(包括級別編輯器)”,以獲得源文件。
- 設置環(huán)境
- 獲取所需源文件
- 在 NetBeans 中開發(fā) Marv The Miner 應用程序
- 生成和執(zhí)行 Marv the Miner 應用程序
- 深入探討配置
- 使用不符合 UEI 的仿真器平臺
設置環(huán)境
此節(jié)介紹如何在開始本教程之前對系統(tǒng)進行設置。
獲取并安裝所需軟件 |
示例所需的軟件如下:
使用下載站點提供的說明安裝該軟件。
|
啟動 IDE |
要啟動 NetBeans IDE,請執(zhí)行以下操作:
- 在 Microsoft Windows 上
選擇“開始”>“程序”>“NetBeans版本”> "NetBeans IDE"。
- 在 UNIX 或 Linux 環(huán)境上
在終端窗口中,鍵入 sh IDE-install-path/bin/runide.sh
IDE-install-path 變量代表 IDE 起始目錄的路徑。 |
獲取所需源文件 |
MarvTheMiner_120_all.zip 文件包含原始 Marv The Miner 應用程序的源文件。該 zip 包括一個 MarvTheMiner 目錄,其中包含您將在本教程中使用的 src 和 res 子目錄。
要解壓縮 MarvTheMiner_120_all.zip 文件,請執(zhí)行以下操作:
- 在您的文件系統(tǒng)中,創(chuàng)建一個臨時位置,用于放置 MarvTheMiner_120_all.zip 的內容。
例如,在本教程中,該目錄指的是 C:\temp 目錄。
- 使用用于解壓縮文件的應用程序將 MarvTheMiner_120_all.zip 文件解壓縮到 temp 目錄。
temp 目錄現(xiàn)在擁有 MarvTheMiner 目錄,其中包含以下文件和子目錄:
文件或子目錄 |
描述 |
src |
構成 Marv The Miner 程序的源文件。 |
res |
包含該程序所使用的資源文件。其中包括圖,以及用于定義游戲級別布局的 .map 文件。 |
MarvEditor |
級別編輯器(不在本教程的討論范圍之內)。 |
Nokia.full |
該游戲的 Nokia 生成形式。 |
MIDP.full |
該游戲的一般 MIDP 生成形式。 |
- 將 res 目錄移動到 C:/temp/MarvTheMiner_120_all/src/。為了在創(chuàng)建新的 NetBeans 項目之后確保資源文件保持正確的相對路徑,可以使用這種簡單的解決方法。
|
在 NetBeans IDE 中開發(fā) Marv The Miner 應用程序
本節(jié)介紹如何在 NetBeans IDE 中設置和使用現(xiàn)有項目源。
導入現(xiàn)有源
創(chuàng)建項目 |
第一步是在 NetBeans IDE 中創(chuàng)建一個新項目。
- 從主菜單中選擇“文件”>“新建項目”。
將顯示“新建項目”向導。
- 在“類別”列表中選擇“移動”。然后選擇“來自現(xiàn)有 MIDP 源的移動項目”,并單擊“下一步”。
- 如果未使用安裝程序安裝 NetBeans,則此處將顯示一個面板,指導您安裝移動平臺。按照說明執(zhí)行操作,并安裝某些版本的 Wireless Toolkit。然后單擊“下一步”。
- 對于“導入的源的位置”,單擊“瀏覽”按鈕并導航至您在解壓縮 MarvTheMiner_120_all.zip 文件時創(chuàng)建的 C:/temp/MarvTheMiner_120_all/src 目錄。選擇 src 目錄,然后單擊“打開”。單擊“下一步”。
- 輸入新項目的名稱。例如,將其命名為 MarvTheMiner。
- 現(xiàn)在,選擇新項目目錄所在的目錄。確保已選中“設置為主項目”復選框,并單擊“完成”。
將創(chuàng)建新項目 MarvTheMiner,并且顯示在 IDE 的“項目”標簽中。
- 展開 MarvTheMiner 根項目節(jié)點,以查看該項目的源和資源。展開 <缺省包> 節(jié)點,然后雙擊 Main.java,以在編輯器中打開該文件。
|

創(chuàng)建項目配置
NetBeans 設備破碎解決方案基于對項目配置的使用。對于一個項目而言,為該項目創(chuàng)建的每個分發(fā) Jar/Jad 都應該擁有一個項目配置。
如果您檢查文件 Main.java
,將看到作者支持具有(Nokia 的 FullCanvas)和 Class.forname()
注釋組合的多個平臺。同時還定義了變量 vendor,該變量用于跟蹤運行應用程序的電話。根據此信息,您可以看到他們支持五組不同的電話:
- Nokia Series 60
- 其他 Nokia 產品
- Motorola
- Vodafone
- 其他
同樣,您將創(chuàng)建四個配置來處理這些分發(fā)之間的差異。
創(chuàng)建配置 |
- 右鍵單擊 MarvTheMiner 項目節(jié)點,并選擇“屬性”。
此時將打開“項目屬性”頁面,用于控制項目多方面的內容。
- 單擊該頁頂部的“管理配置”按鈕。此時將打開“管理配置”對話框。
- 單擊“添加”,然后鍵入
NokiaSeries60 并按“確定”。
- 對于
Motorola 、Vodafone 和 NokiaOther 重復前面的步驟。單擊“關閉”可關閉“管理配置”對話框。

位于“項目屬性”頁頂部的“項目配置”組合框現(xiàn)在應該包含五種配置。我們馬上會使用這些設置,但是現(xiàn)在要向 IDE 添加一些仿真器。 |
向 IDE 添加仿真器 |
要使用已經安裝在計算機上的仿真器平臺運行項目,首先必須在 IDE 中進行注冊。
- 在“項目配置”組合框中選擇 "DefaultConfiguration",然后選擇“平臺”節(jié)點。單擊“管理仿真器”按鈕。將出現(xiàn)“平臺管理器”對話框。
請注意,還可以從“工具”>“Java 平臺管理器”的主菜單訪問該對話框。
- 單擊“添加平臺”,并導航至安裝 Nokia Series 60 仿真器的目錄。單擊“下一步”。
- 確保仿真器設置檢測正確,然后單擊“下一步”。
- 如果需要,在此您可以指向該仿真器的源文件和 javadoc 文件。否則,只需單擊“完成”,以完成該平臺的安裝。
-
對于您的機器上已經安裝的每個仿真器平臺,以及要通過 IDE 使用的每個仿真器平臺重復這些步驟。
請注意,IDE 只能檢測到符合 UEI 標準的仿真器。遺憾的是,這意味著不能檢測開發(fā)人員用于 Marv The Miner 的 Motorola 7.5 仿真器。本教程后面的章節(jié)將介紹通過 IDE 使用不符合 UEI 的仿真器的解決辦法。 |
針對配置定制項目設置 |
可以針對每個項目配置單獨定制“項目屬性”頁上的每個面板。缺省情況下,配置將使用在缺省配置中定義的設置。
- 打開“項目屬性”頁,并選擇“平臺”面板。確保在“項目配置”組合框中選中 "DefaultConfiguration"。
- 在“仿真器平臺”組合框中選擇 "J2ME Wireless Toolkit 2.x"。將單選按鈕切換為 CLDC-1.0 和 MIDP-2.0。
缺省情況下,所有配置將使用此仿真器來生成和執(zhí)行項目。然而,這并不是我們想要的結果,因為代碼引用幾個特定于平臺的庫。
- 從“項目配置”組合框中選擇 NokiaSeries60 配置。
“平臺”面板現(xiàn)在完全灰顯。這是因為當前對此面板使用 "DefaultConfiguration" 中的值。
- 取消選中該面板頂部的“使用 "DefaultConfiguration" 中的值”復選框。
該面板中的所有元素現(xiàn)在將處于啟用狀態(tài)。從“仿真器平臺”組合框中選擇 Series 60 MIDP Concept SKD Beta 0.3.1 Nokia 平臺。
如果在各個配置之間進行切換,您將看到,現(xiàn)在除了 NokiaSeries60 配置之外,所有配置都使用在 DefaultConfiguration 中指定的值。如果您更改了“DefaultConfiguration 平臺”面板中的任何配置設置,所做的更改將傳播到除 NokiaSeries60 之外的所有配置。
- 在“項目配置”組合框中選擇 "NokiaOther" 配置。取消選中“使用 "DefaultConfiguration" 中的值”復選框,并選擇一個您安裝的其他 Nokia 平臺。
- 也可以針對 Vodafone 平臺重復這些步驟。
- 如上所述,Motorola 7.5 仿真器不符合 UEI,因此不能安裝到 IDE 中。然而,為了進行編譯,我們仍然可以指向其 API。激活 Motorla 配置,并選擇“庫和資源”面板。
- 取消選中“使用 "DefaultConfiguration" 中的值”復選框。
- 單擊“添加 Jar/Zip”,并導航至
{motorola 安裝目錄}\Emulator7.5\lib 。選中每個 .zip 文件(使用 Ctrl+ 鼠標),然后單擊“打開”。
- 單擊“確定”退出項目屬性。現(xiàn)在您已經完成項目配置的創(chuàng)建任務。
|
為每個配置創(chuàng)建定制代碼塊 |
設備破碎解決方案的第二部分是能夠指定源文件中的某些代碼塊,以使其特定于一個或多個配置。通過使用右鍵單擊編輯器上下文菜單中的操作或通過“編輯”>“預處理程序塊”菜單可以完成此任務。
- 打開 Main.java,并檢查 initStaticData() 方法。此處,該方法確定在運行時中哪些特定于設備的 API 可用,并隨后執(zhí)行相應的操作。這是一個非常智能的解決方案,可以解決設備破碎某些部分的問題。遺憾的是,該解決方案也存在會添加分發(fā) Jar 的大小,從而影響運行時性能及提高源復雜性的問題,并且不能解決所有分段問題(您隨后會看到這一點)。
以下是 initStaticData() 的相關部分: vendor = 0;
try
{
// Nokia
Class.forName("com.nokia.mid.sound.Sound");
vendor = 1;
try
{
Class.forName("com.nokia.mid.ui.DeviceControl");
com.nokia.mid.ui.DeviceControl.setLights(0,100);
vendor = 2;
}
catch(Exception ex2){}
}
catch(Exception ex){}
try
{
// Vodafone
Class.forName("com.vodafone.v10.system.device.DeviceControl");
com.vodafone.v10.system.device.DeviceControl.getDefaultDeviceControl().
setDeviceActive(com.vodafone.v10.system.device.DeviceControl.BACK_LIGHT,
true);
vendor = 3;
}
catch(Exception ex){}
try
{
// Motorola
Class.forName("com.motorola.multimedia.Vibrator");
Class.forName("com.motorola.multimedia.Lighting");
com.motorola.multimedia.Lighting.backlightOn();
vendor = 4;
}
catch(Exception ex){}
- 刪除所有只涉及確定程序在哪個設備上運行的功能,因此剩下的代碼如下:
// Nokia
com.nokia.mid.ui.DeviceControl.setLights(0,100);
// Vodafone
com.vodafone.v10.system.device.DeviceControl.
getDefaultDeviceControl().
setDeviceActive(com.vodafone.v10.system.device.DeviceControl.BACK_LIGHT,
true);
// Motorola
com.motorola.multimedia.Lighting.backlightOn();
現(xiàn)在您擁有與不同配置關聯(lián)的三個代碼塊。
- 突出顯示特定于 Motorola 的行,然后右鍵單擊編輯器,并選擇“預處理程序塊”> "Motorola"。
- 對于 Vodafone 塊重復此步驟(“預處理程序塊”> "Vodafone")。
- 對于 Nokia 代碼,選擇“預處理程序塊”>“管理預處理程序塊”。
此時將打開“管理預處理程序塊”對話框。
- 選擇 "NokiaOther" 和 "NokiaSeries60" 的選項,然后單擊“確定”。
這些代碼塊現(xiàn)在與預處理程序塊的頁眉和頁腳中列出的配置相關聯(lián)。如果活動配置是預處理程序塊頁眉和頁腳的一部分,則更改項目的活動配置將觸發(fā)一個預處理程序,該程序將注釋或注釋掉所基于的塊。

- 通過使用主工具欄中的組合框可更改項目的活動配置。
還可以通過從主“生成”菜單中的相同菜單右鍵單擊項目節(jié)點 >“設置活動項目配置”> 選擇配置,或通過切換主工具欄中的“配置”組合框(如果項目當前是主項目)來完成此操作。
請注意,代碼塊突出顯示的顏色將發(fā)生變化,以標識哪些塊處于活動狀態(tài),哪些塊處于非活動狀態(tài)。活動配置名稱也將在代碼塊的頁眉/頁腳中突出顯示一個不同的顏色。
- 從
beep() 方法中刪除 class.forName() 的所有實例。如果還要精簡 if 塊,則剩下以下代碼: if (midlet.muteSound == 0)
{
// Nokia 3650, 7650
com.nokia.mid.sound.Sound sound = new com.nokia.mid.sound.Sound(1000,100);
sound.play(1);
// All other Nokias
com.nokia.mid.sound.Sound sound = new com.nokia.mid.sound.Sound(1000,100);
sound.play(1);
}
if (midlet.useVibra == 1)
{
// Nokia
com.nokia.mid.ui.DeviceControl.startVibra(50,500);
// Vodafone SDK
com.vodafone.v10.system.device.DeviceControl.
getDefaultDeviceControl().
setDeviceActive(
com.vodafone.v10.system.device.DeviceControl.VIBRATION,
true);
vibra_delay = 10;
// Motorola 7.5
com.motorola.multimedia.Vibrator.
setVibrateTone(
com.motorola.multimedia.Vibrator.VIBRATE_LONG);
com.motorola.multimedia.Vibrator.vibrateFor(500);
}
您應該能夠將每個塊與正確配置相關聯(lián)。切記將 Nokia 振動控制調用與兩個 Nokia 配置相關聯(lián)。
- run() 方法也包含特定于 Vodafone 的調用。刪除 try/catch 塊,并將這兩行與 Vodafone 配置相關聯(lián)。
我們馬上就能完成任務了。最后一步是以某種方式來處理 Nokia 的 FullCanvas。
- 激活 NokiaSeries60 配置。
- 右鍵單擊 FullCanvas 聲明,并選擇“創(chuàng)建 If/Else 程序塊”(NokiaSeries60)。
- 右鍵單擊第一個塊,并添加 NokiaOther。
- 右鍵單擊第二個塊,并添加 NokiaOther。
- 第二個塊是倒置的塊。將此倒置的塊類定義更改為 extend Canvas。
完成后,類定義如下:
|
生成和執(zhí)行 Marv the Miner 應用程序
生成和執(zhí)行應用程序 |
此時,我們應該能夠針對所有配置編譯和運行該程序。單擊主工具欄上的任何圖標將對活動配置執(zhí)行所選的操作。
- 在主菜單中,選擇“生成”>“生成所有主項目配置”。
假設所有項目均已正確設置,現(xiàn)在應該可以生成所有配置了。
如果您不能訪問包含正確 API 的一個或多個仿真器平臺,則此步驟可能失敗。如果出現(xiàn)這種情況,您應該手動注釋掉任何對不存在的 API 進行的調用。
如果您未按照這些步驟手動安裝不符合 UEI 的仿真器一節(jié)中描述的 Motorola 仿真器,則針對 Motorola 配置的預校驗將失敗。為了在不手動添加仿真器的情況下進行此配置的編譯,您可以注釋掉所有 motorola API 調用,并從“庫和資源”面板中刪除 motorola 庫。
- 選擇 IDE 左上方的“文件”標簽,并展開 dist 文件夾。在此文件夾中,您應該擁有包含每個已成功生成配置的 Jar/JAD 的目錄,以及代表 DefaultConfiguration 生成的 Jar/Jad。
- 按 F5 可采用當前選定的配置運行該程序。您可以切換配置,并再次按 F5,同時運行該程序的多個版本。
|
5. 深入探討配置
通過本教程,您可以熟練掌握如何將現(xiàn)有 MIDP 項目導入到 NetBeans 環(huán)境中,但是它并未將 IDE 解決的所有設備破碎問題全部列出。以下列舉了一些常見問題的更多示例及如何通過 IDE 來解決。
使用不符合 UEI 的仿真器平臺
雖然 IDE 只能自動檢測符合 UEI 規(guī)范的第三方仿真器平臺,但是仍然可以使用不符合 UEI 的仿真器。本節(jié)介紹具體操作方式。
添加不符合 UEI 的仿真器 |
- 在 userhome 目錄中(在 Windows 中的缺省位置為 C:\Documents and Settings\{username}\.netbeans,Linux 中的缺省位置為 /home/{username}/.netbeans),檢查 {userhome}\config\Services\Platforms\org-netbeans-api-java-Platform 目錄。
此目錄包含定義已安裝仿真器平臺的 xml 文件。您可以為不符合 UEI 的任何仿真器手動創(chuàng)建這些文件。可以在以下網址找到此 xml 文件的 DTD:http://www.netbeans.org/dtds/j2me-platformdefinition-1_0.dtd
- 將以下文件保存為 SDK_4.1_MRI_7.5.xml,以使用本教程所需的 Motorola 7.5 仿真器。請注意,使用 " 是有一定作用的,應按原樣保存。
<?xml version='1.0'?>
<!DOCTYPE platform PUBLIC '-//NetBeans//DTD J2ME PlatformDefinition 1.0//EN'
'http://www.netbeans.org/dtds/j2me-platformdefinition-1_0.dtd'>
<platform name="Motorola_7_5"
home="C:\WTK\Motorola\SDK v4.1 for J2ME\Emulator7.5"
type="custom"
displayname="Motorola 7.5"
srcpath=""
preverifycmd=""{platformhome}/bin/preverify.exe"
-classpath "{classpath}" -d "{destdir}"
"{srcdir}""
runcmd="">
<device name="Motorola_7_5" securitydomains="trusted,untrusted"
description="Motorola_7_5">
<configuration name="CLDC" version="1.1" displayname="CLDC"
classpath="${platform.home}/lib/cldc.zip"
dependencies="" default="true"/>
<profile name="MIDP" version="2.0" displayname="MIDP"
classpath=";${platform.home}/lib/midp.zip"
dependencies="" default="true"/>
</device>
</platform>
保存此 XML 文件之后,需要重新啟動 IDE。完成操作之后,就可以選擇 Motorola 7 5 作為平臺,而選擇 Motorola_7_5 作為設備。您應該將 Motorola 配置與這個新的平臺相關聯(lián)。請注意,您可能需要刪除 {userhome}\var\cache 中的緩存文件,以便檢測到手動安裝的平臺。此外,不應刪除也可能位于此處的 mdrstorage 文件夾。
注意 runcmd 特性設置為空字符串。這是因為啟動此 Motorola 仿真器的命令將 MIDlet 作為其參數(shù)之一來執(zhí)行。這與 UEI 標準截然不同,IDE 中不能提供直接支持。但是...
-
如果您所使用的仿真器平臺所需的信息不會比提供給 UEI 仿真器的信息要多,則可以跳過此步驟。以下信息將提供給 UEI 仿真器:
- 安全域
- 平臺類型
- 平臺起始目錄
- Jad 位置
- Jad 目標目錄/Jad 名稱
如果您的仿真器需要額外信息(如項目 Jar 的位置或要執(zhí)行的 MIDlet 的名稱),則通過修改位于項目起始目錄中的 build.xml 文件可以執(zhí)行仿真器。
此文件控制所有項目操作。我們在此可以創(chuàng)建一個新目標,該目標不僅可以執(zhí)行 motorola 仿真器,如果在 Motorola 配置上調用運行操作,則還可以傳遞所有適當?shù)臄?shù)據。
向項目的 build.xml 添加以下代碼: <target description="Run MIDlet suite." depends="init" name="run">
<condition property="run.motorola">
<!-- arg2 must match the configuration name
you would like to use the special emulator -->
<equals arg1="${config.active}" arg2="Motorola"/>
</condition>
<ant inheritrefs="true" inheritall="true" target="run_normal"/>
<ant inheritrefs="true" inheritall="true" target="run_motorola"/>
</target>
<target description="Run MIDlet suite the normal way." depends="init"
name="run_normal" unless="run.motorola">
<nb-run commandline="${platform.runcommandline}"
securitydomain="${evaluated.run.security.domain}"
execmethod="${run.method}" platformtype="${platform.type}"
platformhome="${platform.home}" device="${platform.device}"
jadurl="${dist.jad.url}" jadfile="${dist.dir}/${dist.jad}"/>
</target>
<target description="Run MIDlet suite for motorola's non-UEI emulator."
depends="init" name="run_motorola" if="run.motorola">
<property name="project.home" location="."/>
<!-- the last arg line contains an value "Miner".
This must match the name of the midlet you want to execute -->
<java dir="${platform.home}/bin"
fork="true"
classname="com.mot.tools.j2me.emulator.Emulator"
classpath="${platform.home}/bin/Emulator.jar;${platform.home}/bin/configtool.jar">
<jvmarg value="-Djava.library.path=${platform.home}/lib"/>
<arg value="-classpath${project.home}/${dist.dir}/${dist.jar}"/>
<arg line="-deviceFile"/>
<arg value="${platform.home}/bin/RESOUR~1/T720I~1.PRO"/>
<arg line="javax.microedition.midlet.AppManager Miner -JSA 1 1"/>
</java>
</target>
因此,只要活動配置是 Motorola,就會運行 run_motorola 目標。否則,將調用 run_normal 目標(使用正常仿真器執(zhí)行程序)。 |
其中包括 Marv the Miner 教程。