NetBeans IDE 4.0 チュートリアル: J2ME MIDP デバイスの細分化 (Marv The Miner)
このチュートリアルでは、既存の Java[tm] 2, Micro Edition Platform (J2ME[tm] Platform) MIDP プロジェクトを取り扱うことができるように IDE を設定する方法、特に、デバイスの細分化の問題を解決するための NetBeans[tm] IDE の内蔵機能を使用する方法を紹介します。このチュートリアルを最後まで終えると、次のことを学ぶことができます。
- 細分化された既存の MIDP プロジェクトを NetBeans に移植する方法
- デバイス細分化を解決するための IDE の内蔵機能を使用する方法
このチュートリアルでは、サンプルプログラムとして、人気のある J2ME ゲーム、「Marv The Miner」を使用します。このゲームは GPL で公開され、いくつかの異なるモバイルプラットフォームで動作するように設計されています。
このチュートリアルに要する時間は 2 時間ほどで、次の事項を取り上げています。
- 既存の MIDP プロジェクトからのソースのインポート
- プロジェクト構成の作成、およびディストリビューション JAR ごとのプロジェクト構成のカスタマイズ
- 各構成に固有のソースコード部分のマーク付け
- プロジェクト用の複数のディストリビューション JAR の構築
- IDE 内での外部エミュレータの利用
このチュートリアルに取り組むには、MarvTheMiner_120_all.zip ファイルが必要です。このファイルには、プログラムのオリジナルソースファイルが含まれています。これらのソースファイルを入手するには、ここをクリックして、「Marv the Miner v1.2.0 (including level editor)」をダウンロードしてください。
- 環境のセットアップ
- 必要なソースファイルの入手
- NetBeans における Marv The Miner アプリケーションの開発
- Marv the Miner アプリケーションの構築および実行
- 構成の問題
- UEI に準拠していないエミュレータプラットフォームの使用
環境のセットアップ
この節では、チュートリアルに取り組む前のシステムのセットアップ方法を説明します。
| 必要なソフトウェアの入手とインストール |
サンプルプログラムを使用するには、次のソフトウェアが必要です。
ダウンロードサイトでの指示に従って、ソフトウェアをダウンロードしてください。
|
| IDE の起動 |
NetBeans IDE を起動する手順は、次のとおりです。
- Microsoft Windows の場合
「スタート」>「プログラム」>「NetBeans version」>「NetBeans IDE」を選択します。
- UNIX または Linux の場合
端末ウィンドウで 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 を圧縮解除する手順は、次のとおりです。
- 使用しているファイルシステムで、MarvTheMiner_120_all.zip の内容を一時的に格納する場所を作成します。
たとえば、このチュートリアルでは、このディレクトリを C:\temp ディレクトリとしています。
- ファイルを圧縮解除するアプリケーションを使用して、temp ディレクトリに MarvTheMiner_120_all.zip ファイルを圧縮解除します。temp ディレクトリに MarvTheMiner ディレクトリが作成されます。このディレクトリには、次のファイルおよびサブディレクトリが含まれています。
|
ファイルまたはサブディレクトリ
|
説明
|
| src |
Marv The Miner プログラムを構成しているソースファイル |
| Res |
プログラムが使用するリソースファイル。画像だけでなく、ゲームレベルのレイアウトの定義に使用されている .map ファイルも含まれます。 |
| MarvEditor |
レベルエディタ (このチュートリアルでは取り扱いません)。 |
| Nokia.full |
ゲームの Nokia ビルド版 |
| MIDP.full |
ゲームの汎用の MIDP ビルド版 |
- Res ディレクトリを C:/temp/MarvTheMiner_120_all/src/ に移動します。これは、新しい NetBeans プロジェクトを作成した後でリソースファイルが正しい相対パスを維持するようにするための処置です。
|
NetBeans における Marv The Miner アプリケーションの開発
この節では、NetBeans IDE で新しいプロジェクトを作成し、既存のプロジェクトソースを扱うことができるようにします。
既存のソースのインポート
| プロジェクトの作成 |
最初に、NetBeans IDE で新しいプロジェクトを作成します。
- メインメニューから「ファイル」>「新規プロジェクト」を選択します。
「新規プロジェクト」ウィザードが表示されます。
- 「カテゴリ」一覧で「モバイル」を選択します。続けて、「既存の MIDP ソースからモバイルプロジェクトを作成」を選択し、「次へ」をクリックします。
- NetBeans のインストールにインストーラを使用しなかった場合は、ここで、モバイルプラットフォームをインストールするように指示するパネルが表示されます。指示に従って、必要なバージョンの Wireless Toolkit をインストールしてください。「次へ」をクリックします。
- 「インポートするソースの場所」の場合は、「ブラウズ」ボタンをクリックして、MarvTheMiner_120_all.zip ファイルを圧縮解除 したときに作成されたディレクトリの C:/temp/MarvTheMiner_120_all/src に移動します。src ディレクトリを選択して「開く」をクリックし、「次へ」をクリックします。
- 新しいプロジェクトの名前を入力します。たとえば、MarvTheMiner という名前を付けます。
- 新しいプロジェクトディレクトリを置くディレクトリを選択します。「主プロジェクトとして設定」チェックボックスが選択されていることを確認して、「完了」をクリックします。
新しいプロジェクト、MarvTheMiner が作成されて、IDE の「プロジェクト」タブに表示されます。 - MarvTheMiner のルートオブジェクトノードを展開して、プロジェクトのソースおよびリソースを表示します。「<デフォルトのパッケージ>」ノードを展開して、 Main.java をダブルクリックします。エディタにそのファイルが開きます。
|

プロジェクト構成の作成
NetBeans では、「プロジェクト構成」を使用することによってデバイス細分化の問題を解決する方法を取っています。この方法では、1 つのプロジェクトに対して作成するディストリビューション JAR/JAD ごとにプロジェクト構成を 1 つ作成します。
Main.java ファイルの内容を調べると、コメント (Nokia's FullCanvas の場合) と Class.forname() を組み合わせて複数のプラットフォームをサポートしていることが分かります。また、アプリケーションが動作する電話を記録するための vendor 変数も定義されています。この情報に基づいて、次の 5 つのグループの電話をサポートしようとしていることが理解できます。
- Nokia Series 60
- その他の Nokia
- Motorola
- Vodafone
- その他
つまり、これらのディストリビューション間の違いに対処するには、4 つの構成を作成します。
| 構成の作成 |
- 「MarvTheMiner」プロジェクトノードを右クリックして、「プロパティ」を選択します。
プロジェクトの大部分のパラメータを制御するための「プロジェクトプロパティ」ページが開きます。
- ページの一番上にある「構成を管理」ボタンをクリックします。「プロジェクト構成マネージャ」ダイアログが開きます。
- 「追加」をクリックして、
NokiaSeries60 を入力し、「了解」をクリックします。
Motorola、Vodafone、および NokiaOther に関しても、直前の手順を繰り返します。「閉じる」をクリックして、「プロジェクト構成マネージャ」ダイアログを閉じます。

これで、「プロジェクトプロパティ」ページの一番上にある「プロジェクト構成」コンボボックスには、5 つの構成が含まれています。これらの構成はこの後で使用することになりますが、ここでは IDE にエミュレータを追加してみます。
|
| IDE へのエミュレータの追加 |
コンピュータにインストールしたエミュレータプラットフォームを使ってプロジェクトを実行するには、そのエミュレータを IDE に登録しておく必要があります。
- 「プロジェクト構成」コンボボックスで「DefaultConfiguration」を選択し、「プラットフォーム」ノードを選択します。続いて、「エミュレータを管理」ボタンをクリックします。「Java プラットフォームマネージャ」ダイアログが表示されます。
このダイアログは、メインメニューから「ツール」>「Java プラットフォームマネージャ」を選択することによってアクセスすることもできます。
- 「プラットフォームを追加」をクリックして、Nokia Series 60 エミュレータがインストールされているディレクトリに移動して選択し、「次へ」をクリックします。
- エミュレータの設定が正しく検出されたことを確認して、「次へ」をクリックします。
- ここで、必要に応じてエミュレータのソースおよび Javadoc ファイルを指示することができます。必要ない場合は、単に「完了」をクリックして、プラットフォームのインストールを終了します。
マシンにインストールしていて、IDE で使用するエミュレータプラットフォームごとに上記の手順を繰り返します。 IDE が検出できるのは、UEI 規格に準拠したエミュレータだけであることに注意してください。このことは、Marv The Miner に使用されている Motorola 7.5 エミュレータは検出されないことを意味します。このチュートリアルのこの後の節では、UEI に準拠していないエミュレータを IDE で使用するための回避策を紹介します。
|
| 構成のプロジェクト設定のカスタマイズ |
どのプロジェクト構成も、「プロジェクトプロティ」ページで個別にすべてのパネルでカスタマイズを行うことができます。デフォルトでは、構成は、デフォルトの構成で定義されている設定を使用します。
- 「プロジェクトプロパティ」ページを開き、「プラットフォーム」パネルを選択します。「プロジェクト構成」コンボボックスで DefaultConfiguration が選択されていることを確認します。
- 「エミュレータプラットフォーム」コンボボックスで J2ME Wireless Toolkit 2.x を選択します。「CLDC-1.0」および「MIDP-2.0」のラジオボタンを切り替えます。
デフォルトでは、プロジェクトの構築および実行のこのエミュレータを使用します。ただし、コードはプラットフォーム固有の複数のライブラリを参照するため、これから行うことはデフォルトの設定とは異なります。
- 「プロジェクト構成」コンボボックスから NokiaSeries60 構成を選択します。
「プラットフォーム」パネルが完全にグレー表示になります。これは、現在のところ、このパネルに対して DefaultConfiguration の値を使用するようになっているためです。
- パネルの一番上にある「"DefaultConfiguration" の値を使用」チェックボックスを選択解除します。
これで、パネルのすべての要素が設定可能になります。「エミュレータプラットフォーム」コンボボックスから Series 60 MIDP Concept SKD Beta 0.3.1 Nokia プラットフォームを選択します。
構成を切り替えると、NokiaSeries60 を除くすべての構成が DefaultConfiguration で指定された値を使用するようになっていることが分かります。DefaultConfiguration の「プラットフォーム」パネルの構成の設定を変更すると、NokiaSeries60 以外のすべての構成にその変更が伝搬されます。
- 「プロジェクト構成」コンボボックスから NokiaOther 構成を選択します。「"DefaultConfiguration" の値を使用」チェックボックスを選択解除して、インストールされている他の Nokia プラットフォームの 1 つを選択します。
- Vodafone プラットフォームについても、これらの操作を繰り返します。
- すでに触れているように、Motorola 7.5 エミュレータは UEI に準拠していません。このため、IDE に組み込むことはできません。ただし、コンパイルを目的としてその API を指示することはできます。Motorla 構成を有効にして、「ライブラリおよびリソース」パネルを選択します。
- 「"DefaultConfiguration" の値を使用」チェックボックスを選択解除します。
- 「JAR/ZIP を追加」をクリックして、
{motorola install directory}\Emulator7.5\lib に移動します。Ctrl キーを使用して、各 .zip ファイルを選択し、「開く」をクリックします。
- 「了解」をクリックして、プロジェクトプロパティを終了します。これで第一段階のプロジェクト構成の作成作業は終えました。
|
| 構成ごとの専用のコードブロックの作成 |
デバイス細分化の問題を解決するための第 2 の機能は、ソースファイル内の特定のコードブロックを 1 つまたは複数の構成に固有のブロックとして指定する機能です。これは、エディタで右クリックしたときに表示されるコンテキストメニューで提供するアクション、または「編集」>「プリプロセッサブロック」メニューを使用して行います。
- Main.java を開いて、initStaticData() メソッドの内容を見てみます。このメソッドは、使用可能なデバイス固有の API を実行時に判定し、その API に従って動作します。これは、デバイス細分化の問題点をいくつか解決する非常に賢い方法です。しかしながら、他方で、ディストリビューション 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();
これで、それぞれの構成に関係する 3 つのブロックが残ったことになります。
- Motorola 固有の行を強調表示して、エディタで右クリックし、「プリプロセッサブロック」>「Motorola」を選択します。
- Vodafone のブロックについても、この操作 (「プリプロセッサブロック」>「Vodafone」) を行います。
- Nokia のコードの場合は、「プリプロセッサブロック」>「プリプロセッサブロックを管理」を選択します。
「プリプロセッサブロックを管理」ダイアログが開きます。
- NokiaOther および NokiaSeries60 の両方のオプションを選択して、「了解」をクリックします。
これで、これらのコードブロックが、プリプロセッサブロックのヘッダーおよびフッターに示されている構成に関連付けられたことになります。プロジェクトのアクティブな構成を変更すると、有効な構成がプリプロセッサブロックのヘッダーおよびフッターに含まれているかどうかに基づいてブロックをコメントインまたはコメントアウトするプリプロセッサが作動します。

- メインツールバーにあるコンボボックスを使用して、プロジェクトの有効な構成を変更します。この変更は、プロジェクトのノードを右クリックして、メインの「構築」メニューにある同じメニューから「有効なプロジェクト構成を設定」を選択し、構成を選択することによって、あるいはメインのツールバーにある「構成」コンボボックスを切り替えることによって (プロジェクトが主プロジェクトの場合) 、行うことができます。
コードブロックの強調表示機能によって、色が切り替えられて、有効または有効でないブロックが見分けられることに注意してください。また、コードブロックのヘッダー/フッター内の有効な構成名は別の色で強調表示されます。
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);
// 他のすべての Nokia
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);
}
これで、各ブロックをそれぞれ適切な構成に関連付けることができます。Nokia の振動呼び出し (vibration control call) は、Nokia の両方の構成に関連付けることを忘れないでください。
- run() メソッドにも、Vodafone 固有の呼び出しがあります。try/catch ブロックを削除して、2 行を Vodafone 構成に関連付けます。
これでおおよその作業は完了しました。最後の作業は、Nokia の FullCanvas に少し手を加えることです。
- NokiaSeries60 の構成を有効にします。
- FullCanvas 宣言で右クリックして、「If/Else ブロックを作成 (NokiaSeries60)」 を選択します。
- 最初のブロックで右クリックして、「NokiaOther」を追加します。
- 2 つ目のブロックで右クリックして、「NokiaOther」を追加します。
- 2 つ目のブロックが反転表示になります。反転表示されたブロックのクラス定義を extend Canvas に変更します。
この操作を完了すると、クラス定義が以下のようになります。
|
Marv the Miner アプリケーションの構築および実行
| アプリケーションの構築と実行 |
この時点で、すべてのすべての構成でプログラムをコンパイル、実行することができます。メインツールバーにあるアイコンをどれかクリックすると、「アクティブ」な構成の選択されたアクションが実行されます。
- メインメニューから「構築」>「主プロジェクトのすべての構成を構築」を選択します。
すべての情報が正しく設定されていると、この操作ですべての構成が構築されます。
適切な API を含むエミュレータプラットフォームにアクセスできない場合、この操作は失敗することがあります。その場合は、存在しない API を呼び出す行をすべて手動でコメントアウトします。
非 UEI エミュレータの節に説明している Motorola エミュレータを手動でインストールする手順に従わなかった場合、事前検証は失敗します。手動でエミュレータを追加することなくこの構成をコンパイルするには、Motorola API 呼び出しをすべてコメントアウトして、「ライブラリおよびリソース」パネルですべての Motorola ライブラリを削除します。
- IDE の左上の「ファイル」タブを選択して、「dist」フォルダを展開します。構築の結果、このフォルダには、DefaultConfiguration の構築を表す JAR/JAD ばかりでなく、構築に成功した各構成の JAR/JAD を含むディレクトリが含まれています。
- F5 キーを押して、現在選択している構成でプログラムを実行します。構成を切り替え、再度 F5 キーを押すことによって、同時にプログラムの複数のバージョンを実行することができます。
|
5. 構成の問題
このチュートリアルは、既存の MIDP プロジェクトを NetBeans 環境にインポートする方法を理解するのに有用な情報を提供していますが、IDE が解決するデバイス細分化の問題点のすべてを取り扱っているわけではありません。以下では、一般的な問題点と IDE におけるその解決方法を示す例をさらに紹介します。
UEI に準拠していないエミュレータプラットフォームの使用
IDE が自動的に検出できるのは、UEI 仕様に準拠したサードパーティのエミュレータプラットフォームですが、UEI に準拠していないエミュレータを使用できないわけではありません。この節では、その方法を説明します。
| UEI に準拠していないエミュレータの追加 |
- ユーザーホームディレクトリ (Windows のデフォルトは C:\Documents and Settings\{username}\.netbeans、Linux のデフォルトは /home/{username}/.netbeans) に移動して、{userhome}\config\Services\Platforms\org-netbeans-api-java-Platform ディレクトリの内容を調べます。
このディレクトリには、インストールされているエミュレータプラットフォームを定義している XML ファイルが含まれます。UEI に準拠していないどのエミュレータについても、この XML ファイルを手動で作成することができます。この XML ファイルの DTD は、http://www.netbeans.org/dtds/j2me-platformdefinition-1_0.dtd にあります。
- このチュートリアルに必要な Motorola 7.5 エミュレータを使用するには、SDK_4.1_MRI_7.5.xml というファイル名で以下のコードを保存します。" は意図的に使用されています。そのまま保存してください。
<?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 の構成を関連付けます。手動でインストールしたプラットフォームが検出されるには、{userhome}\var\cache にあるキャッシュファイルの削除が必要になることがあることに注意してください。ただし、同じフォルダに mdrstorage フォルダが存在する場合、そのフォルダは削除しないでください。
runcmd 属性に空の文字列が設定されていることに注意してください。これは、この Motorola エミュレータを起動するコマンドが、そのパラメータの 1つとして、実行する MIDlet を受け取るためです。これは UEI 規格にはないもので、IDE で直接サポートすることはできません。ただし、次のような場合もあります。
-
使用するエミュレータプラットフォームが UEI エミュレータに提供するのより多くの情報を必要としない場合、この手順は省略できます。UEI エミュレータに以下の情報が提供されます。
- セキュリティドメイン
- プラットフォームの種類
- プラットフォームのホーム
- JAD の場所
- JAD の出力先ディレクトリ /JAD 名
エミュレータが、プロジェクト JAR の場所や実行する MIDlet の名前などの追加の情報を必要とする場合は、プロジェクトのホームディレクトリにある build.xml ファイルを変更することによって、そのエミュレータを実行できます。
このファイルは、プロジェクトのすべての動作を制御します。ここで、Motorola エミュレータを実行して、Motorola の構成に対して「実行」アクションが呼び出されるたびに適切なすべての情報を渡す新しいターゲットを作成することができます。
プロジェクトの 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 ターゲット (通常のエミュレータを使用) が起動されます。
|
これで、Marv the Miner チュートリアルは終了です。