携帯で動く MIDP プログラムの書き方


携帯で動く Java2ME MIDP でのプログラムの書き方についてです。
以下は、Doja2.x、JSCL1.1、EzPlus1.0 の頃の記述ですので、ご注意ください。

MIDP / サンプル / マニュアル / コンパイル / 注意点 / MIDlet / UI / ちょっとサンプル / ネット実行 / EA1との違い / Wireless Toolkit / 参考 / 戻る / トップページ


Java2 Micro Edition MIDP

携帯電話で動く Java2 Micro Edition CLDC MIDP 1.0 正式版が Mobile Information Device Profile (MIDP) からダウンロードできます。 Sun Download Center を使用するため、登録する必要があります (無料)。 Windows 版と Solaris 版 (携帯のエミュレーターと開発環境) があります。 また、開発には Java2 SDK Standard Edition も必要です。
 
Java2 Micro Edition (Java2ME) とは組みこみ機器向けの Java2 のエディションで、 一般的な Java2 である Standard Edition のサブセットです。
 
CLDC とは Connected, Limited Device Configuration の略で、 Micro Edition のクラス構成 (Standard Edition のどれだけをサブセット化するか) を表します。 CLDC は KVM (Kirobyte Virtual Machine, キロバイト単位のメモリで動作する 組みこみ機器用の VM) を使います。
 
さらに用途向けの用意された特殊な API (Profile と呼びます) が用意されており、 Mobile Information Device Profile (MIDP) が携帯向けの Profile です。 i-mode の携帯電話は i モード対応 Java プロファイル (i モード対応 Java プロファイルについては別ページ i-mode で動く Java プログラムの書き方 をお読みください) を使用します。
 
J-Phone, au ではさらに独自の拡張 API が付加されます。 J-PHONE Developer Program で J-Phone の独自拡張 API (JSCL) の仕様が公開されています。 ゲームを作ろう(ezplus) で au (ezplus) の独自拡張 API (KDDI-P) の仕様が公開されています。

サンプルの実行

MIDP の readme は HTML で書かれていたり、 サンプルは makefile を使って実行するようになっていたりと ちょっと変わっています。
 
まずは HelloMIDlet を実行してみましょう。 classes フォルダに移動して
    ..\bin\midp HelloMIDlet
として実行します。 携帯エミュレーターが起動します (右図)。
 
サンプルの実行は makefile を使います。 例えば gnumake の場合、
    gnumake run
としてサンプルを実行させます (未確認)。 makefile は build\win32 の下にあります (Solaris では build/solaris)。
 
Windows ユーザーで make を使っていない方はダウンロードすれば良いのですが、 MIDP をインストールしたフォルダに移動して次のようにしても実行できます。
    bin\midp -classpath classes -descriptor src\example\run.jad
サンプルは携帯電話のエミュレーター上で実行されます。 特別な指定をしないと、4 階調モノクロ表示になります。 256 階調カラー表示にしたいときはサンプル実行前に
    set SCREEN_DEPTH=8
とします。

API マニュアル

MIDP 1.0 正式版には API マニュアルが提供されていません。 しかし、Java2 Micro Edition Wireless Toolkit の doc\api フォルダ以下に API マニュアルが含まれています。 Wireless Toolkit についての詳細は 後述 します。
 
ソースファイルが公開されているので、 JavaDoc を使って作ることもできます。 src\share\classes フォルダに移動して
    javadoc -d 出力ファイルの転送先
        java.lang java.util
        javax.microedition.io javax.microedition.lcdui
        javax.microedition.midlet javax.microedition.rms
とします (実際には 1 行で記述)。
 
これで一応使えますが、 一部使えるはずのクラスがマニュアルに含まれていません。 これはダウンロードしてきた MIDP に含まれているソースファイルは CLDC に追加された MIDP のクラスのみであるためです。 CLDC のクラスもマニュアル化するためには二つの方法が考えられます。
 
一つ目の方法は CLDC and the K Virtual Machine (KVM) のページにある "Japanese documentation for the J2ME CLDC" をダウンロードする方法です。 このファイルには日本語で記述された CLDC の仕様や API マニュアルが含まれています。 このファイルの中にある CLDCAPI.html.zip を解凍すれば使えます。 日本語で書かれているので、英語が苦手な方はこの方法が良いでしょう。 しかし、MIDP のマニュアルと別々になってしまい、 一方は英語で一方は日本語で使いにくいかもしれません。
 
もう一つの方法は Java 2 Platform Micro Edition CLDC - Sun Community Source Licensing のページから CLDC のソースファイルをダウンロードし、 その CLDC のソースファイルと MIDP のソースファイルを併せて JavaDoc でマニュアルを生成する方法です。 やや面倒ですが、英語のみの一つのマニュアルでまとめられます。 まず作業用のフォルダを用意して、 そこに CLDC のソースファイル (解凍先の j2me_cldc\api\src フォルダ以下) をコピーします。 次に MIDP のソースファイル (src\share\classes フォルダ以下) を作業用フォルダに上書きコピーします。 作業用フォルダに移動して
    javadoc -d 出力ファイルの転送先
        java.lang java.io java.util
        javax.microedition.io javax.microedition.lcdui
        javax.microedition.midlet javax.microedition.rms
とします (実際には 1 行で記述)。 必要に応じて -locale en_US -windowtitle "Java2 SE CLDC MIDP" などのオプションを追加すると良いと思います (-d オプションよりも前に書く必要があります)。
 
Java2ME MIDP はその API マニュアルに表記されている API のみが使えます。
 
Micro Edition CLDC なので、 普段使われている Standard Edition にあるクラスが使えるとは限りません。 具体的には java パッケージでは java.io, java.lang, java.util のみが存在し、 各パッケージの中にあるクラスやそのメソッドも数が減っています。
 
他に、組みこみ機器用の特殊な API が追加されており、 javax.microedition.lcdui, javax.microedition.rms, javax.microedition.midlet, javax.microedition.io の 4 パッケージがあります。

コンパイル方法

コンパイルは Java2 SDK Standard Edition の javac コマンドを使います。 ブートストラップクラスファイルの位置を MIDP のクラスファイル (MIDPルート\classes) に置き換えるのを忘れないで下さい。
    javac -bootclasspath MIDPルート\classes ソースファイル名
そして、その次にプリベリファイを行う必要があります。 ベリファイとは間違った・悪意のあるバイトコードをチェックすることで、 Java の安全性を高めるための機構です。 通常 (パソコン用など) の VM ではプログラムの実行時に行っていますが、 処理能力が限られている携帯などの機器ではその処理も かなりの負担となってしまいます。 そこで、事前にベリファイを行ってクラスファイルに その情報を書き込むプリベリファイが用意されているのです。
 
プリベリファイは preverify.exe コマンドを使います。 build\win32\tools フォルダの下 (Solaris では build/solaris/tools) にありますので、パスを通しておきましょう。
    preverify -classpath .;MIDPルート\classes -d . クラスファイル名
クラスファイル名には .class をつけては駄目なようです。
 
プログラムの実行には midp.exe を使います。 これは bin フォルダの下にありますので、同じくパスを通しておきましょう。
    midp クラスファイル名

MIDP プログラムでの注意点

MIDP でプログラムする場合、 通常の Java2 とは異なる点があるので注意しましょう。
 
まず、浮動小数点 (float, double 型) は使えません。 当然、API のクラスにも float, double 型を扱うメソッド (Math.sin(double a) など) はありません。
 
次に SecurityManager クラスがありません。 つまり、セキュリティーによる制限がないようです。 しかし、SecurityException クラスは用意されているので、 なんらかの形でセキュリティーによる制限がかけられるのかもしれません。

MIDlet

MIDP のプログラムでは Applet ならぬ MIDlet というものを使います。 Applet 同様に MIDlet クラスを継承して使います。
 
また、MIDP には awt はなく、 その代わりの UI (ユーザーインターフェース) として javax.microedition.lcdui パッケージが用意されています。 ただし、MIDlet は Applet とは異なり UI ではない (Component クラスのサブクラスのような形にはなっていない) 点に注意してください。
 
MIDlet クラスを継承したら少なくとも、
    public void startApp();
    public void pauseApp();
    public void destroyApp(boolean unconditional);
の 3 つのメソッドをオーバーライドする必要があります。 それぞれのメソッドはそれぞれ MIDlet が起動した時、一次中断した時、終了した時 に呼ばれます。

ユーザーインターフェース

繰り返しになりますが、MIDP には awt はなく、 その代わりに javax.microedition.lcdui パッケージを使います。 awt ではないため、peer 確定問題に悩まされない点はなかなか便利です。
 
i-mode などを使ったことのある人は既にご存知かと思いますが、 携帯で Web を表示してそのフォーム (テキストエリアなど) を選択すると、 画面いっぱいにそのフォームの編集画面が開くようになっています。 MIDP でもそのようなことができるようになっています。
 
画面そのものを Display オブジェクト、 表示される内容は Displayable オブジェクトで表現されます。
    Display display=Display.getDisplay(midlet);
まず、このように Display クラスの static メソッド getDisplay(MIDlet c) に MIDlet オブジェクトを渡して Display オブジェクトを得ます。
 
画面に表示する内容を Displayable クラスのサブクラスから選び、 そのオブジェクトを Display オブジェクトに設定します。
    Displayable text=new TextBox("Hello MIDP","Test string",256,0);
    display.setCurrent(text);
Displayable クラスのサブクラスとして、 Canvas クラスと Screen クラスがあります。 Canvas クラスは awt の Canvas クラスと使い方は似ていますが、 ゲーム用のデバイスの使用も想定して設計されています。 Screen クラスはさらにサブクラス化されていて、 先ほど説明した画面いっぱいに開くフォーム編集画面を表しています。
 
Screen クラスのサブクラスに Form クラスがあります。 このクラスはちょっと特別で、携帯で Web を表示している画面に相当します。 Form オブジェクトに画像 (Image オブジェクト) や 文字 (String オブジェクト)、フォーム (Item オブジェクト) を 次々と追加することで並べていきます。
 
また、Displayable クラスにはメニューボタンに対応する Command オブジェクトと その Listener である CommandListener オブジェクトが 設定できるようになっています。 その Displayable オブジェクトが表示されている時にメニューが表示されます。
    Command exit=new Command("Exit",Command.SCREEN,2);
    text.addCommand(exit);
    text.setCommandListener(listener);		// addCommandListener ではない点に注意

ちょっとしたサンプルプログラム

ほとんど世の中に参考となるプログラムがないので、 たいしたものはありませんが 私が実験に使ったプログラムを公開しておきます。 なお、これらは Early Access 1 用なので、 正式版では一部改変する必要があるものもあります。
 
Hello.java
画面に Hello MIDP を表示します。
 
FormTest.java
フォームを配置します。
 
FloatTest.java
浮動小数点が本当に使えないか実験。 やっぱりエラーが出て実行できません。
 
CanvasTest.java, DoubleBufferedCanvas.java
Canvas クラスを使って画面の真ん中に画像を表示します。
 
TimerTest.java, TimerTestTask.java DoubleBufferedCanvas.java
Timer クラスのテストです。
 
ScrollTest.java, ScrollTestTask.java DoubleBufferedCanvas.java
画像をスクロールさせます。
 
fire.zip
炎をアニメーション表示させます。正式版用。

ネットワーク越しの実行

MIDP エミュレーターは実際に携帯電話で行うように ネットワークからダウンロードして実行することもできます。
 
例えば、次のようにアドレスを指定して実行します (jar ファイルについては後述)。
    midp -transient http://www.antun.net/tips/mobile/sample/tunnel.jad
なお、この例は実際に試すことができます (その際は set SCREEN_DEPTH=8 をお忘れなく)。
 
また、同じく携帯電話で行うように ネットワークからダウンロード・インストールして実行することもできます。 インストールの仕方は
    midp -install http://www.antun.net/tips/mobile/sample/fire.jad
とアドレスを指定します。 一度インストールしてしまえばネットワークを切っても実行できます。 実行の仕方は
    midp -run Tunnel
とインストールしたプログラムの名前を指定します。
 
アンインストールは
    midp -remove Tunnel
です。 現在インストールしている MIDlet を
    midp -list
で確認することもできます。
 
自分でダウンロード可能な MIDlet を作るには jad ファイルを用意します。 jad ファイルとは MIDlet の内容を記述するテキストで書かれたファイルです。 携帯電話は初めにこの小さなファイルをダウンロードして、 これからダウンロードしようとしている MIDlet の情報を知り、 実行可能かどうか (MIDP のバージョンやファイルサイズなど) をチェックするために使います。
 
jad ファイルの書き方はマニュアルの何処にも書かれていないため、 MIDP 付属のサンプルや 私の書いた jad ファイル などを参考に自分なりに書き直してみてください。
 
自作の MIDlet とその関連ファイル (画像ファイルなど) とその jad ファイルを一つの jar ファイルに圧縮します。
    jar cvmf jadファイル名 jarファイル名 *.class *.png
その jar ファイルと jad ファイルをネットワーク上に アップロードすれば準備完了です。 jar ファイルのアップロード先は jad ファイルで記述した位置です。 jar ファイルの中にある jad ファイルと アップロードした jad ファイルは全く同一のものにする必要があります。

EA1との違い

Early Access 1 と正式版の API の違いについて列挙します。
 
Displayable クラスの setListener メソッドは setCommandListener に名前が変更になりました。
 
Image オブジェクトを読み込む Image#createImage() クラスメソッド が例外 java.io.IOException を投げるようになりました。
 
Image#createImage() クラスメソッドで読み込める画像形式が PNG ファイルになりました。

Java2 Micro Edition Wireless Toolkit

Java2 Micro Edition Wireless Toolkit とは Java2 Micro Edition の開発補助ツールで、 現在は Windows 版 (Windows98 のみ正式対応、 WindowsNT, Windows2000 でも動作しますが、サポート対象外です) のみが提供されています。
 
MIDP 専用のものではないのですが、 主に MIDP で使用されることを想定しているようです。 MIDP の API マニュアルがこれに含まれていますので、利用しましょう。
 
ファイルのコンパイルから jar 圧縮、jad ファイルの編集、 エミュレーター上での実行をボタン一つでできるようになっている シンプルなつくりです。
 
エミュレーターとして、白黒とカラーの携帯電話 (MIDP 付属のエミュレーター)、 画面が小さ目の携帯電話、ページャーが用意されており、 簡単に切り替えられます。 なお、白黒とカラーの携帯電話は MIDP 付属のエミュレーターより ちょっとだけ新しいようです (マウスカーソルの置かれたボタンが反転表示されることから)。

参考ページ

MIDP のプログラムで参考になるホームページのリンクを挙げておきます。
 
SINSEN
MIDP のサンプルの実行から イメージ描画やファイル保存の使い方まで書かれています。 特に EzPlus について詳しいです。
 
Mobile Information Device Profile (MIDP) (英語)
Java2 Micro Edition CLDC MIDP の正式ページです。 MIDP がここからダウンロードできます。
 
CLDC and the K Virtual Machine (KVM) (英語)
Java2 Micro Edition CLDC の正式ページです。 CLDC がここからダウンロードできますが、 MIDP の開発に必ずしも必要ではありません。
 
Java(TM) 2 Platform Micro Edition Wireless Toolkit (英語)
Java2 Micro Edition Wireless Toolkit の正式ページです。
 
Articles Wireless (英語)
Sun Microsystems, Inc. が提供している MIDP の解説記事です。 インストールから簡単なコーディング、 コンパイルと実行まで書かれています。
 
Java Community Process - JSRs Java Specification Requests - Detail (英語)
MIDP の次期バージョンの仕様検討案があります。

戻る