読者です 読者をやめる 読者になる 読者になる

Adobe AIRとJavaを連携させてみる

Java AIR

やっと認証が通ったと通知が来たので早速ダウンロードして試してみました。
※追記
おそらくアカウント認証日本人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アプリを起動しボタンを教えてAIRJavaの通信を確認出来ます。

空いてるポートを使って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です!

netstatについて(追記)

コメントで教えてもらいましたが

netstat -noba

ネットスタット ハイフン ノバ で一発でした。とても勉強になりました。
ということで、netstatからのtasklistよりもnetstat -nobaです!

まとめ

Merapiは手軽にAIRJavaを連携させる事が出来ています。
AIRからSocketを使ってJavaと通信するものを作って、同様な事を作る人が出てきそうですね。
30分もあれば試せると思うのでMerapi使ってみてください。