|
短期集中連載 大和哲の iアプリプログラミングをしよう |
サンプルプログラムIgBench.classをi-JADEで実行する。さすがにPCはCPUパワーがあり、ベンチマークテストも一瞬で終わってしまう |
この辺は一度わかってしまえば、実際のプログラミングの際にはBATファイルなりを組んで「お約束」ということにしてしまうのが楽だろう。
■ iモード用プログラムの書き方
続いてはプログラムの本体。Javaのソースコードの書き方だ。
Javaといえば、アマチュアプログラマでも、Webページに貼りつける「Javaアプレット」を作ったことがある方は多いのではないだろうか。使用するライブラリはあれとは違ってしまうものの、iアプリの考え方はJavaアプレットの作り方と近いものがある。一度、Javaアプレットを作ったことのある方であれば、個々のクラスやメソッド名さえわかってしまえば、HelloWorldくらいなら、簡単に作ってしまえるはずだ。
アプレットと違うことといえば、使用するクラス、メソッド名が違うことである。ただし、考え方自体はjavaプログラミングではおなじみのパターンだ。
Javaアプレットを作成する際にはAppletクラスを継承してアプレットを作ったが、iアプリの場合は、「com.nttdocomo.ui.IApplication」というiモード用に作られたクラスを継承して作る。このクラスは、
public void start();
メソッドがプログラム起動時に呼ばれるので、このメソッドをオーバーライドする必要がある。
また、iアプリケーションを終了させる時には、IApplication オブジェクトのterminate( )メソッドを呼び出す(System.exit( )を使用してはいけない)。
ほかの必須の個所としては、画面描画があるが、iアプリのそれは、ライブラリがあらかたを処理してくれる高レベルAPIと、全てを自分で処理する必要のある低レベルAPIの両方が用意されている。
高レベルAPIでは、リスト、ボタンやラベルなどのコンポーネントをPanelと呼ばれるオブジェクトに貼りつけて利用することで、たとえば、リストが選択されて、リストの一覧を表示するなどの処理はiモードが勝手にやってくれるので、便利だ。このタイプのプログラムにする場合は、
-------------------
public class PanelSkel extends IApplication {
private MyPanel panel;
public void start() {
panel = new MyPanel(this);
Display.setCurrent(panel);
}
}
class MyPanel extends Panel implements …… {
・
・
}
-------------------
のように、書くことになる。
PanelオブジェクトではComponentクラスのサブクラスのオブジェクトをadd(Component c)メソッドで追加していくことで、画面を構成する。Panelを使う場合は、イベントはPanelオブジェクトに通知され、Panelオブジェクトに登録されているリスナーへと通知されるので、それを処理する。
また、低レベルAPIはCanvasクラスといって、これはオブジェクトに自分で点や線、イメージなどで自分で全てを描画し、電話機のボタンが押された場合もiアプリ側で処理する。一ドット単位で自分で描くものを決めたいとき、ゲームなどを作るときにはこちらを使うことになるだろう。
こちらは、
--------------------
public class CanvasSkel extends IApplication
{
private MyCanvas canvas;
public void start(){
canvas=new MyCanvas(this);
Display.setCurrent(canvas);
}
}
//-- IgBenchCanvasクラス
class MyCanvas extends Canvas implements …… {
・
・
}
-------------------
というように書く。
画面への描画はpaint( )メソッド内で、paintメソッドの引数であるGraphicsオブジェクトのメソッド(たとえばGraphics gとすると、g.drawStringやg.fillRectなど)で行なう。
PanelクラスとCanvasクラスの違い。ウィンドウ上にボタン…など、定型的なインタフェースであればPanel型。自分で好きなグラフィックを一から描きたい場合はCanvasクラスを選ぶといいだろう |
ということで、Canvasクラスを使って作ってみたのが、サンプルプログラム1。整数演算と画面描画を行なう極簡単なベンチマークプログラムIgBenchだ。
ソフトキー1(iモードの左上ボタン)を押すと、単純な整数演算のループ、それからCanvasにfillRectで四角形を100回繰り返して、実行時間を計測する。paintメソッドではdrawStringsでその結果の値を描画している。
もし、自分でこのソースをコンパイルしてみる場合は、ファイルはIgBench.javaファイル1つになっているので、これをjavacでコンパイルしてみてほしい。するとIgBench.class、IgBenchCanvas.classができる。このclassファイルをpreverifyコマンドで事前検証しておけばいいわけだ。
□サンプルプログラム1のダウンロード
http://pc.watch.impress.co.jp/docs/article/20010222/igbench.lzh
■ 実機で動かすために
さて、プログラムのコンパイルとpreverifyが問題なく通るならば、できたclassファイルをi-JADE Liteでプログラムをテストランしてみることができる。もし、自分でプログラムを作っている場合は、ここでi-JADE Liteを起動して、メインになるclassファイルを指定し、実行して、問題のある部分を修正、また、コンパイル、テストラン……を繰り返すことになる。
さて、iアプリの場合、アプリケーションはiモード携帯電話上で実行することになるので、作ったプログラムをWebサーバーにおいて、iモードからこれをダウンロードさせなければならない。
iモードでダウンロードできるようにするには、
・classファイルとリソースを1つにまとめたJARファイル
・アプリケーション情報を記述したjamファイル
・ダウンロード用のHTMLファイルを作る
この3つを作ってWebサーバー上にアップロードしなくてはならない。
これらの詳細についてはNTTドコモより配布されているPDFファイルの「開発ガイド(詳細編)」の9章に掲載されているので詳しくはそちらを参照して欲しいが、簡単にはまず、classファイルは
>jar cvfM iアプリ名.jar *.class
jamファイルは
-----
AppSize = 2229
AppName = IgBanch
AppVer = 1.04
PackageURL = http://web.pe.to/~deyamato/i/IgBench.jar
AppClass = IgBench
LastModified = Fri, 02 Feb 2001 10:05:24
-----
のように書く。AppSizeがファイルサイズ。AppNameがiモードに表示されるこのプログラムの名前。PackageURLはjarファイルの名前。AppClassはメインクラス。そして、LastModifiedはその名の通り、最後に更新した時刻だ。この項目はそれぞれ正確に書くことを忘れないで欲しい。
更新時間などを「正確」に書く、というのにはわけがあって、iモード携帯電話にはiアプリがバージョンアップしたかどうかを確認して、更新されていたときにはワンタッチで新しいバージョンをダウンロードする「バージョンアップ機能」があり、これでこの情報が使われているためだ。このバージョンアップ機能はかなり便利な機能だ(デバック中もしょっちゅうお世話になるとは思うが…)。
また、AppSizeは1Byteでも違うと「プログラムが正しくない」としてダウンロードできなくなる。
さて、ダウンロード用のHTMLファイルだが、これは今までのiモード用HTMLとは少し違う。iモード機能のない501i,502iでこのiアプリをアクセスしてしまわないようにこ工夫がされているからだ。
<OBJECT declare id="application.declaration" data="http://foo.bar/i/IgBench.jam" type="application/x-jam"> </OBJECT>
<A ijam="#application.declaration" HREF="others.html">ベンチマークテスト(演算&描画)</A>
このAタグのijam属性がミソだ。501iやPCのブラウザなどは、ハイパーリンクを選ぶと、AタグのHREF属性を見て、そちらのページを表示する。HREFでの参照先ページには「このプログラムは503i専用です」とでも書いておけばいいだろう。503iの場合は、HREFより先にIJAMが参照されて、OBJECTで指定されたJAMファイルが参照され、JARで固められたiアプリがダウンロードされるようになっているのだ。
さて、これで、iアプリは完成だ。
このjamファイル、それにjarファイル、HTMLファイルをWebサーバーにアップロードすれば、iモードからこのiアプリを使うことができるわけだ。
なお、簡単にためせるように、筆者のWebページにもこのサンプルiアプリをアップロードしてある。http://web.pe.to/~deyamato/iにある「ベンチマークテスト(演算&描画)」がそれだ(記事の公開から3カ月間公開の予定)。
□参考URL
i-mode で動く Java プログラムの書き方
http://cgi14.plala.or.jp/antun/tips/mobile/ijava.html
iモードJavaでHello world!
http://godwood.allnet.ne.jp/vioret/ihello.html
SINSEN SIDE-[A]
http://www.sinsen.org/i/memo.html
(2001年2月22日)
[Text by 大和哲]