集中企画

iアプリ

iモードJavaがいますぐ作れる！配信できる！

木寺祥友＋株式会社エル・カミノ・リアル＋編集部

ついに登場！ ケータイ用Javaアプリケーション
2001年 1月 26日、ついにNTTドコモからJavaアプリケーション「iアプリ」に対応した
P503iとF503iが発売された。これにより携帯電話でもパソコンのように、さまざまなアプリ
ケーションをダウンロードして「インストール」できるようになった。
すでにNTTドコモの公式サイト以外の、いわゆる「勝手サイト」から次々と独自のiアプリが公開されていることからもわかるように、iアプリは単にダウンロードして「使う」だけでなく、自分で独自アプリケーションをプログラムして、多くのユーザーに配布もできるのだ。iアプリを作るには、その基礎となる「Java」をある程度理解したうえで、iアプリ独特の作法も学ばねばならないが、自分が作ったアプリケーションが携帯電話で動くのを見れば感動すること間違いない。
ここでは、公式 iアプリに飽き足らないこだわり派のためにiアプ
リの作り方を一から指南する。必要なツールからプログラミン
グ上の注意点まで詳細に解説するので、これを読めば誰でも自分専用のiアプリが作れるだろう。
illustration : Hada Eiji

206 INTERNET magazine 2001/4

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

Javaといっても恐れるに足らず！

は

iアプリ 誰でも作れる
iアプリを作るには、まずベースとなるプログ●iアプリ作成に必要なもの

ラム言語「Java」を覚えなければならない。そういうと敷居が高いと思うかもしれないが、まず、製作環境としては普通のウィンドウズやLinux、またはUNIX系のマシンがあればOKだ。
残念ながら、現在マッキントッシュでは作れない。MacOS X 正式版を待とう。

□ エディター

Javaはプログラムの機能（オブジェクト）を順番に記述することでアプリケーションを開発する「オブジェクト指向」という手法を使った比較的簡単な言語だからそれほど心配はいらない。
また、iアプリの開発に使うのはJavaのなか□ iモードJava拡張APIクラスライブラリー□ iモードJava文字コンバーター

Javaのソースコード（.Javaファイル）は、テキストエディ
ターや各社から発売されているJava開発ツールで書く。ウィンドウズ付属のメモ帳でも十分だ。なお、本誌CD-ROMにもエディターの定 番 「秀 丸 エディタ」を収 録 している
（375ページ参照）。

ソースコードをアプリケーションにコンパイルするにはこれらが必要だが、2月15日現在はまだ一般には公開されていない。そこで、本記事では代わりゼンテックのiアプリ用エミュレータ「i-JADE」を使ってコンパイルした（213ページ参照）。なお、NTTドコモのウェブでは近日中に公開されることが記載されている。

□ JDK1.3

でもJ2MEと呼ばれる携帯端末向けのプラットーバー向けのJ2EEやパソコン、ワークステーシ

サン・ マイクロシステムズ株 式 会 社 から提 供 されているJava開発者向けのツールキット。Javaコンパイラー、ファ
イルを圧縮するためのJavaアーカイバーが含まれている。
本誌CD-ROMに収録（374ページ参照）。

ョン向きのJ2SEと比べて、はるかに機能が少□ CLDC 1.0

ない反面、覚えることも少なくてすむ。

同じくサン・マイクロシステムズ株式会社から提供されている携帯端末向けのツールキット。事前検証ツールが含まれている。無料でダウンロードできる。

フォームだ。携帯電話の上で実行できるのはサ

しかも、iアプリの作成に必要なツール類はwww.nttdocomo.co.jp/mc-user/i/java/
www.zentek.com/i-JADE/ja/download.html

本誌CD-ROMに収録！

jdc.sun.co.jp/wireless/

すべて無料で配布されており、特別な費用は必要ない。やろうと思い立ったその日から誰にでも作れるものなのだ。近い将来にはウェブ用の発ツールソフトも登場すると思われる。そなくてもドラッグ＆ドロップでiアプリを作「HTMLエディター」のようなiアプリ専用の開

うなればキーを叩いてJavaをプログラムしれるようになるだろう。
●Javaの位置付け

ワークステーション
ハンドヘルドPC

NC

iアプリの開発で使う
Javaはこの部分
パソコン
サーバー

ポケベル

セットトップボックス

ノートPC

PDA

携帯電話、PHS

Java2
エンタープライズエディション(J2EE)CDC（パーソナルJava）

Java2
スタンダードエディション(J2SE)カード

CLDC

Java2マイクロエディション (J2ME)

Java言語JVM

HotSpot
メモリー

10MB
64ビット

カードVM

KVM
1MB

512KB
32ビット

インターネットマガジン／株式会社インプレスR&D

32KB
16ビット

HTMLエディター：ウェブページはHTMLで記述されているが、HTMLタグを知らない人でもウェブページを作れるように設計されたウェブページ作成のための専用ソフトのこと。

©1994-2007 Impress R&D

8ビット

INTERNET magazine 2001/4

207

準備編

知らなきゃなにもはじめられない

開発者のiアプリ ための基礎用語
iアプリの開発は誰にでもできるものではあるでおいて欲しい。

が、やはり基礎的なJavaの知識はどうしてもなお、このほかにもJavaやiアプリに関する必要になる。文法などはJavaの入門書を参照

さまざまな専門用語がある。これからより高度してもらうとして、ここではこれからこの記事

なアプリケーションを作っていくつもりならば、を読むにあたって、とにかく知っておかなけれ

ぜひサンのJava解説サイト

ば何を書いてあるかが理解できないというJava

コモのiアプリ解説サイト

やiアプリに関連する専門用語のなかでも特にておくことをおすすめしたい。

基本となる重要なものだけを集めてみた。当然、
Jump 01

これらの用語がわからなければ、何も作れない
ので、はじめてJavaに挑戦する人は必ず読ん

Jump 02

や、NTTドJavaは、基本的にはどんなプラットフにも目を通しォームでも動作できるように、実行時にJump 01

Jump 02●KVM（Kilobyte Virtual Machine）「Javaバーチャルマシン」（JVM）と呼www.sun.co.jp/software/java/
503i.nttdocomo.co.jp/normal/iappli/
n_iappli.html

ばれるソフトウェアによってOSを覆い、そのプラットフォーム上でプログラムを動かすための形式「ネイティブコード」に変換する。一般にJavaの動作が通常のプログラミング言語で開発されたソフトよりも遅いといわれるのは、この変換●J2ME（Java2 Micro Edition）を行うためだ。

Javaはサン・マイクロシステムズが開発したプログラミング言語で、完全なオブジェクト指KVMはそのなかでもメモリーやCPU 、向性を備えているのが特徴だ。基本的にJavaで書かれたソフトは特定のOSやCPUに依存

電池消費に制約がある携帯デバイス向けすることなく、どんなプラットフォームでも動作する。セキュリティーやネットワーク機能に設計されたキロバイト単位のメモリーが充実しているため、ネットワーク環境での利用に適した仕様になっている。Java 2はで動作する組み込み機器用のJavaバー

1999年にJavaを全面的に改良したもので、新たに多くの機能が追加された。Java 2にはチャルマシンのこと。ケー・バーチャルマ

いくつかのバージョンがあるが、J2MEはそのなかでも一般的なJava2 スタンダードエディ

シンと読む場合もあるがこのKは携帯電

ションのサブセット版で、特に携帯電話やPDAのような小型デバイス向けに用意された。

話のKではないので勘違いしないように。

携帯電話におけるJavaの構造●JAR（Java ARchiver）
Javaの圧縮形式の1つ。ソースコードをコンパイル（変換）して、Javaプログラ

表示インターフェイス

ムを実行するのに必要なクラスやデータのファイルを配布のためにまとめるためのフォーマット。
「ジャー」と読む。

OS●スクラッチパッド
iアプリで作成されたデータを携帯電話本

Javaバーチャルマシン（KVM）

体に保存しておくための記憶媒体のこと。
最低 5キロバイトは設定が可能。機種にJavaソフト

携帯電話

よってはさらに大きく設定できるものもある。一度記憶させた内容は電源を切っても消えない。

208 INTERNET magazine 2001/4

携帯電話におけるJavaアプリケーションの構造はまず、携帯電話自体のOS上にどんなOSであってもあたかもJava専用機であるかのようにアプリケーションを動かすための一種のソフトであるJavaバーチャルマシンが乗り、そのうえに機種ごとの表示インターフェイスにのっとった形で各Javaソフトが動作する。そのためiアプリには機種依存の問題が出てくる。

インターネットマガジン／株式会社インプレスR&D

コンパイル：プログラムを作る際には、まず人間がわかる形のプログラミング言語を使ってソフトの設計図とでもいうべき「ソースコード」を作るが、これをコンピュータが理解し、実行するための形式である「オブジェクトコード」に変換すること。
©1994-2007 Impress R&D

iアプリ

iモードJavaがいますぐ作れる！配信できる！

●CLDC（Connected, Limited Device Configuration）●ソフトキー

これはJ2MEのクラス構成を定義するものだ。J2MEの構成で規定されるのは、スタンダー

503iから新しく登場した機能で、携帯ドエディションおよびJavaバーチャルマシンの機能のどの部分をサブセット化するかという電話画面の一番下（左右）に表示されたことや、ネットワークやセキュリティー、サポートされるコアプラットフォームなどについものを携帯電話本体のボタンで操作させてだ。これらはすべてある特定のJavaを組み込んだ製品をサポートするために規定される。

ることができるもの。iアプリ以外の機能

CLDCはJ2MEのプロファイルの基礎となるもので、J2MEのプロファイルは、たとえば携でもある。

帯電話など特定のデバイスのためのAPIや機能の付加的なセットを定義するものだ。構成およびプロファイルの詳細はサンのサイトで定義されている。
Jump 01

iアプリ

java.sun.com/products/cldc/
NTTドコモ
iアプリ用
独自Java API

携帯情報端末向け
API（MIDP）

CLDC

OS

モバイル情報端末●クラスライブラリー
iアプリ（またはJava）を組むためにあ
らかじめ短い指示をプログラム化してあ

CLDCの上に乗るiアプリのAPIはサンが標準で持っているMIDP（Mobile Information Device Profile）
ではなく、NTTドコモ独自のAPIを用いている。今後発売されるauやJフォンのJava端末はMIDPを使うといわれている。

るもの。Javaを用いてある特定の機能を持ったプログラムを「クラス」という形●API（Application Program Interface）

で部品化し、それら関連する複数のファソフトを開発する際に使えるコマンド（命令）や関数を集めたもののこと。同時に、それらのイルを1つにまとめたものをクラスライブ

コマンドや関数を使う場合のプログラム的なルールも示す。多くのソフトで共用できるようラリーと呼ぶ。これは共通する属性やメな一般的な機能をこうした形でまとめておくことで、各ソフト開発者はそうしたルールに従

ソッド（手続き）を持ったオブジェクトってその機能を「呼び出す」だけで、その機能を利用できるため、プログラミングの手間を群をまとめたものであり、プログラムの大幅に削減できる。iアプリでは、高低2つのレベルが用意されている。高レベルAPIはコン「部品」として利用できるため、一般的

ポーネントを組み合わせてアプリケーションのユーザーインターフェイスを作成するため、開によく使われる汎用的な「部品」をクラ発者の自由度は限定されるが、少ないコード行でコンパクトHTMLと同程度のアプリケーシ

スライブラリーに集めておけば、開発者

ョンを作成できる。ドコモによるとハードウェア特性を考慮する必要性が低く、異なるメーの手間を軽減できる。また、これがある

カーの携帯電話でも容易に動作させられるされるが、実際のところは機種依存の部分が多い。

ことによってプログラムを短く簡素に仕一方、低レベルAPIは携帯電話の画面サイズやキーパッドなど、ハードウェアの特性を考慮しながらアプリケーションを作成できるため自由度は増すが、グラフィックスの描画や画上げられるというメリットもある。

面サイズと論理座標値といった細かい点を考慮する必要があり、より高度な知識が要求される。
API

API

プログラム

表示クラス

API

開発者

クラス
保存クラス

ボタンクラスイベントクラス

通信クラス

クラス
クラス
クラス

クラスライブラリー

一般的な目的ごとにあらかじめ作られたクラスを用いることによって開発者はプログラミングの手間を軽減できる。

インターネットマガジン／株式会社インプレスR&D

コンパクトHTML（コンパクト・エッチ・ティー・エム・エル／Compact HyperText Markup Language）：携帯電話やPDAなどの携帯情報端末向けのコンテンツ記述言語。
HTMLのサブセットとして定義され、HTMLと下位互換性がある。NTTドコモの「iモード」などで利用されている。
©1994-2007 Impress R&D

INTERNET magazine 2001/4

209

準備編

作る前に知っておきたい！

iアプリ

作成
3つのポイント

iアプリは機種依存が大きい
Javaで記述されたプログラムはプラットフォ

動くことは違う。たとえばJavaは文章1つを例

ームや機種に依存することなく、どんな端末でにとってもHTMLのように自然に改行されないも動くことが特徴である。iアプリもJavaで記ので、あらかじめ画面サイズやCPU速度を計述されており、ドコモの503iシリーズも携帯端

算して、機種ごとに微妙に書き方を変えてプロ末用のJavaバーチャルマシン「KVM」というグラムしなくてはならない。そうしていないiア

ソフトウェアでOSを覆うことで、携帯電話をプリでは、たとえば同じブロック崩しゲームでJava専用マシンに見立てて、アプリケーショ

もP503iだとちょうどいい速さだが、F503iでンを動かす仕組みを取っている。

は速すぎて難しいといった現象が出てくる。

同じiアプリであっても、微妙に表示が異なる。
上がF503i、右がP503i。センタリングの仕様のちがいによって「決定」の位置が異なって見える。

そうだとすると、P503iであろうとF503iですべての端末向けの機能を実装したプログラ

あろうと同じようにアプリケーションが動くとムも組めないことはないが、10Kという制限内思えるのだが、実際には両者の間では同じiア

でそれを納めるのはかなり難しい。将来、実行

プリであっても微妙に見え方が違ったり動作ス

ファイルの容量に10Kという制限がなくなるま

ピードが違ったりする。これは、端末ごとにでは端末の仕様にあわせていくつかのJavaプロ

われるように、auやJフォンなど他のキャリア

CPU速度や画面サイズが異なることが原因だ。

グラムを書く必要があるだろう。

が採用する予定のJavaとの間の互換性が保証

どんな端末でも動くことと同じ速度や見え方で

なお、iアプリが「ドコモ仕様のJava」と言らかじめJamファイルで定義しておく必要があ

iアプリにはJavaの常識は通用しない
iアプリはJavaベースではあるが、実は本来のJavaとは微妙に違う点があることにも注意

されていないという問題もある。

るとか、普通なら当然Jarファイルで書かれてのJava特有の現象で、容量制限の違いこそあ

いるべきことが、実はJamファイルで定義されれauやJフォンでもほぼ同じである。

ているといったことだ。これらはJava経験者のしたい。というのも、iアプリでは携帯電話といまた、そのほかにもJava経験者にとってあ

ほうがかえって間違いやすいので、最初にしっう限られた資源のなかで動作させるためにNTT

たりまえのことがiアプリでは通用しないこともかりとiアプリ独特の作法を認識しておく必要

ドコモが独自の仕様を設定しているからだ。

ある。たとえば、スクラッチパッドの容量をあがあるだろう。

そのため、たとえばJavaの得意とするクラス
分けや効率化を進めるとかえってメモリーを多くとってしまい、その結果iアプリの容量制限である10K以内に納まりきらないということがソースコード（.Javaファイル）

コ
ン
パ
イ
ル

iアプリ本体（.Jarファイル）iアプリ本体（.Jarファイル）

インターネットある。また、使い終わったオブジェクトはメモ
リー容量が少ないのでその都度、解放しなければならないといったことや、過去にJava向けに作ったライブラリーは、必ずしもiアプリのライ
ブラリーに含まれているわけではないので、そのままでは流用できないといったことが挙げられる。これらは基本的には非力なデバイス向け

210 INTERNET magazine 2001/4.Jarファイルを定義するADF（.Jamファイル）.Jamファイル

携帯電話

ウェブサーバー

iアプリは、ソースコード（.Javaファイル）をコンパイル、圧縮したJarファイルとJarを定義するJamファイルの2つで構成されている。iアプリを携帯電話にダウンロードするには、まず最初に容量の小さいJamファイルをダウンロー
ドして、Jarの保存に必要な記憶容量や互換性をチェックする。JamはJarの制御的な役割も担っているため、一般的なJavaの常識とは異なる記述を要求する場合がある。

インターネットマガジン／株式会社インプレスR&D

ライブラリー：ある特定の動作をするプログラムを部品化したものをいくつも集めて1つにまとめることで、別のプログラムからでも、それらの機能を容易に利用できるようにしたもの。ラ
イブラリー単独では機能せず、他のプログラムの一部として組み込まれることではじめて動作する。
©1994-2007 Impress R&D

iアプリ

iモードJavaがいますぐ作れる！配信できる！

iアプリには2つの種類がある
ひとくちにiアプリといっても、実は次の2つ

しかし、iアプリを動かすたびに通信するので通の種類が存在する。そのため、開発の際には最信できる場所でしか使えないし、利用するたび初に「スタンドアローン型」と「ネットワークにパケット料金がかかる。

型」（クライアントサーバー型）どちらのアプリ

どちらのタイプを作るかによって最初から設

ケーションを作るかということを考慮しなけれ計が変わってくるため、まずタイプを考えなくばならない。

てはならないというわけだ。

スタンドアローン型というのは、携帯電話単体で動くアプリケーションのことだ。そのためi●スタンドアローンとネットワーク型の比較

アプリのデータ容量制限である10Kバイトだけで完結させなければならない。しかし、この場合は最初にiアプリをダウンロードさえしてしま

スタンドアローン型
利用可能範囲特に制限無し携帯電話の通信圏内のみ

パケット通信料

一度ダウンロードしてしまえば通信機能を使うたびにパケット通信料がえば、あとはたとえ地下や山奥など、電波の届
かない場所であってもアプリケーションは完全に利用できる。

動作速度
アプリケーションの容量制限

一方、ネットワーク接続型はアプリケーショ
ンを起動するたびに通信を行い、サーバー上のデータを利用しながら実行するので、実質的にネットワーク型

データ保存場所
向いてる分野

10Kバイトのファイル容量制限の壁がなくなる。

●iアプリでできることできないこと

以後はかからない

かかる

通信速度の影響は受けないので、通信速度の影響を受けるので、動作速度は常に一定

混雑によって反応が遅くなることもある

最大10Kまでだが機種によってはiアプリ本体では10Kまでだが、サーバーをそれ以上可能な場合もある

使うことで見かけ上大きくできる

スクラッチパッドの最大5Kだが機種 スクラッチパッドに加えてによりそれ以上使えるものもある

ネットワークの記憶領域も使えるゲームなど、

株価情報などデータが変動するものや、

特にデータ自体が変化しないもの

地図など巨大なデータベースを利用するもの●Iアプリでできること、できないこと

iアプリでは、パソコンのようにアプリケーションを

できる

できない

・文章の保存・iアプリから電話帳にアクセスして電話番号をかける

インストールできるが、パソコンのように万能なわけではない。たとえば、iモードでは、「Phone to」機

・画像の表示やグラフの描画

・複数のiアプリを起動する・iメロディの再生

・自分のダウンロードしたiアプリを人にあげるられるが、iアプリではそうしたiモード標準の機能で・サーバーのデータを表示

・iアプリからiモードブラウザーを起動させるもできないものがある。ここでは、そうしたiアプリ※機種によってできないこともできる可能性がある

能を使って、iモードブラウザーから直接電話をかけの「できること、できないこと」をざっと挙げてみた。

Jamファイルの重要性■JarではなくJamファイルで設定すること

iアプリでは、Jamファイルが非常に重要な役割

・アプリケーション名を持つことを認識する必要がある。iアプリにお・バージョン

けるユーザー記憶領域であるスクラッチパッドの・iアプリのあるURL（同じ階層にあればJarファイル名）

容量を設定したり、バージョンの管理をするほか、

・iアプリデータサイズ

アプリケーション名などの設定をJarではなくあ・Javaバーチャルマシンのバージョン

らかじめJamファイルに書き込む方式をとって・アプリケーションのクラス名いる。iアプリでは本体であるJarファイルですべ・更新日てのことを完結させるのではなく、Jamファイル

・スクラッチパッドの領域の補助があってはじめて動作するのだ。

・ネットワークの設定（実はhttpしか対応していない）

インターネットマガジン／株式会社インプレスR&D

Phone to機能：iモードに装備されている機能の1つで、iモード対応のウェブページ上に記載された電話番号をクリックするだけで電話がかけられるというもの。

©1994-2007 Impress R&D

INTERNET magazine 2001/4

211

基礎編

通信圏外でも携帯電話単体でiアプリが動く

スタンド

アローン型
を作る！

最初に構造を理解しよう
それでは、実際にiアプリを作っていこう。まiアプリの基本構造

ず最初は基礎編としてスタンドアローン型を作ってみる。実際のJavaの記述の仕方といった
Canvasクラス（低レベルAPI）

言語に関する部分はたとえば小社刊の「JavaPanelクラス（高レベルAPI）

入門」（1,631円、税抜）のようなJavaの入門書を参考にしてもらうとして、ここでは「iアプ
メインクラス（IApplication）

リを作る際のポイント」に焦点を当てて解説していく。
まず、最初に理解しておきたいのはiアプリ
は「IApplication」というNTTドコモが設定したiアプリ独自のメインクラスを使ってJavaを「Panel」は高レベルAPI（コンポーネントと呼ばれる部品が用意されていて比較的簡単に扱える）のためのコンテ
ナであり、「Canvas」は低レベルAPI（扱いが難しいが複雑なことができる）のためのコンテナである。高レベル
APIのコンポーネントはすべてPanelに、低レベルAPIはCanvasを使用することで表示される。画面に出せるのはPanelかCanvasのどちらか1つだけで、高レベルAPIと低レベルAPIが1画面に混在したiアプリは作成できない。ただし、それぞれを複数用意して切り替えることはできる。

記述する必要があるということだ。基本的には、このメインクラスの上に高レベルAPIである「Panel」クラス、または低レベルAPIであせることはできない。

の構造を理解するためのサンプルとしてPanel

る「Canvas」クラスを用いて、実際に携帯電実際にプログラムを書く際にはまず最初に核クラスだけを用いたごく簡単な備忘録（メモ帳）

話での表示のさせ方や、各ボタンを押したときとなるメインクラスを書いたあと、表示に関すを作ってみた。続く214ページからは、このメの動作のさせ方を記述する（右上図）。PanaelるPanelまたはCanvasクラスを書き、次にボ

モ帳を構成するすべてのソースコードを掲載しはある動作や結果に対しての雛形がすでにある

タンを押したときにどのような動作するかといているので、それに沿ってプログラム上の注意のに対し、Canvasはその雛形自体を自作する

うような部分を書き、最後にスクラッチパッド

点を逐一解説していく。まずは、これをもとに必要がある。当然、難易度はCanvasのほうがに保存を要するようなアクションについての記全体の構造を理解したうえで、より高度な作り高い。なお、PanelとCanvasはそれぞれを交述をしていくと理解しやすいだろう（下図）。

込みができるCanvasを使ったiアプリに挑戦す互に表示させることはできるが、同時に表示さこの記事では、スタンドアローン型のiアプリ

るといいだろう。

プログラムを書く手順

1・メインクラス・Panel、またはCanvas
クラスの核となる部分

2

3

Panel/Canvasクラス

Panel/Canvasクラス

・ボタンを押したときに動作する部分・スクラッチパッドに保存を要するアクション

今回作成した、サンプルのメモ帳。ごくシンプルな機能しかできないが、iアプリの構造を理解するには最適だろう。
なお、このメモ帳のプログラムデータは本誌CD-ROMに収録されている（374ページ参照）ので、自分の携帯電話にインストールして実際に使うこともできる。

212 INTERNET magazine 2001/4

インターネットマガジン／株式会社インプレスR&D

これが今回サンプルとして作成したメモ帳ア
プリケーションの画面。

ソースコード：ソフトの開発者がプログラミングする際にプログラミング言語を使ってソフトウェアの設計図とでもいうもの。そのままではコンピュータ上で実行できないため、プログラム
をコンピュータ上で実行するためには、別途「コンパイラー」などのソフトウェアを使ってコンピュータが理解できる「オブジェクトコード」変換しなければならない。
©1994-2007 Impress R&D

iアプリ

iモードJavaがいますぐ作れる！配信できる！

ソースができたらコンパイルしよう
214ページのようなソースコードが完成した

モのクラスライブラリー」の3つが必要になるがまだ一般に公開されていないため、正規の方ら、それを実際に携帯電話で動かすためにコン（207ページ参照）。しかし、現時点（2月15法ではコンパイルできない。

パイル（変換）をしよう。それには、まずJava

日現在）では、「ドコモのクラスライブラリー」

ソースコードをコンパイルしてJava

iアプリの標準的なコンパイル手順

クラス（.classファイル）にしなけ
ればならない。次にJavaクラスの事

コンパイル

事前検証

前検証を行う。そして、画像やサウ

Docomoクラス

Docomoクラス

ンドとともに事前検証されたクラス

＋

Java
ファイル
（ソース）

をJavaの圧縮形式である.jarファイ

CLDCクラスsルに変換してアプリケーションの形に

Class
ファイル
（事前検証前）

s

＋

する。

＋
CLDCクラス

JDK1.3
（ツール）

アーカイブ

Class
ファイル
（事前検証済み）

Jar
ファイル

s

＋
CLDC（ツール）

JDK1.3（ツール）

本来、この作業を行うためには「JDK1.3」と「CLDC1.0」、「ドコ

クラスライブラリーがない場合のコンパイル法
そこで、i-JADE Liteを使った方法を簡単に紹介する。i-JADE LiteはZENTEK（株式会社クラスライブラリーがない場合のコンパイルの手順

ゼンテック・テクノロジー・ジャパン）が提供

1JDK1.3、J2ME-CLDC1.0、i-JADE Liteを
インストールする。

しているiアプリの統合的な開発環境の1つで、D

ユーザー登録をすると無償で入手できる。
なお、くわしい手順はギガフロップス株式会
社が運営しているサイト GIGA APPLI
供されているiアプリ開発支援環境を参考にして欲しい。
www.zentek.com/ja/
www.g-appli.net

2C:¥i-jade¥i-jade-f.jar をc:¥classes に展開
する。
D

で提

GADeK

3C:¥j2me_cldc¥bin¥api¥classes¥java をc:¥classes にコピーする。

5コンパイルを実行する。
> javac -g:none -bootclasspath c:¥i-jade¥ijade-f.jar;c:¥j2me_cldc¥bin¥api¥classes -dclass *.javaD
6事前検証を実行する。
> preverify -classpath c:¥classes; -dpreverified classDD
4ソースコードのあるフォルダーに class とpreverifiedというフォルダーを作成。

7圧縮を実行する。
>jar cvfM NetMemo.jar -C preverified .

D●NTTドコモに聞くiアプリの今後を保存できないといった、いくつかの「できないこと」

iアプリに10Kの容量制限があるのには2つの理由があがありますが、これは悪意のプログラムが勝手に電話をります。1つは端末のメモリーやCPUの問題です。2つかけてユーザーの損害となるのを防止したり、コンテン

目は9600bpsという通信速度の問題です。iアプリのダ

ツプロバイダーの著作権を保護したりするために設けた

ウンロードに何時間もかかるのでは困りますよね。しかものです。権利や安全の保護と利便性の関係は難しい側し、これらは端末の性能や通信速度が上がり、より高度面があります。また、画面サイズやCPU速度などの違な圧縮技術が登場すれば解消され、いずれは10Kの制

いによって端末ごとにiアプリの動作が一定でないことに限もなくなるでしょう。ちなみに初期のファミコンもついては、弊社はあくまでも枠決めをするだけなので、10Kくらいでしたから、これでもけっこうおもしろいこ

その部分は端末メーカーに任せています。そうでないと、とはできると思います。なお、iアプリにはたとえばアプ

端末の違いは色や形だけになってしまいますよね。そのリから直接電話がかけられないとか、iアプリを友達にあなかでユーザーに支持される仕様がいずれはデファクト

げられないとか、ダウンロードしたサイトにしかデータ

スタンダードになっていくのでしょう。

インターネットマガジン／株式会社インプレスR&D

デファクトスタンダード：標準として定められた訳ではないが、市場の趨勢から自動的にほぼ標準としての位置付けを与えられた仕様のこと。事実上の標準として市場のトレンドを左右するだけの影響力をを持つことが多い。
©1994-2007 Impress R&D

株式会社NTTドコモ
モバイルマルチメディア事業本部
ゲートウェイビジネス部
コンテンツ開拓担当課長
山口善輝

INTERNET magazine 2001/4

213

基礎編
ソースを書く上でのポイントはココ！
●核となるパネル記述部分●ボタン操作に関する部分
A使用するクラスライブラリーのインポート（使えるようにすること）をしている。

1

CLDCのI/O（入出力）関係のライブラリー。

NTT ドコモ独自のユーザーインターフェイス関係のライブラリー。下記の「IApplication」クラスがこのパッケージの中にあるので、iアプリを作成する場合には絶対に必要。
2

B Javaではまずクラスを定義をし、それぞれのクラスを組み合わせてアプリケーシ
ョンを作るが、iアプリのメインクラスは必ず「IApplication」を継承する必要がある。なお、メインクラスはJam ファイルで指定する。通常のJava アプリでは「public static void main」(String[ ] args)の中で自分自身をインスタンス化（new）
するが、iアプリではJamがアプリケーションを起動した時点で、メインクラスがイ
ンスタンス化されているので、その必要はない。
3 iアプリを起動させるとまずメインクラスの「start」メソッドが呼ばれる。iアプ
リはアプリケーションだが、イメージ的にはアプレットに近い。
4 iアプリで何かを表示するためにはコンテナ（器）を作らなくてはならない。コン
テナには、「Panel」と「Canvas」の2種類がある。高レベルAPIのコンポーネン
トはすべてPanelを、低レベルAPIはCanvasを使用することで表示される。
5 ここで表示する「Panel」を指定している。iアプリでは、一度に1つのPanelまたは、Canvasしか表示できない。
6 この命令でバックライトをオンにする。F503iはアプリ起動後すぐにバックライ
トがオフになるので、今回はバックライトをオンにするようにした。503iになって消費電力が増えたため。
D ここではPanelを親クラスにして「MainPanel」という名前のクラスを定義している。これが、このプログラムのコンテナになっている。

●スクラッチパッドに関する記述/*** タイトル:* 会社名:* @version
*/

メ
イ
ン
ク
ラ
ス

メモ帳(Alone)株式会社 エル・カミノ・リアル
1.0

import java.io.*; ←― 1
import javax.microedition.io.*; ←― 1
import com.nttdocomo.ui.*; ←― 2A
B// アプリケーションのメインクラス
public class MemoAlone extends IApplication ←― 3{// アプリケーションが起動したら呼ばれる
public void start() ←― 3{// カレントフレームの設定をする
MainPanel p = new MainPanel( this ); ←― 4
Display.setCurrent( p ); ←― 5// バックライトをオンにする
PhoneSystem.setAttribute( PhoneSystem.DEV_BACKLIGHT, PhoneSystem.ATTR_BACKLIGHT_ON ); ←― 6}}D// メモ帳画面クラス（パネルクラス）
class MainPanel extends Panel implements SoftKeyListener←― 7{
7 緑色の部分がPanelでソフトキーを使う際の基本形。Panelのイベント処理にはリスナーが採用されている。
「SoftKeyListener」はソフトキーを使う時にイベントを受けるクラスが実装すべきインターフェイス。これ以外にもコンポーネントのイベントを受ける「ComponentListener」やキー入力のイベントを受ける「KeyListener」などがある。ただし、Canvasのイベント処理は扱いが異なり、Canvasクラスの持つ「processEvent」メソッドを使用する。
8 下で作成するテキストボックスの縦横の大きさ（文字数）を設定。ここではあとで変更しやすいように変数にしている。

9// テキストボックスのサイズ
public static final int
public static final int

ROW = 18;
COL = 3;

private TextBox
private Label

textBox;lbl;←― 8// テキストボックス// ステータスを表示するラベル←9C// 初期化を行う
public MainPanel( IApplication iapp ){コンポーネント自体を表す変数を定義している。
// タイトルを付ける
setTitle( "メモ帳(Alone)" );この部分がMainPanelのコンストラクター。コンストラクターはクラスが生成された時に呼び出されるメソッド（手続き）。MainPanelを使うときにはじめに実行
したい命令などを書いておく。
C

←― 10

// ソフトキーにラベルをつける
setSoftLabel( Frame.SOFT_KEY_1, "終了" );setSoftLabel( Frame.SOFT_KEY_2, "保存" );10 Panelにはタイトルをつけられる。タイトルは画面の一番上に表示される。この←― 11

命令で「メモ帳(Alone)」というタイトルをつけている。
// ソフトキーリスナを登録する
setSoftKeyListener( this );11 ソフトキーにラベルをつける。今回はわかりやすく "終了" "保存" とした。

Frame.SOFT̲KEY̲1とFrame.SOFT̲KEY̲2は、それぞれ左側のソフトキーと右側のソフトキーを表す定数。

←― 12// パネルにコンポーネントを追加する
textBox = new TextBox( "", ROW, COL, TextBox.DISPLAY_ANY );lbl = new Label( "ステータス" );12 ソフトキーリスナーの登録。ソフトキーを使う時に必要となる。この命令でソフトキーが押 されたときにこのクラスの中 にある「 s o f t K e y P r e s s e d 」 や「softKeyReleased」が呼ばれるようになる。

add( textBox );add( lbl );ここでコンポーネントを生成してPanelに追加している。テキストボックスやラベルなどのコンポーネントをPanelに載せるときは、newを使ってコンポーネントを生成したあとに、addでPanelに追加する。

←― 13

←― 13

13

// ScratchPadからデータを読み込む
readScratch(); ←― 14}

14 スクラッチパッドに保存しておいた内容を起動した時に表示するための記述。

readScratch()については次のページで説明する。

214 INTERNET magazine 2001/4

インターネットマガジン／株式会社インプレスR&D

アプレット：WWWブラウザーのコンテンツに埋め込まれ、実行時にはクライアントにダウンロードして動作する小さなアプリケーションプログラムのこと。｢Java言語｣で記述され、HTML
言語に張り付けられる程度の小さなプログラムを指すものを「Javaアプレット｣と呼ぶ。
©1994-2007 Impress R&D

パ
ネ
ル
ク
ラ
ス

iアプリ

iモードJavaがいますぐ作れる！配信できる！

パ
ネ
ル
ク
ラ
ス

// ソフトキーが押されたら時に呼ばれる
public void softKeyPressed( int softKey ){// ソフトキー1(左側のキー)が押されたら、アプリケーションを終了させる
if( Frame.SOFT_KEY_1 == softKey ){// アプリケーションを終了する
IApplication.getCurrentApp().terminate(); ←― 15}else if( Frame.SOFT_KEY_2 == softKey ){// ScratchPadへデータが正しく書き込まれたかどうか確かめるために// データを書き込んだ後、データを読み込む
writeScratch();readScratch();E

15 アプリケーションを終了させる命令。終了ボタン（ソフトキー1）が押された時に実行される。

16 writeScratchでスクラッチパッドに保存している。readScratchは本来必要ないが、確認のため保存した内容をもう一度読み出して表示させている。両方とも
以下で定義しているので、そこで説明する。

17 ソフトキーが離された時に呼ばれるメソッド。ソフトキーのイベントには「押された時」と「離された時」があるが、キーを押しっぱなしにするなど特別な操作を必要としていなければ、どちらか一方に実行させたい動作だけ書けばよい。ただし、中身がカラでも定義はしなければならない。

←― 16

F 今回作成したスクラッチパッドへ保存するためのメソッド。初級者には少々手強い部分だが、テキストボックスにある文章をそのままスクラッチパッドに保存したい場合は、この形をほぼそのまま流用できる。
このサンプルでは文字列の扱いを楽にするために、InputStream を継承する
DataInputStreamを使ってUTF形式でスクラッチパッドに書き込んだが、文字コードを意識さえすれば、どんな形式でもかまわない。

}}// ソフトキーが離された時に呼ばれる
public void softKeyReleased( int softKey ){}

←― 17

F

// ScratchPadへの書き込み
public void writeScratch(){try{// テキストをScratchPadへ書き込む
18 ―→ DataOutputStream out = Connector.openDataOutputStream( "scratchpad:///0" );out.writeUTF( textBox.getText() ); ←― 19
out.close(); ←― 20←― 21

lbl.setText( "書き込み成功!!" );}catch( IOException e ){lbl.setText( "ScratchPadへの書き込みエラー" );}E ソフトキーが押された時に呼ばれるメソッド。ここにソフトキーが押された時の動作を記述する。softKey変数に押されたソフトキーの種類を表す値が入っている。

18 スクラッチパッドを出力のために開く。

19 スクラッチパッドにテキストボックスの内容を保存。

20 スクラッチパッドを閉じる。

21 確認のためラベルに「書き込み成功!!」と表示。

22 失敗した場合にラベルへ「ScratchPadへの書き込みエラー」と表示。

G 今回作成したスクラッチパッドから読み出すためのメソッド。基本的な形は保存の時と同じ。

23 読み出しの作業用に文字列変数を作る。

←― 22

24 読み出しのためスクラッチパッドを開く。

}
25 スクラッチパッドの内容を読み出す。

// ScratchPadの読み込み
public void readScratch()

26 スクラッチパッドを閉じる。

{
String str = "";←― 23

27 読み出した内容(str)をテキストボックスにセットする。

try{// ScratchPadのテキストを読み込む
24 ―→ DataInputStream in = Connector.openDataInputStream( "scratchpad:///0" );str = in.readUTF(); ←― 25
in.close(); ←― 26// ScratchPadから読み込んだテキストをテキストボックスへ表示する
textBox.setText( str ); ←― 27}
catch( IOException e )iアプリのLayoutManagerは、現在のところ、機種依存の部分が大きい。標準のLayoutManager以外は、メーカー仕様が発表されるまで分からないが、現在使用できる標準のLayoutManagerも、その動作は機種依存である。また、初期に発売されたF503iとP503iでもコンポーネントの表示や配置のされ方からすでに違いがある。iアプリの開発者、特に多くの機種にも対応させたい場合は注意して欲しい。

{
lbl.setText( "ScratchPadの読み込みエラー" );
}
}
}

G

インターネットマガジン／株式会社インプレスR&D

UTF（ユー・ティー・エフ／UCS Transformation Format）：ユニコードであるUCS-2の定義に基づいて記述された文字列をコンピュータが扱えるように数値化（バイト列に変換）する方式。
©1994-2007 Impress R&D

INTERNET magazine 2001/4

215

サーバーを使ってより高度なiアプリを実現する

上級編

ワーク型

ネット を作る
スタンドアローン型との相違点

通信部分以外はスタンドアローン型と同一
ネットワーク型に挑戦する人は、最初に本誌

ンドアローン型と異なる部分のみを解説する。

付録CD-ROMÅ（374 ページ参照）収録のスタンドアローン型のソースに一部新たなソー「Netmemo.java」というソースを見てほしい。

スを加えている部分は「変更部分」、一方、ますると、行数は多いが内容的には先ほど作った

ったく新しいソースを追加している部分は「追スタンドアローン型によく似ていることに気付加部分」として、以下にそれぞれのポイントをくはずだ。実際、これはサーバーとの通信に関挙げてみた。なお、コンパイルの仕方はスタンする記述以外は同じだ。そこで、ここではスタ

ドアローン型とまったく同じだ。

変更部分のソースに関するポイント// コンポーネントリスナーを登録する
setComponentListener( this );ネットワーク型ではサーバーと通信を行うため、http通信用のライブラリーのインポートを指示する「import com.nttdocomo.io.*;」を追加する必要がある。

publicpublicstaticstaticimplements

UPLOAD_CGI= "upload.cgi";
DOWNLOAD_CGI = "download.cgi";

final int
final int

NGOK

staticstaticadd( textBox );add( up );add( down );add( lbl );アップロードボタンとダウンロードボタンを生成し、パネルに追加する。

6 コンポーネントイベントの処理// レスポンス定数
publicpublicComponentListenerをパネルに登録。これで、「ボタンを押す」などの「コンポーネントイベント」が発生した時にこのクラスの中にある「componentAction」が呼ばれる。

// パネルにコンポーネントを追加する
textBox = new TextBox( "", ROW, COL, TextBox.DISPLAY_ANY );up = new Button( "アップロード" );down = new Button( "ダウンロード" );lbl = new Label( "ステータス" );SoftKeyListener,

final String
final String■＝スタンドアローン型と同じ■＝ネットワーク型独自のソース

5 コンポーネントの追加

2 メモ帳画面クラス// メモ帳画面クラス（パネルクラス）
class
MainPanelextends
Panel
ComponentListener{// CGI名

追加部
分

4 コンポーネントリスナーの登録

1 ライブラリーのインポート
import java.io.*;import javax.microedition.io.*;import com.nttdocomo.io.*;import com.nttdocomo.ui.*;

変
更
部
分

= '0';= '1';

ネットワーク型ではアップロード／ダウンロードボタンを使うため、「SoftKeyListener」のほかに「ComponentListener」も実装する。また、サーバー側でCGIスクリプトを動かすのでサーバー側に置くCGIスクリプトの名称を 内に記述する必要がある。同時に、今回作成したCGIスクリプトで決めた戻り値をレスポンス定数として書いておく。これはCGIがうまく動作したかどうかを確認するためのものだ。

// コンポーネントで発生したイベントの処理
public void componentAction( Component c, int type, int param ){if( c.equals( up ) ){// サーバーへテキストデータをアップロードする
txtUpload();}else if( c.equals( down ) ){3 アップロード／ダウンロードボタンの変数// サーバーからテキストをダウンロードする// テキストボックスに表示されているテキストをアップロードするボタン
private Button

txtDownload();

up;

}
}

// サーバーからテキストをダウンロードし、テキストボックスへ表示するボタン
private Button
down;

アップロードボタンとダウンロードボタンのための変数。これを「テキストボックス」と「ス
テータスを表示するラベル」の間に挿入する。

216 INTERNET magazine 2001/4

コンポーネントイベントが発生した時に呼ばれるメソッド。引数のcがイベントの発生したコンポーネントを表す。
「txtUpload();」はイベントの発生したコンポーネントがアップロードボ
タン(up)だった時に、アップロード処理を実行する。
「txtDownload();」はイベントの発生したコンポーネントがダウンロードボタン(down)だった時に、ダウンロード処理を実行する。

インターネットマガジン／株式会社インプレスR&D

スクリプト：機械語への変換（コンパイル）を自動化することで、簡単に実行できるようにした形式の簡易プログラムのこと。スクリプトを記述するための言語にはたとえばPerlやVBス
クリプト、Javaスクリプトなどがある。 ©1994-2007 Impress R&D

新たな追加部分のソースに関するポイント
ア
ッ
プ
ロ
ー
ド
の
た
め
の
メ
ソ
ッ
ド

// サーバーへテキストデータをアップロードする
public void txtUpload(){
int res; // レスポンス値 ←― 1

1

処理が成功したかどうかを確認するCGIからの戻り値を入れるための変数。

2

作業状況をステータス表示用に作ったラベルに表示。

A

この間がアップロード用のhttp通信の一連の流れになっている。

HTTP通信用のコネクションを開くためにはじめに行うべきこと。この時点ではまだ通信は始まっていない。
「IApplication.getCurrentApp().getSourceURL()」でこのアプリケー
ションをダウンロードした元のURLが取得できる。
3try{lbl.setText( "アップロード中" );

←― 2

A

// 接続設定を行う
HttpConnection conn = ( HttpConnection )Connector.open(
IApplication.getCurrentApp().getSourceURL()+ UPLOAD_CGI,
3
Connector.READ_WRITE, true );// 要求メソッドとコンテンツタイプの設定を行う
conn.setRequestMethod( HttpConnection.POST ); ←― 4
conn.setRequestProperty( "Content-Type", "text/plain" );// 出力ストリームを取り出す
OutputStream out = conn.openOutputStream();

4 HTTP通信用のメソッドの指定。ここではPOSTを使用している。HTMLの送信フォー
ムなどで使われているPOSTと同じ意味。
5

通信内容のコンテキストタイプを指定。今回はプレーンテキスト形式を使用している。

ここでアップロードする内容を準備する。具体的にはHTTP通信用のコネクションの出力ストリームにセット。まだ、接続が確立されていないので、実際はバッファに入れられる。
B

6

出力ストリームを開く。

テキストボックスの内容を出力ストリームに書き出す。ここでの「getBytes()」メソ
ッドで、UNICODEから503i標準の文字コード(SJIS)のバイト列に変換されている。
7

←― 5

8

←― 6

出力ストリームを閉じる。

ここで、実際の通信が実行される。ブラウザーでいうところのURLを指定した瞬間から必要なデータのダウンロードが完了するまでの間と同じである。
9// データを書き込み（まだ接続が確立されていないので実際は、// バッファに入れられる）
out.write( textBox.getText().getBytes() ); ←― 7// 出力ストリームをクローズする
out.close(); ←― 8

B// 実際にリモート資源に接続する
conn.connect(); ←― 9// レスポンスを受け取る
InputStream
in = conn.openInputStream();res = in.read(); ←― 11
in.close(); ←― 12

C ここでCGIから送られてきたデータを取り出す。具体的にはHTTP通信用のコネクショ
ンの入力ストリームから取り出す。今回作成したアップロード用のCGIは、成功したかどうかを確認する戻り値（1バイト）のみを返すようにしている（前に設定したOKかNGが入っている）。

// サーバーからテキストをダウンロードする
public void txtDownload(){
int
res; // レスポンス値

←― 10

C

try
{
lbl.setText( "ダウンロード中" );// 接続をクローズする
conn.close(); ←― 13

E// 接続設定を行う
HttpConnection conn = ( HttpConnection )Connector.open(
IApplication.getCurrentApp().getSourceURL()+ DOWNLOAD_CGI, Connector.READ, true );14// 結果を表示する
if( res != OK ){lbl.setText( "アップロードに失敗" );return;}// 要求メソッドの設定する
conn.setRequestMethod( HttpConnection.GET );D

lbl.setText( "アップロード成功!!" );}catch(Exception e){
lbl.setText( "アップロードに失敗" );}// レスポンスを受け取る
InputStream
in = conn.openInputStream();// ダウンロードする文字列の長さと同じ領域を確保する
byte [] by = new byte[ in.available() - 1 ];

}

←― 16

// 結果を表示する
res = in.read();if( res != OK ){lbl.setText( "ダウンロードに失敗" );return;}10 入力ストリームを開く。
11 入力ストリームから、用意しておいた変数(res)に1バイトだけ読み込む。
12 入力ストリームを閉じる。
13 はじめに開いたコネクションを閉じる。これは忘れやすいので注意
D 戻り値を判定して、結果をステータス表示用に作ったラベルに表示。ここでの失敗はCGIの内部で何らかのエラー（データ保存用のファイルが開けないなど）の発生を示す。
E

←― 15

// 実際にリモート資源に接続する
conn.connect();// テキストを読み込む
in.read( by ); ←― 17

この間がダウンロード用のHTTP通信の一連の流れになっている。
// サーバーからの送られてくる文字コードによっては、// 文字コードの変更を行わなければならない
String str = new String( by ); ←― 18

14 アップロードとの違いは次の2つ。(1)ダウンロード用に用意したCGI(DOWNLOAD̲CGI)になっている。(2)データを参照するだけなので2番目の引数が「Connector.READ」（読み込みだけ）になっている。
15 アップロードとの違いは、データを参照するだけなので、メソッドを「GET」にしたこと。

// テキストボックスに表示する
textBox.setText( str ); ←― 19

ここでCGIから送られてきたデータを取り出す。今回作成したダウンロード用のCGIは、先頭の1バイトがアップロードと同じ戻り値になっていて、2バイト目以降がダウンロードしたテキストの内容になっている。

// 入力ストリームをクローズする
in.close();16 ダウンロードしたテキストを入れるための変数を用意する。
「in.available()」でダウンロードした全体の大きさ（バイト数）が取得できるので、そこから戻り値分の1バイトを引く。

// 接続をクローズする
conn.close();F

17 続きからbyの長さだけデータを読み込む。結果的に、残り全部（テキスト部分）を読み込むことになる。

lbl.setText( "ダウンロード成功!!" );}catch( Exception e ){lbl.setText( "ダウンロードに失敗" );}18 ここでダウンロードしたテキスト（SJISのバイト列：by)からUNICODE文字列(str)への変換が行われている。見逃しやすいが、文字化けした場合などは要注意。サーバー側でSJISにすることによって問題はなくなる。
19 ダウンロードしたテキストをテキストボックスに表示する。

F}

インターネットマガジン／株式会社インプレスR&D

CGI（シー・ジー・アイ／Common Gateway Interface）：WWWサーバーで、外部プログラムを起動して、その結果をWWWクライアント（ブラウザー）に返す仕組み。ユーザ
ーのリクエストによってウェブページの表示内容を変えたり、ユーザーの入力したフォームのデータをサーバー側へ読み込んだりできる。
©1994-2007 Impress R&D

INTERNET magazine 2001/4

217

ダ
ウ
ン
ロ
ー
ド
の
た
め
の
メ
ソ
ッ
ド

上級編

自慢の傑作が完成したら

iアプリ

をウェブで
公開しよう！

公開にはHTMLのほか、.Jar、.Jamの3つが必要
これまでのページで、i アプリの本体である.Jarファイルができあがったわけだが、iアプ
リができあがったら、ウェブで多くの人に公開しよう。ここでは、iアプリを公開するための手からiアプリをダウンロードできるようになるわ
けだ。

●iアプリ公開の手順

順を解説する。iアプリは本体である「.jarファ
アプリケーション
情報イル」のほかに、端末にアプリケーションの解ADF（.jamファイル）説をするADF（Application Descriptor File）
である「.Jamファイル」で構成されているため、ウェブで公開するには別途この.Jamファ
イルを作る必要がある。このファイルの目的は、

ダウンロードページ（.htmlファイル）リソース（画像、サウンド）
Javaソース（.javaファイル）

Javaクラス（.classファイル）

Javaクラス（.classファイル）アプリケーション（.jarファイル）アプリケーションを携帯電話に正しくダウンロ
コンパイル

事前検証

ードできるかどうかをi モードのJAM（JavaApplication Manager ）が判定できるようにすることだ。ADFの容量は100から300バイト程度と小さいため、iアプリ全体をダウンロード
する前にADFだけをダウンロードして、保存に必要な記憶容量や互換性をチェックすれば、通信コストの面から有利になる。サーバーから
ADF をダウンロードさせるには、 HTMLの<OBJECT>タグでADFを参照させるようにすればよい。

ウェブサイトパッケージ化

ソースコードをコンパイルしてJavaクラスを作ったら、まず事前検証をする。問題がなければ画像や音楽などのファイルも集めてiアプリの実行ファイル（.Jarファイル）に圧縮、統合する。あとはダウロードするためのHTMLファイルとともに、このJarファイルと、それを定義するJamファイルをウェブサーバーにアップロードすればOKだ。

●HTMLファイルの例<html><head><title>NetMemo</title></head><body><OBJECT declare id="NetMemo" data="NetMemo.jam" type="application/x-jam"></OBJECT><A ijam="#NetMemo" href="NetMemo.html">NetMemo</A></body></html>

あとは、これらのデータを自分のホームペー
ジエリアに上げておけば、iモードのウェブ画面

iアプリは、JamファイルとJar ファイル（iアプリ本体）から構成されている。ウェブサーバーに置かれた
Jamファイルをダウンロードするには、コンパクトHTML のOBJECT タグでJamファイルを参照する。

●Jamファイルの作り方
基本的には右の例を参考にすればよいのだが、ここで注意したいのは、1つのキーエントリーを1行で記述しなければならない決まりがあるため、行の最後は必ず改行で終わらせなければならないことだ。例中の「PackageURL」というのはJarファイル(iアプリ本体)のある場所を示しているので、この部分を自作のiアプリのファイル名にすればよい。
また、スクラッチパッドに書いた文章を保存しておくようなiアプリの場合には、「SPsize」の指定が必要である。最大5kまで指定できるので今回の例では1024バイトを指定した。なお、ネットワーク型iアプリの場合には「UseNetwork = http」という記述を忘れないようにしない●Jamファイルの例
AppName = NetMemo
AppVer = 1.0
PackageURL = NetMemo.jar
AppSize = 2622
KvmVer = CLDC-1.0
SPsize = 1024
AppClass = NetMemo
LastModified = Mon, 05 Feb 2001 17:48:24
UseNetwork = httpと通信できなくなることにも注意したい。

218 INTERNET magazine 2001/4

インターネットマガジン／株式会社インプレスR&D

HTML（エイチ・ティー・エム・エル／Hyper Text Markup Language）：ホームページを設定するためのページ記述（マークアップ）言語。文書中に「タグ」と呼ばれる命令を挿入して、見出し、段落といった文書構造を指定したり、画像やリンクを設定したりする。HTMLにはバージョンがあり、1997年12月に発表された4.0が最新の規格だ。
©1994-2007 Impress R&D

iアプリ

iモードJavaがいますぐ作れる！配信できる！

CD-ROMに収録したデータの使い方●今回のサンプルで使用したiアプリのクラス（API）一覧
iアプリを理解するためにも、ぜひ本誌付属のCD-ROMに入っているサンプルのデータも参提供
元照して欲しい（374ページ）。今回製作したス

クラス名

概要

IApplication

アプリケーションの雛型を提供。 iアプリのアプリケーションは必ずこのクラスを継承して作成しなければならない。
アプリケーションが起動したら呼ばれるメソッド。
アプリケーションを終了。
カレントのアプリケーションオブジェクトを取得。
アプリケーションがダウンロードされた元の URL を取得。
携帯電話のデバイスを定義する。 プラットフォームのネイティブリソースにアクセスする手段を提供する。
ネイティブリソースの制御を行う。
バックライトを表わす (=0)。
バックライトの属性の1つで、オンすることを表わす (=1)。
デバイスのビューを定義する。 端末のスクリーンとキーパッドを抽象化したもの。 スクリーン
やキーパッドの情報を取得するために使う。
カレントのフレームを設定する。
アプリケーションの表示面を提供し、持つべきインターフェイスを定める。
ソフトキーのラベル文字列を設定する。
ソフトキー1 (=0)。
ソフトキー2 (=1)。
高レベルAPI のための表示面を定義する。 これは高レベル API で使用するフレームクラスで、コンポーネントを張り付けるための親オブジェクトとなる。パネルがスクロールするかどうかは機種による。
ソフトキーリスナーを登録する。
コンポーネントリスナーを登録する。
フレームのタイトル文字列を設定する。
ソフトキーの入力のリスナーを定義する。 高レベル API において、ソフトキーイベントを受け取るオブジェクトが実装すべきインターフェイスを定める。
ソフトキーが押された時に呼ばれるメソッド。
ソフトキーが離された時に呼ばれるメソッド。
ティッカーテープ表示 (マーキー) のコンポーネントを定義する。
高レベル APIで使用されるユーザーインターフェイス部品の1つ。
テキスト入力コンポーネントを定義する。 高レベル API で使用するユーザーインターフェイス部品の1つで、テキスト入力のためのコンポーネント。
テキスト文字列を設定する。
表示文字列をそのまま表示するモードにすることを表わす(=0)。
テキストを表示するコンポーネントを定義する。高レベル API で使用するユーザーインターフェ
イス部品の1つで、文字列を表示するためのコンポーネント。 1行テキスト表示のみをサポートする。
コンポーネントのラベル文字列を設定する。
コンポーネントのイベントのリスナを定義する。高レベル API において、コンポーネントで発生したイベントを受け取るオブジェクトが実装すべきインターフェイスを定める。
コンポーネントで発生したイベントを受け取る。
HTTP プロトコル形式の接続を定義する。
メソッドを設定する。
ヘッダーのプロパティー値を設定する。
HTTP で接続し、メッセージを送受信する。
接続を閉じて、リソースを開放する。
HTTP リクエストメソッドの"GET"を表わす文字列。
HTTP リクエストメソッドの"POST"を表わす文字列。
コンポーネント (部品) を定義する。 高レベル API の部品を表わす抽象クラスの1つ。
すべての接続オブジェクトの作成時に使用する「static メソッド」のプレースホルダー。
Connection を作成およびオープンする。
接続出力ストリームを作成およびオープンする。
接続入力ストリームを作成およびオープンする。
接続出力ストリームを作成およびオープンする。
接続入力ストリームを作成およびオープンする。
アクセスモード。
アクセスモード。
これを使うと、アプリケーションはプリミティブ型のJava データを移植性のある形で出力ストリームに書き込める。
文字列を、マシンに依存しない UTF-8 エンコーディングを使った形式にして基本となる出力スト
リームに書き込む。
出力ストリームを閉じ、これに関連するすべてのシステムリソースを解放する。
これにより、アプリケーションはプリミティブ型のJava データを基本となる入力ストリームからマシンに依存せずに読み込める。
Java 修正 UTF-8 形式でコード化された Unicode 文字列表現をストリーム in から読む。
入力ストリームを閉じて、このストリームと関連するすべてのシステムリソースを解放する。
この抽象クラスはバイト入力ストリームを表現するすべてのクラスのスーパークラスである。
入力ストリームからバイトデータを読み込む。
この入力ストリームを閉じて、そのストリーム関連するすべてのシステムリソースを解放する。
この入力ストリームのメソッドの次の呼び出し側からブロックされることなく、この入力ストリームから読み込める (またはスキップできる) バイト数を返す。
この抽象クラスはバイトの出力ストリームを表現するすべてのクラスのスーパークラスである。
出力ストリームは、出力バイトを受け付けて、特定の受け手に送る。
この出力ストリームに指定されたバイトを書き込む。
このストリームを閉じ、このストリームに関連するすべてのシステムリソースを解放する。
String クラスは文字列を表わす。Javaプログラム内の""abc""などのリテラル文字列はすべて、このクラスのインスタンスとして実行する。
Object クラスはクラス階層のルートである。すべてのクラスはスーパークラスとしてObject を持つ。配列を含むすべてのオブジェクトはこのクラスのメソッドを実装する。
このオブジェクトと他のオブジェクトが等しいかどうかを示す。
Exception クラスとそのサブクラスは通常のアプリケーションでキャッチされる可能性のある状態を示す。Throwableの形式の1つ。
なんらかの入出力例外の発生を通知するシグナルを出す。入出力処理の失敗、または割り込みの発生によって作成される例外の一般的なクラス。

startterminate
getCurrentApp
getSourceURL
PhoneSystem

タンドアローン型は「MemoAlone」、ネット
ワーク型は「NetMemo」というフォルダーに関 連 ファイルはすべて入 っている。 A D F

setAttribute
DEV̲BACKLIGHT
ATTR̲BACKLIGHT̲ON
Display（.Jamファイル）や、ソースコードは（.javaファイル）、エディターやメモパッドで見ることができるほか、より詳細なコメントも書かれていsetCurrent
Frame
setSoftLabel
SOFT̲KEY̲1
SOFT̲KEY̲2
Panel

るので、今後、同じ様なiアプリを作る時には参考にしてもらいたい。
なお、今回作ったサンプルを実際に自分の携帯電話にダウンロードして実証する場合も、自分のホームページエリアなどにファイルを置いて503iからダウンロードすればOKだ。その際、「NetMemo」の場合はPerlのCGIが使えるこ

setSoftKeyListener
setComponentListener
ド setTitle
コ SoftKeyListenerモとが前提である。CGIファイルとdatファイル

softKeyPressed
softKeyReleased
Tickerの属性変更を忘れないようにしたい。なお、ク

TextBox

ライアントサーバー型iアプリはダウンロードしたサイトだけにしかアクセスできないほか、書

setText
DISPLAY̲ANY
Label

き込まれたメモの内容のファイルはダウンロー
ドしたサイト上にあるので不用意なファイルの移動は厳禁であることにも注意したい。
最後に参考までに、今回のサンプルで使用したクラスの一覧を右に挙げておく。実際にiア
プリで使えるクラス自体はこの倍以上あるので、くわしくはN T T ドコモのウェブにある仕 様書を参照して欲しい。
www.nttdocomo.co.jp/mc-user/i/java/

setText
ComponentListenercomponentAction
HttpConnection
setRequestMethod
setRequestProperty
connect
close
GET
POST
Component
Connector
open
openDataOutputStream
openDataInputStream
openOutputStream
openInputStream
READ̲WRITE
READ
DataOutputStream
writeUTF

著者紹介
close
DataInputStream

木寺祥友（きでら・よしとも）
95年に初期のJavaプロジェクトにたずさ
わった経験から、全米各地をまわりジェー
ムズ・ゴスリングなどのJava開発者にインタビューし「Javaを創った人々」アスキー

readUTF

Ｃ closeＬ InputStreamＤ
Ｃ readclose
available刊を執筆。アスキーで「Java訪ねて三千里」

OutputStream

や、日 経 マルチメディアで「Dr キデラの
AVC 指 南 」 を連 載 。 現 在 は株 式 会 社 エ

write
close
String

ル・カミノ・リアル代表取締役。携帯電話

ObjectとJavaが最大のテーマ。

equalsException

YKidera@aol.com

www.el-camino-real.net

IOException

黒字＝クラスもしくはインターフェイス 赤字＝メソッド 青字＝フィールド

インターネットマガジン／株式会社インプレスR&D

Perl（パール）：ラリー・ウォールによって開発されたプログラミング言語。当初、テキスト処理に重点を置いた言語として開発されたが、言語仕様の拡張がなされ、ファイル操作やネットワークプログラミングなども可能となっている。最近ではウェブページに双方向性をもたらすために、CGIに利用されることも多い。
©1994-2007 Impress R&D

INTERNET magazine 2001/4

219

［インターネットマガジン バックナンバーアーカイブ］ ご利用上の注意
この PDF ファイルは、株式会社インプレス R&D（株式会社インプレスから分割）が 1994 年～2006 年まで発行した月刊誌『インターネットマガジン』の誌面を PDF 化し、「インターネットマガジン バックナンバー
アーカイブ」として以下のウェブサイト「All-in-One INTERNET magazine 2.0」で公開しているものです。

http://i.impressRD.jp/bn
このファイルをご利用いただくにあたり、下記の注意事項を必ずお読みください。
z 記載されている内容（技術解説、URL、団体・企業名、商品名、価格、プレゼント募集、アンケートなど）は発行当時のものです。
z 収録されている内容は著作権法上の保護を受けています。著作権はそれぞれの記事の著作者（執筆者、写真の撮影者、イラストの作成者、編集部など）が保持しています。
z 著作者から許諾が得られなかった著作物は収録されていない場合があります。
z このファイルやその内容を改変したり、商用を目的として再利用することはできません。あくまで個人や企業の非商用利用での閲覧、複製、送信に限られます。
z 収録されている内容を何らかの媒体に引用としてご利用する際は、出典として媒体名および月号、該当ページ
番号、発行元（株式会社インプレス R&D）、コピーライトなどの情報をご明記ください。
z オリジナルの雑誌の発行時点では、株式会社インプレス R&D（当時は株式会社インプレス）と著作権者は内容が正確なものであるように最大限に努めましたが、すべての情報が完全に正確であることは保証できません。このファイルの内容に起因する直接的および間接的な損害に対して、一切の責任を負いません。お客様個人の責任においてご利用ください。

このファイルに関するお問い合わせ先
All-in-One INTERNET magazine 編集部
im-info@impress.co.jp
Copyright © 1994-2007 Impress R&D, an Impress Group company. All rights reserved.