JavaとFlexの連携その1
今作っているアプリは、
というのが大雑把な流れだが(大雑把過ぎるか)、
1.が終わった後に2.を実行するために、JavaからAIRへメッセージを送る必要がある。
もっというと、(これは確定ではないが)MXMLを指定するUIをAIRで作るなら、
指定されたMXMLの情報(パスかMXMLそのもの)をJava側に送らなければいけない。
このAIRとJavaとの間でメッセージをやり取りするのに、
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>
これでAIRとJavaでメッセージの送受信が出来るようになる。
# もちろん、両方起動した状態にしておかないといけないが。
ただし、実際はこのMerapiは使わなかった。
というのも、ライブラリに含まれるtools.jarが6MBもあり、これを含めたjarを作ると巨大なファイルになるため。
# JREに含まれるtools.jarで代用が利くかどうかは、未検証
結局、定番のBlazeDSを使用した。
それはまた別のお話。