MerapiによるAIR-Java連携の方法

Merapiのベータ版をダウンロードするには、まずプロジェクトサイトよりユーザ登録を行う必要がある。登録後、自動送信の確認メールが届くが、この時点ではまだアカウントは作成されていない。どうやらアカウントの作成は手動で行っているらしく、完了するまでにしばらく時間がかかるので気長に待つのがいいだろう(筆者の場合、申請から完了まで10日かかった)。

アカウントの登録が完了したらログインしてダウンロードすることが可能となる。ダウンロードページには「Merapi Beta 1」と「Merapi Alpha RC 01」があるが、Beta 1の方が最新版である。また、その他にMac OS X用のサンプルプログラムが公開されている。

Beta 1をダウンロードして展開すると、frameworkディレクトリ内にJava用とFlex用のそれぞれのライブラリが格納されている。これらのライブラリを利用してJavaとAIRアプリケーションの連携を実現する。なお、それぞれのAPIドキュメントはdocディレクトリ以下にある。

Merapiの簡単な利用方法は公式サイトにも掲載されている。例えばAIRのActionScriptからメッセージを送るには、MessageクラスとBridgeクラスを用いて次のように行う。

var message : Message = new Message();
message.data = "Hello from Merapi Flex.";
message.type = "Reply";
Bridge.instance.sendMessage(message);

Messageは交換するデータを格納するためのクラスで、typeプロパティには任意のメッセージタイプをString型で、dataプロパティには送りたいデータをObject型で指定する。上記の方法以外に、コンストラクタの第一引数にメッセージタイプを、第二引数にデータを直接指定してインスタンスを生成する方法もある。Bridgeはメッセージ交換のブリッジの役割を果たすクラスである。

Java側からメッセージを送信するには次のようにする。ActionScriptの場合と同様に、Messageクラスのコンストラクタに直接メッセージタイプとデータを指定する方法もある。

Bridge bridge = Bridge.getInstance();
Message message = new Message();
message.setData("Hello from Merapi Java.");
message.setType("Reply");
bridge.sendMessage(message);

一方、送られたメッセージを受け取るには、Flex側では次のように記述する。

<merapi:BridgeInstance id="bridge" result="handleResult(event)" />

<mx:Script>
  <![CDATA[
    private function handleResult(event : ResultEvent) : void {
        var message : IMessage = event.result as IMessage;
        ........
  ]]>
</mx:Script>

BridgeInstanceクラスはEventDispatcherであり、これを利用してメッセージを受信した際に発生するイベント(merapi.events.MerapiEvent)を受け取るためのハンドラを登録する。あとはそのハンドラ内でイベントオブジェクトからデータを取り出せばよい。

Java側でメッセージを受け取るには次のようにする。

Bridge.getInstance().registerMessageHandler("Reply", messageHandlerInstance);

public void handleMessage(IMessage message) {
  System.out.println(((Message)message).getData());
}

こちらはBridgeオブジェクトに対してハンドラクラス(IMessageHandlerインタフェースの実装クラス)のインスタンスを登録する。IMessageHandlerインタフェースには実際のイベントハンドラとなるhandleMessage()メソッドが定義されているので、これを実装して受け取ったメッセージを処理すればよい。