Adobe Developer Connection(ADC)と連動する開発者向けイベント「ADC MEETUP ROUND3」では、General Sessionの他にHTML関連情報とFlash関連情報の2つのトラックが設けられた。FlashトラックのSession3では、大日本印刷株式会社の丸山真実氏により、Adobe AIR 3で新しく追加されたCaptive Runtimeとネイティブ拡張(Native Extensions)について、年内リリース予定のFlash Builder 4.6の使い方を交えて紹介が行われた。
従来のAIRアプリケーション(以下、AIRアプリ)の場合、ユーザが利用するためには、AIRアプリの他にAIRランタイム(以下、ランタイム)をインストールする必要があった。しかし、AIR 3で新しく追加されたCaptive Runtimeを使うと、AIRアプリの中にランタイムを同梱でき、各プラットフームに合わせて書き出せるようになる。つまり、Androidなら.apkに、Windowsなら.exeを含んだディレクトリに、Mac OSなら.appにランタイムを含めて書き出させるということだ。ちなみに、iOSはAIR 2.7からすでにCaptive Runtimeが可能になっている。
丸山氏はCaptive Runtimeのメリットとデメリットとして、以下の項目を挙げている。
| メリット | デメリット | |
|---|---|---|
|
|
|
「メリットとデメリットを把握した上で、どんなアプリケーションか、誰が使うのか、ターゲットのプラットフォームが何かを考慮して、Captive Runtimeを使うか使わないかを判断すればいい」と丸山氏は語る。
従来のAIRアプリはアドビが提供するランタイム環境で動かすアプリという印象だったが、Captive Runtimeを使うことで各プラットフォームのネイティブアプリのように扱えるようになり、AIRアプリの配布先がより明確になると感じた。
Flash Builder 4.5までは、Captive Runtimeを使うにはコマンドラインで設定する必要があるが、Flash Builder 4.6ではウインドウ上で簡単に設定できるようになっている。下図のように、書き出しオプションで従来の方法かCaptive Runtimeを使用する方法かを選ぶだけでいい。

図2.1 モバイル向けプロジェクトの場合

図2.2 デスクトップ向けプロジェクトの場合
様々なプラットフォームやデバイス環境で動作するAIRだが、その反面、ジャイロセンサー(gyro sensor)/バイブレーション(vibration)/ブルートゥース(bluetooth)などのプラットフォーム/デバイス固有の機能やAPIを利用することができなかった。しかし、AIR 3で新しく追加されたネイティブ拡張(Native Extensions)を使うと、AndroidならJava、iOSならObjective-CやC++などのネイティブコードとActionScript 3.0を連携させ、これらの固有の機能やAPIを利用することができるようになる。
ネイティブ拡張の仕組みを見ると、拡張機能はAIRアプリとランタイムの間に存在し、その中はネイティブコードとActionScript拡張クラス、そして関連リソースをパッケージ化したものが含まれている。

図3.1 ネイティブ拡張の仕組み
ネイティブ拡張ファイルの拡張子は.aneとなり、図4.1のようにネイティブコード/ActionScript拡張ライブラリ/ネイティブ拡張記述ファイル/証明書とを一緒に、AIR 3 SDKに含まれているADT(AIR Developer Tool)を利用してパッケージングすると生成される。ANEは複数のネイティブコードをまとめてパッケージング可能なので、1つのANEファイルで複数のプラットフォームに対応することが可能だ。

図4.1 ANEファイルの生成フロー
続いて、丸山氏はANEファイルの作成デモを行った。「Hello World」という文字列をネイティブコード(Java)から返して表示するというものだ。Javaのコードでは、FREExtensionインターフェイスを実装(implements)したクラスの中で、FREContextを拡張(extends)したExtensionContextを生成する。また、ExtensionContextでは、ActionScript拡張ライブラリで呼び出す関数名と、FREFunctionインターフェイスを実装したExtensionFunctionを登録している。

図4.2 HelloWorldデモのソースコード構造図
最終的に下記のコマンドで、ネイティブコードをライブラリ化したjarファイルと、ActionScript拡張クラスをライブラリ化したswcファイルをパッケージして、ANEファイルを生成できる。
adt -package -storetype pkcs12 -keystore "署名.p12" -target ane "出力したいファイル.ane" "ネイティブ拡張記述ファイル.xml" -swc "ライブラリプロジェクトで作成したSWC.swc" -platform "ターゲットプラットフォーム(例:Android-ARM)" library.swf "ネイティブライブラリ.jar"
Flash Builder 4.6ではビルドパスの部分に[ネイティブエクステンション]タブが追加されていて、ANEファイルを追加することができる。[ANEを追加]ダイアログの[AIRアプリケーション記述子を更新]にチェックを入れると、登録されているネイティブ拡張IDをアプリケーション記述ファイルに自動で設定してくれる。
![図5.1 Flexビルドパスで追加された[ネイティブエクステンション]タブ](/jp/joc/devnet/air/articles/images/fig5-1.jpg)
図5.1 Flexビルドパスで追加された[ネイティブエクステンション]タブ

図5.2 ANEファイルが設定された際の画面
また、パッケージ設定では自動で「ANEファイルの使用/不使用」「ターゲットプラットフォームへの対応/非対応」などを検証してくれる。既に使用中のANEファイルについては使用済みの部分に「鎖」マークが表示されるので、このマークを見てリリースビルドの際に不要なファイルが整理できる。
![図5.3 パッケージ設定時の[ネイティブエクステンション]タブ](/jp/joc/devnet/air/articles/images/fig5-3.jpg)
図5.3 パッケージ設定時の[ネイティブエクステンション]タブ

図5.4 サポートしてないデバイスにANEファイルを使うとした際のエラー表示
Flash Builder上のActionScriptでANEを呼び出すと、ActionScript拡張ライブラリに設定した関数名がコードヒントで表示される。

図5.5 ActionScript拡張ライブラリで設定した関数名のコードヒント

図5.6 完成したサンプルをAndroidタブレットで実行したところ
「Flash Builder 4.6を使うと、コマンドよりも簡単に書き出せる上に、ANEの情報を取得してデバイスと正しく連携されるかの検証も自動にしてくれるので、使いやすくなっている」と丸山氏は語る。そして、ネイティブ拡張を使うメリットとして以下の3つを挙げた。
もう1つのANEを適用したデモとして、迷路ゲームが紹介された。迷路を表示するアルゴリズムはJavaで、フロントの部分はActionScriptを利用して作成されている。このように制作リソースを分けて作業したい場合にもANEを利用することができる。
丸山氏が指摘するように、ANEファイル自体を作るにはネイティブコードの知識が必要で、パッケージングする作業も手間がかかるため、まだハードルが高い。しかし、ANEファイルを利用することは上記の通り、簡単にできる。すでにいくつかのANEファイルが公開・配布されているので、まずはANEファイルを使うことから試してみてはいかがだろうか。
なお、ADCには丸山氏による「Flash Builder 4.6でネイティブ拡張(Native Extensions)を使ってみよう」があるので、こちらも参考にしていただきたい。
ADC MEETUP ROUND03 レポート
【講演者】
大日本印刷株式会社にて、主にFlash/Flexの設計・開発に携わる。Adobe AIR Contest 2008でGrand Prix、2011年度はモバイルデバイス賞(リンク )を受賞。
【レポート執筆】
黄 聖實氏(ホァン ソンシル)
株式会社ミツエーリンクス
映像/音声本部 Flashユニット チーフFlashデベロッパー
2007年に株式会社ミツエーリンクス入社。これまで数多くのリッチコンテンツの開発を手掛け、現在は主にFlash Platformを中心にしたリッチコンテンツの設計・開発に携わる。新しい技術や人が楽しめるものに興味が深い。