minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

Javaにはいくつかの種類があります。
通常使われているのが J2SE と呼ばれるもので、全ての基本となるクラス群が入っています。
サーブレット等で使われるのが J2EE で、これはJ2SEと併用して使います。

最後に、今回紹介する J2ME です。
携帯端末などで利用するクラス群をパッケージングしたもので、
J2SEなどと併用はせず単独で使われます。
このうち携帯電話端末からの使用を目的としたパッケージが MIDP です。
以下、このMIDPについて説明します。

MIDP

まずは開発に必要なファイルをSunからダウンロードします。
できればバイナリとソースを両方落としておきましょう。
MIDPの資料はまだ少ないので、ソースが必要になる場面も多いからです。

最初が難関

J2MEの開発でおそらく最初につまづくのがビルド作業です。
先程も話したようにJ2MEはJ2SEとは異なるパッケージなので
総合環境から簡単にビルド→実行を行うことが出来ません。

それでは、Eclipseを使った開発手順を説明します。
プラグイン等は使用しません。
以下、J2ME Wireless Toolkitをインストールしたディレクトリを $WTK と表記します。

プロジェクトの生成

普通にJavaプロジェクトを生成します。
このとき、javaファイルとは別ディレクトリにclassファイルを保存するようにします。
一般的なのはsrcとbinディレクトリに分ける方法です。
以下、このプロジェクト基準ディレクトリを $MIDLET と表記します。

最初にクラスパスの設定を行います。
プロジェクトのプロパティを開き、Java Build Path -> Libraries から
$WTK/lib/midpapi.zip をクラスパスに追加します。
または、$MIDLET/lib ディレクトリを作成してその中にzipファイルをコピーしても良いでしょう。

そして「JRE System Library」を削除します。
MIDPプロジェクトではJ2SEを使わない為です。
java.lang等の基本パッケージは前述のmidpapi.zipに入っています。

MIDletの作成

まず、メインとなるクラスを一つ作ります。
これは MIDlet のサブクラスにする必要があります。
$WTK/apps/demos/src/example 以下にサンプルが用意されていますので
これを参照しましょう。

ビルド

ここではビルド作業にスクリプトを使うことにします。
もちろんEclipseのプラグインにすればもっと便利なのですが。

preverify

Eclipse等は、Javaソースを作成すれば自動的にclassファイルを作成してくれますが
この形式では端末上で動かすことが出来ません。
preverifyという作業を行ってこのclassファイルを変換する必要があります。

$WTK/bin ディレクトリにある preverify.exe を使います。
$MIDLET ディレクトリに移動して以下のコマンドを実行します。

$WTK/bin/preverify -classpath "$WTK/lib/midpapi.zip;bin" クラス名...

クラスパスには midpapi.zip と
Eclipseが生成したclassファイルが格納されたディレクトリ(ここではbin)を指定します。
面倒なのがクラス名です。ここでは、作成した全てのJavaクラスを記述しなければなりません。
手書きだと大変ですので、スクリプトにより自動生成しましょう。
このとき、各クラス名はシングルクォーテーションで囲みます。
区切り文字は半角スペースにします。

これにより、$MIDLET/binディレクトリにあるclassファイルが変換されて
$MIDLET/outputディレクトリに格納されます。
別のディレクトリに格納したければpreverifyの引数に

-d ディレクトリ名

を追加します。デフォルトでは output になっています。

jar化

preverifyされたclassファイル群をjarにまとめます。

jar cvfm midlet.jar MANIFEFT.MF -C output .

MANIFEST.MF は予め用意しておきます。

jadファイルの更新

最後に、jadファイルを作成します。
jadファイルにはjarファイルのサイズを記述しなければならないので
ビルド毎に作成(もしくは更新)する必要があるのです。
これも手動でやっていたら面倒この上ないので自動で処理してしまいましょう。

実行

jarファイルとjadファイルが完成したら、これをエミュレータ上で実行します。
$WTK/bin/emulator.exe を使います。

$WTK/bin/emulator -classpath midlet.jar -Xdescriptor:midlet.jad

jarファイルとjadファイルを相対パスもしくはフルパスで指定します。

デバッグ

デバッグを行うときは、以下のようにします(実際には1行で打ち込んで下さい)。

$WTK/bin/emulator -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y
         -classpath midlet.jar -Xdescriptor:midlet.jad

次に、Eclipseのメニューから Run -> Debug... を選びます。
Remote Java Application を選択、New を押します。
MIDletプロジェクトを選択して、ポート番号を指定したら Debug を押します。
これで、先程起動していたエミュレータに接続されます。
あとは通常のデバッグと同じようにブレークポイント等を設定して作業を進めて下さい。

ここで一つ、重要な注意点があります。
エミュレータのバグなのか、このデバッグ作業がたまに失敗します。
具体的には、Eclipseでデバッグを開始するとエミュレータが強制終了してしまう場合があります。
標準出力に"ALERT: Attempting to resume current thread"というメッセージが出たらそれです。
そこで僕が考案した「強制終了しないコツ」をいくつか紹介します。

エミュレータを起動してすぐにデバッガを起動しない

冗談ではなくマジです(笑)。

エミュレータを一度画面に表示させてからデバッガを起動する

エミュレータを起動させた後フォーカスを切り替えると、
最初からバックグラウンド状態でエミュレータが起動します。
この状態でデバッガを起動すると失敗することが多いように思えます。

というわけで、手順としては

  1. エミュレータを起動させ、画面に表示されるまで待つ。

  1. Eclipseからデバッガを起動させる。

これで、デバッガが正常に起動する確立が少しは上がると思います。
っていうか本当はこんな事したくは無いんですが・・・落ちるよりはマシでしょう。