短期集中連載 大和哲の iアプリプログラミングをしよう
第2回:プログラミングをするには



 第1回では概要を説明したが今回は実際に、iモードの開発環境を手に入れて、実際に簡単なプログラムを作ってみよう。iアプリプログラミングは(性能さえ追求しなければ)プログラミング自体はそれほど難しくない。前回挙げた知識と、開発ツール、Javaプログラミングの仕方とiモードライブラリに関するちょっとしたTIPSがわかっていれば、iモードプログラムはできたも同然だ。

 プログラミングにあたって必要なのは開発環境もひととおりフリーで入手できるし、IDE開発スイートなどもJava用のものが豊富に販売されていて入手できるので、その意味でも非常に敷居は低いと言っていいだろう。


■ iアプリの開発環境

 開発環境に関してはpdfファイルで配布されている「i モード対応 Java コンテンツ開発ガイド~詳細編~」に説明がある。それによると、開発に必要なツールは以下の通りだ。

・Java2 SDK Standard Edition 1.3
・Java2ME CLDC
・i モード Java 拡張 API クラスライブラリ
・i モード Java 文字コンバータ

 前者2つはSUN Microsystemsのサイトからダウンロードできる。
Java2 SDKはJava(TM) 2 Platform Standard Editionから、Java2ME CLDCはCLDC and the K Virtual Machine (KVM)からダウンロードできる。CLDC and KVMの方は英語ページだが、ダウンロードするだけならはそれほど難しくはないはずだ。

 後者2つに関しては、別途NTTドコモから近日中に公開される予定となっているが、今のところ、まだ公開されていない。

 クラスライブラリがなくて開発ができるのか? と思われるかもしれないが、方法がいくつかある。たとえば、サードパーティ製のiモードエミュレータなどを利用する、あるいはDocomoのライブラリに相当する空のライブラリを作り、これを呼び出すプログラムを作る、といった方法だ。

 一般には、前者のエミュレータを利用する方法が取られることが多いようだ。というのも、株式会社ゼンテック・テクノロジー・ジャパンが503iシリーズに対応した、PC上で動く携帯電話エミュレータ「i-JADE」を販売しているのだが、そのエディションの1つである「i-JADE Lite」が、同社のWebサイトから無償でダウンロードすることができるからだ。

 ここでも、このi-JADE Liteを利用してプログラミングをする方法を紹介することにする。

 なお、このi-JADE Liteはライブラリを利用するだけでなく、本来のエミュレータとしての機能も(実機よりも実行速度が速すぎることさえ除けば)非常に優秀だ。iアプリの開発を行なうのであれば、何はともあれ、このi-JADE Liteを入手することを強くお勧めしておく。

 ほかには、お好みで、IDE(統合開発環境)で開発したい場合はそれらもあればいい。上記のi-JADEはJ-BuilderなどのIDEに組みこむことができるので、IDE上でソースコード編集、コンパイル、エミューレータ上での動作確認をIDE上からシームレスに行なうことも可能だ。


■ 環境とコンパイルオプション

 多くの方が迷われるであろう、環境の設定、コンパイルの方法についても少し説明しておこう。

 たとえば、Java2 SDKとJ2ME CLDCの標準的なコマンドとi-JADE Liteを使って開発を行なう場合だが、まず、最初にJava2 SDKとJ2ME CLDCを展開し、それぞれのbinにPATHを通しておく必要がある。

 ところで、j-jadeそのものは、i-jade-f.jar(F503i対応版の場合。P503i版の場合はi-jade-p.jar)というように、本体がjarファイルになっていて、iアプリをコンパイルする際にも、このファイルをそのまま含んでコンパイルできるのだが、preverifyする際にはjarファイルは指定できない。そこで、このjarファイルを展開しておいてやる必要がある。

Java2 SDKに含まれるJARコマンドで
jar.exe xvf i-jade-f.jar
として解凍しておくのだ。

 ついでにpreverify関係で言うと、このpreverifyを利用したかどうかをファイルだけから判断するのが、結構プログラミングをしていると面倒になってくる。そこで、preverifyの使用前ファイル使用後ファイルのディレクトリを分けておくと便利だろう。たとえば、unverified,preverifiedというディレクトリを作っておいて、こんな感じでコンパイル、preverifyをするといいだろう。preverify後のファイルはpreverifiedに入る。

 で、コンパイルは、たとえばpreverify前のファイル、preverify後のファイルをそれぞれunverified,preverifiedというディレクトリに入れるなら、それぞれのディレクトリを作っておいてから、

>javac -g:none -bootclasspath c:\i-jade\i-jade-f.jar;c:\j2me_cldc\bin\api\classes -d unverified javaファイル名

のように行なう。
そして、preverifyは解凍したi-JADE Liteを含めて

>preverify -classpath c:\i-jade;c:\j2me_cldc\bin\api\classes -d preverified unverified

のようにすればいいわけだ。

サンプルプログラムIgBench.classをi-JADEで実行する。さすがにPCはCPUパワーがあり、ベンチマークテストも一瞬で終わってしまう
 とりあえず、ここまでの段階でi-JADE Liteなどのエミュータでテストランができるところまで持っていくことができる(後述するが、実機に持っていくには、さらに、必要なファイルをJARファイルとしてまとめたり、設定ファイルを作る、などの作業が必要になる)。

 この辺は一度わかってしまえば、実際のプログラミングの際には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クラスを選ぶといいだろう
 プログラムのメインクラスと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 大和哲]


【PC Watchホームページ】


ウォッチ編集部内PC Watch担当 pc-watch-info@impress.co.jp

Copyright (c) 2001 impress corporation All rights reserved.