具体例
MyGameというゲームを、MIDP1、MIDP2、MIDP1 NokiaUI、MIDP1 Motorolaのデバイスに移植するものとします
移植手順の概要は次のとおりです。
- AntおよびAntennaをダウンロードし、インストールします。
- サウンドのためのクラスを作成します。このクラスに各デバイスのサウンドを再生するためのコードを入れます。
- 各デバイスモデル(MIDP1、MIDP2、MIDP1 NokiaUI、MIDP1 Motorola)の一連のAntenna XMLファイルを作成します。これらのファイルは次のことを行います。
- ソースファイルをプリプロセスし、現在のデバイスに関係する行だけを残します。
- ソースファイルをコンパイルし、クラスを事前に検証して、プロジェクトをビルドします。
- 移植したミッドレットをテストのためにエミュレータで実行します。
SoundManagerクラスの作成
SoundManagerクラスには、基本的なサウンドを再生し、バックライトを設定するための命令が含まれます。このクラスは次の汎用デバイスをサポートします。
- MIDP1
- MIDP2
//#ifdef MIDP2と//#endifの間のコード行が選択されます。- MIDP1 NokiaUIこのデバイスはサウンドとバックライトをサポートしているので、
//#ifdef NOKIAUIと//#endifの間のコード行が選択されます。
- MIDP1 Motorolaこのデバイスはバックライトだけをサポートしているので、サウンドを再生するためのメソッドは空になります。
リスト1にコードを示します。
//#ifdef MIDP2 import javax.microedition.media.*; import javax.microedition.media.control.*; import javax.microedition.media.control.ToneControl; //#endif //#ifdef NOKIAUI import com.nokia.mid.sound.*; import com.nokia.mid.ui.*; //#endif //#ifdef MOTOROLA import com.motorola.multimedia.*; //#endif import javax.microedition.lcdui.*; import java.io.*; public class SoundManager { Display display; public SoundManager(Display display) { this.display = display; } public void doLight() { //#ifdef MIDP2 display.flashBacklight (duration); //#endif //#ifdef NOKIAUI try { DeviceControl.setLights (0,100); } catch (Exception exception) { } //#endif //#ifdef MOTOROLA try { Lighting.backlightOn(); } catch (Exception exception) { } //#endif } public void doSound() { //#ifdef MIDP2 try { InputStream is = getClass().getResourceAsStream("music.mid"); Player audioPlayer = Manager.createPlayer(is, "audio/midi"); audioPlayer.start(); } catch (IOException ioe) { } //#endif //#ifdef NOKIAUI Sound sound = new Sound (1000, 100); sound.play(1); //#endif } }
「BUILD.XML」ファイルの作成
「BUILD.XML」ファイルの中で適切なディレクトリを選択します。これは手作業になるので、デバイスごとにXMLファイルを作成し、それらを保持しておくことが望ましいでしょう。
MIDP2プロファイルの場合は、「SoundManager.java」ファイルのプリプロセスによって次の出力が生成されます。
import javax.microedition.media.*; import javax.microedition.media.control.*; import javax.microedition.media.control.ToneControl; import javax.microedition.lcdui.*; import java.io.*; public class SoundManager { Display display; public SoundManager(Display display) { this.display = display; } public void doLight() { display.flashBacklight (duration); } public void doSound() { try { InputStream is = getClass().getResourceAsStream("music.mid"); Player audioPlayer = Manager.createPlayer(is, "audio/midi"); audioPlayer.start(); } catch (IOException ioe) { } } }
MIDP1プロファイルの場合は、次の出力が生成されます。
import javax.microedition.lcdui.*; import java.io.*; public class SoundManager { Display display; public SoundManager(Display display) { this.display = display; } public void doLight() { } public void doSound() { } }
デバイスのプロファイルは次の行で選択します。
<wtkpreprocess srcdir="src" destdir="output\src"
symbols="MIDP2" verbose="false"/>
Antennaは属性シンボルの内容を取り(この例ではMIDP2)、次のように各ファイルの先頭に//#define MIDP2を挿入します。
//#define MIDP2 //#ifdef MIDP2 import javax.microedition.media.*; import javax.microedition.media.control.*; import javax.microedition.media.control.ToneControl; //#endif //#ifdef NOKIAUI import com.nokia.mid.sound.*; import com.nokia.mid.ui.*; //#endif //#ifdef MOTOROLA import com.motorola.multimedia.*; //#endif import javax.microedition.lcdui.*; import java.io.*;
プリプロセスされたソースコードのビルド
次にプリプロセスされたソースコードをビルドします。つまり、作成した2つのファイルをコンパイルするわけです。
.jadファイルの名前とその内容をタグの中で指定します。
<wtkjad jadfile="output\bin\${midlet.name}.jad" jarfile="output\bin\${midlet.name}.jar" name="${midlet.name}" vendor="You" version="1.0" target=""> <midlet name="${midlet.name}" icon="/icon.png" class="game.${midlet.name}"/> <attribute name="MIDlet-Icon" value="/icon.png"/> </wtkjad>
アイコンに対して常に同じ名前を使用するようお勧めします(例:icon.png)。
ミッドレットをパッケージ化するには、.jarファイルを作成します。.jadファイルに統合するリソースを選択してください。このプロセスの簡単なガイドラインを以下に示します。
- グラフィックスを画面のタイプごとに分けます(大きな画面、中程度の画面、小さな画面など)。
- アイコンをサイズごとにサブディレクトリに分けます(res_icon32x32、res_icon16x16など)。
- サウンドのリソースを分けます(res_midifiles、res_ottfilesなど)。
次の表2では、右側の欄がコードで、左側の欄がその説明になっています。
「RUN.XML」ファイルの作成
エミュレータを実行するためには、XMLファイルを作成する必要があります。エミュレータはWTKのディレクトリ「wtklib\devices」にインストールします。WTKに表示されるデバイス名を使用し(デバイスのディレクトリ名)、それを属性デバイスの次の行で指定してください。
<wtkrun jadfile="output\bin\${midlet.name}.jad"
device="DefaultColorPhone"/>
次の表3では、右側の欄が「RUN.XML」ファイルのコードで、左側の欄がその説明になっています。
この例では、いくつかのデバイスについて基本的なサウンドとバックライトをサポートしています。しかし、実際には、その他の機能(キーボード定数、全画面サポート、画面リフレッシュループ、フレームレートの調整、イメージとサウンドの形式など)もサポートする必要があるでしょう。
完全なプロダクションチェーンへの取り組み
デプロイメントとテストが非常に重要であることを忘れないでください。デバイスモデルごとに細かな手作業を繰り返さなければならないので、モバイル開発は単調で退屈な作業になりがちです。.jadファイルや.jarの名前をいちいち変更したり、各.jadファイルの内容を修正するといった作業を想像してみてください。あるいは、テストのためのテストWAPサーバへのアップロードが手作業で、300とか400のデバイスについてFTPクライアントを使用しなければならないとしたらどうなると思いますか。
オプションのAPI(Bluetooth、3D、ファイル接続、SMS、MMSなど)とオプションのAPIパーツ(カメラサポート、オーディオ記録、.jpegなど)をすべて考慮に入れることが望ましいでしょう。デバイスの中により強力な機能を提供できるものがある場合には、すべてのデバイスについて同じアプリケーションを生成し続けるのは避けてください。
移植は基礎的な問題ですが、最適化され充実したモバイルアプリケーションを生成するうえで大きな障害とはなりません。結局のところ、完全に共通利用できるモバイルアプリケーションは、モバイルデバイスの構造のせいで不可能です。ますます複雑になるソフトウェアを埋め込むというのが世の趨勢であり、従って常に実装で問題が生じることになるのです。


