JavaとFlexの連携その1

今作っているアプリは、

  1. JavaMXMLをビルドする
  2. AIRでSWFを表示する

というのが大雑把な流れだが(大雑把過ぎるか)、
1.が終わった後に2.を実行するために、JavaからAIRへメッセージを送る必要がある。
もっというと、(これは確定ではないが)MXMLを指定するUIをAIRで作るなら、
指定されたMXMLの情報(パスかMXMLそのもの)をJava側に送らなければいけない。


このAIRJavaとの間でメッセージをやり取りするのに、
Merapiというライブラリを使ってみた。


このライブラリの入手方法は、こちらの参考記事にお任せして(オイ!)、
早速Java/AIR双方のコードを。
まずJava側でメッセージを送受信するクラス。

package {
    public static void main(String[] args) {
         MessageBroker massageBroker = new MessageBroker("merapiConnection");
         massageBroker.sendMessage("Dear Flex, I'm Java");
    }
}

import merapi.Bridge;
import merapi.messages.Message;
import merapi.messages.IMessage;
import merapi.messages.IMessageHandler;

public class MessageBroker implements IMessageHandler {

    // 接続文字列
    private String connectionString="";
    // コンストラクタ
    public void MessageBroker(String connectionString) {
        // メッセージハンドラを登録
        this.connectionString = connectionString;
        Bridge.getInstance().registerMessageHandler(this.connectionString, this);
    }

    // メッセージを受信する
    public void handleMessage(IMessage message) {
        try {
            // メッセージを受け取って表示
            System.out.println("Get data from flex: " + ((Message)message).getData());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    // メッセージを送信する
    public void sendMessage(Object message) {
        // メッセージを作成して送信
        Message message = new Message(this.connectionString, message);
        try {
            Bridge.getInstance().sendMessage(response);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}


次にAIR側のコード。

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import merapi.BridgeInstance;
            import merapi.messages.Message;

            import mx.controls.Alert;
            import mx.events.FlexEvent;
            import mx.rpc.events.ResultEvent;

            protected var _bridgeInstance:BridgeInstance;
            private function onCreationComplete(event:FlexEvent):void {
                _bridgeInstance = new BridgeInstance();
                _bridgeInstance.addEventListener(
                    ResultEvent.RESULT,
                    bridgeInstanceResultHandler);
            }

            private function bridgeInstanceResultHandler(event:ResultEvent): void {
                // メッセージを受け取って表示
                var message:Message = event.result as Message;
                if (message.data != null) {
                    var data:Object = message.data
                    Alert.show(data, "受信メッセージ");
                }
            }

            private function sendMessage(messageString:String): void {
                // メッセージを作成して送信
                var message:Message = new Message("merapiConnection", messageString);
                bridgeInstance.sendMessage(message);
            }
        ]]>
    </mx:Script>
    <mx:Button click="sendMessage('Dear Java, I'm Flex');"/>
</mx:WindowedApplication>

これでAIRJavaでメッセージの送受信が出来るようになる。
# もちろん、両方起動した状態にしておかないといけないが。


ただし、実際はこのMerapiは使わなかった。
というのも、ライブラリに含まれるtools.jarが6MBもあり、これを含めたjarを作ると巨大なファイルになるため。
# JREに含まれるtools.jarで代用が利くかどうかは、未検証


結局、定番のBlazeDSを使用した。
それはまた別のお話。