Adobe AIRとJavaを連携させてみる
やっと認証が通ったと通知が来たので早速ダウンロードして試してみました。
※追記
おそらくアカウント認証日本人1番乗りなはず!
環境構築Java側
Java側で必要なライブラリは以下の4つ。
flex-messaging-common.jar
flex-messaging-core.jar
merapi-0.0.30.jar
tools.jar
サンプルがあるのですが、/Users/Buzzy/Desktop/等のclasspathの設定があったりザルです。
なのでサンプルは無視して、新規プロジェクトを作って上記ライブラリをclasspathに通せば準備OKです。
Java側で行うことは、IMessageHandlerをimplementsし、MessageHandlerを登録するだけです。
Javaからは、独自クラスをメッセージ送信してみました。
import merapi.Bridge; import merapi.messages.IMessage; import merapi.messages.IMessageHandler; import merapi.messages.Message; public class MerapiTest implements IMessageHandler { private static final String LISTENER_MSG_TYPE = "yone098"; public static void main(String x[]) { System.out.println("GO!GO!Merapi2!"); // メッセージハンドラ登録 Bridge br = Bridge.getInstance(); br.registerMessageHandler(LISTENER_MSG_TYPE, new MerapiTest()); } public void handleMessage(IMessage message) { try { System.out.printf("from Merapi Flex[%s]\n", message.getData()); TestData test = new TestData("Yonex!"); // メッセージ生成 Message response = new Message(LISTENER_MSG_TYPE, null, test); // メッセージ送信 Bridge.getInstance().sendMessage(response); } catch (Exception exception) { exception.printStackTrace(); } } }
環境構築AIR側
AIR側は特に問題なく取り込めますが、この際AIRのプログラムも独自で作りたいので新規でAIRプロジェクトを作ります。
必要なライブラリは以下
merapi-0.0.30.swc
こちらでは、merapi:BridgeInstanceを用意してMessageクラスを使ってやり取りします。
<?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:merapi="merapi.*"> <mx:Script> <![CDATA[ import merapi.messages.Message; import mx.rpc.events.ResultEvent; private function handleResult(e:ResultEvent):void { var ev:ResultEvent = ResultEvent(e); var msg:Message = Message(ev.result); if (msg.data != null) { var msgType:String = msg.type; // yone098 var x:Object = msg.data // Object型で取得 resText.text += x['msg'] + '\n'; } } private function sendMessage():void { var msg:Message = new Message('yone098', null, 'from Flex!'); // yone098を指定 bridge.sendMessage(msg); } ]]> </mx:Script> <merapi:BridgeInstance id="bridge" result="handleResult(event)"/> <mx:VBox> <mx:Button id="hello" label="call Merapi Java" click="sendMessage()"/> <mx:Text id="resText"/> </mx:VBox> </mx:WindowedApplication>
どんな通信をしているのか?
プログラムを動かすには、まずJava側を起動しておかないとAIRの起動時にエラーが発生します。
まずは、Javaのアプリを起動しておき、そのあとにAIRアプリを起動しボタンを教えてAIRとJavaの通信を確認出来ます。
空いてるポートを使ってAMF3通信してるんだろうなど思ったので複数回起動させると
java.net.BindException: Address already in use: JVM_Bind
おそらく空いてるポートを使って、通信を監視しているのでしょう。
merapi.BridgeListenerThreadクラスがそれに当たりそうです。
どのポートを使って通信しているか調べる
使ってるPCがWindowsXPなので、コマンドプロンプトから
>netstat -ano
Active Connections Proto Local Address Foreign Address State PID TCP 0.0.0.0:12345 0.0.0.0:0 LISTENING 264
怪しそうなプロセスIDが判明したので
>tasklist /svc /fi "PID eq 264"
イメージ名 PID サービス ============= ===== ============= javaw.exe 264 N/A
ビンゴです。Merapiは12345ポートを使って通信しているようです。
どのプログラムがどのポートを使っているか調べる時は
コマンドプロンプトでnetstatからのtasklistです!