Java ME デバイス多様性の問題の解決
「write once, run anywhere」の原理は、Java プログラミング言語の普及に貢献しましたが、Java Micro Edition (Java ME) にはうまく当てはまりません。画面サイズ、発色数、メモリー容量などの機能はデバイスによって大きく異なります。プロファイル、構成、および J2ME API にまで及ぶと、デバイスの多様性と呼ばれる現象が生じます。このチュートリアルでは、IDE の組み込み機能を使用して Java ME の MIDP デバイス多様性の問題に対処する方法を示します。
目次
要件
このチュートリアルに必要なソフトウェア
開始する前に、コンピュータに次のソフトウェアをインストールしておく必要があります。
- Java Standard Development Kit (JDK) version 5.0 または 6.0 (ダウンロード)
- NetBeans IDE 6.0 と Mobility Pack (ダウンロード)
注: このプロジェクトは、Mobility Pack に含まれる Sun Java Wireless Toolkit エミュレータを使用して配備できます。このチュートリアルで説明している基本概念を確認するためにほかに必要なソフトウェアはありません。ただし、ほかのプラットフォームに配備する必要がある場合は、対象とするデバイスのエミュレータをダウンロードすることをお勧めします。一般的な CLDC/MIDP デバイスプラットフォームは次のとおりです。
- Nokia Series 40 SDKs for Symbian OS ( ダウンロード)
- Nokia Series 60 SDKs for Symbian OS ( ダウンロード)
- Sony Ericsson SDK 2.2.4 for the Java ME プラットフォーム ( ダウンロード)
- Motorola Java ME SDK v6.4 for Motorola OS Products ( ダウンロード)
NetBeans Mobility Pack または Java ME による開発をはじめて行う場合は、このチュートリアルを続ける前に NetBeans 6.0 CLDC/MIDP 開発のクイックスタートガイドをご覧ください。このガイドには、プラットフォームエミュレータの追加と登録に関する節があります。
アプリケーションの設定
この例では、ボールショットという簡単なゲームを使用し、デバイスのアビリティーを対象としてデバイス多様性の問題を解決する方法を示します。
- BallShotGame.zip プロジェクトをダウンロードします。
- プロジェクトを展開し、その内容を IDE の
project_home ディレクトリに置きます。
IDE への Mobility プロジェクトのインポートの詳細については、NetBeans IDE 5.5 への既存の Java ME MIDP/CLDC ソースコードのインポートを参照してください。
カスタム構成の作成
デバイス多様性の問題を解決するために、NetBeans でプロジェクト構成を使用する方法があります。これにより、1 つのソースコードを作成し、それを対象の各モバイルデバイスに合わせてカスタマイズすることができます。エミュレータプラットフォームとターゲットデバイスが、作成するプロジェクト構成に対応するように、各構成の適合性を保つ必要があります。次の例では、Nokia Series 40 がターゲット構成です。

プロジェクト構成の作成
- 「ファイル」>「プロジェクトを開く」(Ctrl-Shift-O) を選択します。展開し、インストールした SingleCotopiaGameBallShot プロジェクトフォルダを探します。
- SingleCotopiaGameBallShot プロジェクトのノードを右クリックし、「プロパティー」を選択します。
- ページ上部の「構成を管理」ボタンをクリックします。「構成を管理」ダイアログが開きます。
- 「追加」をクリックし、構成の名前を入力して「了解」をクリックします。
- 配備するほかのエミュレータについて同じ手順を繰り返します。
アビリティーの作成
アビリティーとは、画面サイズ、発色数、API のサポート、およびオーディオサポートなどのデバイス属性のことです。プロジェクト内にアビリティーを作成すると、特定の属性または一連の属性をサポートする 1 つまたは複数のプロジェクト構成に関連付けることができます。あとで構成を変更、削除、または追加する必要が生じた場合は、構成をアビリティーに関連付けるだけで変更を実装できます。それにより、構成は、アビリティーに関連付けられているすべてのコードブロックに自動的に関連付けられます。
- SingleCotopiaGameBallShot プロジェクトのノードを右クリックし、「プロパティー」を選択します。
- 「カテゴリ」メニューツリーから「アビリティー」ページを選択します。
- 「プロジェクト構成」ドロップダウンメニューから、定義するアビリティーを関連付ける構成を選択します。
- 必要な場合は、「
"デフォルト構成" の値を利用」チェックボックスの選択を解除します。
- 「追加」ボタンをクリックします。
- 「新規アビリティー」ダイアログで、
screen などのアビリティー名を入力するか、screen アビリティーが既存する場合は編集ボタンをクリックします。
- アビリティーの値を入力します。この例では 240x320 と入力します。発色数やオーディオのサポートなど、ほかの変数を対象に、さらにアビリティーを構成できます。「了解」をクリックして、「アビリティーの追加」ダイアログを閉じます。これで、アビリティーが選択したプロジェクト構成に関連付けられました。

アビリティーをほかの構成に関連付けるには、「プロジェクト構成」メニューから別の構成を選択し、「追加」ボタンをクリックします。
プロセッサブロックを使用した構成固有のコードの追加
プリプロセッサブロックを使用して、1 つ以上のプロジェクト構成またはアビリティーに固有のコードを作成、管理、および追跡できます。コードは、指定した構成またはアビリティーに関してのみ有効 (または無効) になります。モバイルデバイスで実際にもっとも操作する必要がある属性は画面サイズです。画面サイズ、発色数、API のサポート、およびその他の機能については、Jbenchmark のサイトで詳しく説明しています。
- BallShotImageCreator.java の「エディタ」ウィンドウで、BallShotImageCreator をインスタンス化しているソースコード行を右クリックします (public BallShotImageCreator() { 。
- 行を右クリックし、「プリプロセッサブロック」>「If / Else ブロックを作成」を選択します。「使用可能な項目」ボックスを下にスクロールし、以前に定義したアビリティー
screen を選択します。
- 行
//#if screen に「== "240x320"」と追加します。
//#if プリプロセッサ指示があるコードは、有効な構成がディレクティブの値に一致したときに配備されます。//#else プリプロセッサ指示で囲まれたコードは、有効な構成がプリプロセッサの値に一致しないときに使用されます。つまり、有効なプラットフォームのアビリティーが 240x320 の場合にエミュレータで 22 ピクセルのボールが表示されます。//#endif プリプロセッサ指示がプリプロセッサブロックの終わりです。いくつかの一般的な画面サイズを対象にこのゲームのコードを記述した例を示します。
//#if screen == "128x128"
//# ballWidth = 10;
//#elif screen == "176x182"
//# ballWidth = 16;
//#elif screen == "176x208"
//# ballWidth = 16;
//#elif screen == "240x320"
ballWidth = 22;
//#endif
エミュレータでのボールショットゲームの実行
- 「実行」>「主プロジェクトを実行」を選択します。
- エミュレータが起動したら、次のメニューが表示されます。

- エミュレータのメインボタンをクリックし、ゲームを開始します。エミュレータに次の画面が表示されます。比較のために、プリプロセッサ指示を指定しなかった場合の画面も示します。この場合、エミュレータの画面に対して画像が小さすぎます。

まとめ
このチュートリアルでは、Mobility Pack を使用してモバイルデバイスの属性を対象とし、デバイス多様性の問題を回避する方法を示しました。このとき、カスタム構成と、デバイスのアビリティーを対象とするプリプロセッサコードを使用しました。残念ながら、この方法でデバイス多様性の問題をすべて解決することはできませんが、これらの例は、モバイルデバイスの開発を行うときに、問題の影響を軽減する方法があることを示しています。