BREWアプリケーションの構成を理解しよう!BREWアプリケーション開発入門(3)

» 2009年09月15日 14時45分 公開
[末永 貴一/エイチアイ,@IT MONOist]



 前回「BREWアプリケーション開発の流れを押さえよう」では、開発環境の構築から、「Hello World」の表示までを実践し、本連載の導入部として、環境構築の確認とプログラムの実行方法にフォーカスして解説を行いました。

 今回は、前回説明を省いた“プログラムの詳細部分”について詳しく見ていきたいと思います。

BREWアプリケーションの全体像

 まず、前回作成した「HelloWorld」プログラムを利用しながらBREWアプリケーションの全体像を俯瞰(ふかん)してみましょう。

 BREWアプリケーションは、定義ファイルである「MIFファイル」なども含めて、大きく以下のように構成されています(図1)

photo 図1 BREWアプリケーションの全体像

 ここのポイントは、「BREWモジュール」と「BREWアプレット」です。

 BREWモジュールとは、BREWアプリケーションを格納するための“コンテナファイル”です。Windows上のシミュレータで実行する場合は DLLファイル、実機上のARMバイナリであればMODファイルとなります。そして、このBREWモジュールがどのようなファイルなのかを定義しているのがMIFファイルです。MIFファイルは、BREWモジュールと1対1の関係にあります。

 そして、このBREWモジュールの中に格納されているのが、BREWアプリケーションの実体であるBREWアプレットです。BREWアプレットは、構造上BREWモジュールの中に複数存在させることが可能なため、これらを識別するために「クラスID」というIDが割り振られています(注1)。なお、このクラスIDを格納しているのが、MIFエディタで作成した「BIDファイル」です。

注1:BREWアプレットは、機能的に複数のアプレットをBREWモジュールに入れることが可能ですが、複数のアプレットを利用するケースはあまりありません。このため、通常のアプリケーション開発では、基本的に“単一のアプレットしか利用しない”と考えて差し支えないでしょう。

 このBIDファイルは、プログラム中でincludeすることになりますが、この中身は以下のようになっています。

#ifndef HELLO_BID
#define HELLO_BID
#define AEECLSID_HELLO        0x01234567
#endif //HELLO_BID

 前回、MIFエディタで設定した値が「AEECLSID_HELLO」としてdefineされていることが分かります。「BREW AEE(Application Execution Environment)」は、この「AEECLSID_HELLO」とプログラム中で定義されたクラスIDから、BREWアプレットであるHelloWorldプログラムを識別しています(図2)

photo 図2 アプレットの識別について

BREW AEE上での動作

 では、BREWアプリケーションの実体であるBREWアプレットは、BREW AEE上でどのように動作しているのでしょうか。

 BREWアプレットは“アプレット”の名前が示すとおり、BREW AEEに組み込まれてはじめて動作するプログラムです(注2)

注2:アプレットという名称自体に「ほかのアプリケーションの中に組み込まれて実行される小さなプログラム」という意味があります。

 そのため、プログラム中には「main関数」に相当するものはなく、実行の主体となるのはBREW AEE側ということになります。BREWアプレットは、アプリケーションの主体であるBREW AEEの命令をトリガーとして動作する“プログラムモジュール”といってもよいでしょう。Javaを知っている方であれば、「Java Applet」や「Java Servlet」と似たような仕組みだと思っていただけると、イメージしやすいかもしれません。

 ここで、前回作成したHelloWorldプログラムを思い出してください。「BREW Application Wizard」で生成された3つのファイルのうち、中身を修正しなかったファイルが2つありました。その2つのファイルとは、「AEEModGen.c」と「AEEAppGen.c」です。

 これらのファイルには、BREW AEEがBREWアプリケーションを実行する際に必要な関数が実装されており、BREWアプリケーションのテンプレートでもあり、かつ、ベースとなるものでもあります。

 基本的に、この2つのファイルは変更せずに利用します。プログラマが扱うものは、あくまで初期化やイベント処理などが記述されたアプレットの内部処理の部分(HelloWorldプログラムでは「hello.c」)です。「AEEModGen.c」と「AEEAppGen.c」には、BREWモジュールとBREWアプレットのロード、アンロードなどに関する記述があり、この2ファイルの中にBREWアプリケーションの動作を紐(ひも)解く鍵があります。

 まず、「AEEModGen.c」の中を確認してみると、以下の関数にBREWアプリケーションを起動するポイントがあります。

int AEEStaticMod_New(int16 nSize, IShell *pIShell, void *ph, IModule **ppMod,
                     PFNMODCREATEINST pfnMC,PFNFREEMODDATA pfnMF)
AEEModGen.c(抜粋)

 この「AEEStaticMod_New()」は、BREW AEEがBREWモジュールをロードする際に行われる処理が記述されています(実際には、「AEEMod_Load()」が呼ばれているのですが、これは環境依存を抽象化する関数で、実質的には「AEEStaticMod_New()」が重要になります)。この「AEEStaticMod_New()」の内部で行われる重要な処理が「IModuleインタフェース」の実装です。

 IModuleインタフェースとは、BREW AEEがBREWモジュールを管理するためのインタフェースを提供するもので、BREW AEEはこのインタフェースを介して、BREWモジュールのライフサイクルなどを管理します(注3)

注3:ここでいうインタフェースとは、オブジェクト指向のインタフェースの概念です。インタフェースの概念により、オブジェクト間のアクセスはお互いの実装を知らなくてもよくなります。BREWは、C言語での実装もサポートしているため、C言語でオブジェクト指向の実装を行っています。

 以後、BREW AEEはIModuleインタフェースに定義されている名前で、BREWモジュールにアクセスするようになります(図3)。BREW AEEは、BREWモジュール側の決められた名前にアクセスすればよく、また開発者はBREW AEEに手を入れずにアプリケーションの開発に集中できます。

photo 図3 IModuleインタフェースについて

 例えば、「AEEModGen.c」の中にある関数は、以下のようにインタフェースとして実装されています。

インタフェース
実体の関数
IMODULE_CreateInstance() AEEMod_CreateInstance()
IMODULE_AddRef() AEEMod_AddRef()
IMODULE_Release() AEEMod_Release()
IMODULE_FreeResources() AEEMod_FreeResources()

 「AEEMod_Load()」がインタフェースではない理由は、エントリポイントであるため、当然、実行環境に依存するからです。これはシミュレータ環境だとWindowsのDLLとなるため、以下のように定義されていることからもその理由がよく分かると思います。

__declspec(dllexport) int AEEMod_Load(IShell *pIShell, void *ph, IModule **ppMod)

>>「BREW AEE上での動作」の続きは次ページ(MONOistサイトに移ります)で解説します


Copyright © ITmedia, Inc. All Rights Reserved.

アクセストップ10

2026年03月12日 更新
  1. 「iPhone 17e」と「iPhone 17」は何が違う? 3万円の価格差をスペックから検証する (2026年03月10日)
  2. 庵野秀明、GACKT、ひろゆき、ドワンゴ川上らが集結 “カメラのいらないテレビ電話”をうたう新サービス「POPOPO」18日に発表へ (2026年03月11日)
  3. 「iPad Air(M4)」実機レビュー 「もうProじゃなくてもいい」と思えた性能、だからこそ欲しかったFace ID (2026年03月09日)
  4. 「iPhone 17e」を試して分かった“16eからの進化” ストレージ倍増と実質値下げで「10万円以下の決定版」に (2026年03月09日)
  5. どこでもウユニ塩湖? 3COINSで550円の「スマホ用反射ミラークリップ」を試す (2026年03月12日)
  6. 自分で修理できるスマホ「Fairphone(6th Gen.)」を見てきた わずか10分で画面交換、2033年まで長期サポート (2026年03月10日)
  7. 携帯キャリアの通信9サービス、総合満足度はpovoがトップ サブブランド勢が好調 MMDが調査 (2026年03月10日)
  8. キーボード付きスマホ「Titan 2 Elite」がUnihertzから登場 実機に触れて分かった“絶妙なサイズ感” (2026年03月09日)
  9. 「Galaxy S26」シリーズはどこが安い? 一括価格と2年間の実質負担額を比較、お得なキャリアはココだ (2026年03月11日)
  10. 60ms未満の音声遅延速度で端末をワイヤレス化「UGREEN USBオーディオトランスミッター」が30%オフの2309円に (2026年03月09日)
最新トピックスPR

過去記事カレンダー

2026年