アクセシビリティ
有川 榮一氏

有川 榮一氏

Arikawa Eiichi

作成日:
2011年12月14日
ユーザレベル:
すべて
製品:
Adobe AIR
Flex
Flash Builder

ネイティブ拡張(Native Extensions)入門
第3回 ネイティブ拡張の開発方法 後編

ネイティブ拡張を開発するには、下記のような手順で行います。

  1. ネイティブ拡張ライブラリの作成
  2. ネイティブ拡張ActionScriptライブラリの作成
  3. ネイティブ拡張記述ファイルの作成
  4. ANEファイルへパッケージング

図1 ANEファイルの作成に必要な要素と手順

図1 ANEファイルの作成に必要な要素と手順

前編では、「1. ネイティブ拡張ライブラリの作成」までを解説しました。後編では2~4、そして作成したANEファイルのAIRアプリケーションへの組み込む方法についても解説します。

サンプル:ANEsamples.zip

必要なもの

Adobe AIR 3 SDK


Flex SDK 4.6


Flash Builder 4.6


Eclipse

XCode

 

ネイティブ拡張ActionScriptライブラリの作成

ネイティブ拡張ActionScriptライブラリとは、ネイティブ拡張ライブラリを呼び出すためのActionScriptライブラリのことです。ANEファイルは、このネイティブ拡張ActionScirptライブラリと、前編で解説したネイティブ拡張ライブラリを組み合わせて作成します。また、ネイティブ拡張ActionScriptライブラリの作成には、Flash Builderを使用することをおすすめします。

ネイティブJava API/C APIで作成したネイティブ拡張ライブラリと連携するためには、ActionScirptのExtensionContextクラスを使用します。その際、以下の処理を行います。

ネイティブ拡張コンテキストの取得

ExtensionContext.createExtensionContextを呼び出してネイティブ拡張コンテキストを取得します。拡張IDは、ネイティブ拡張記述ファイルで指定する値と一致させます。

var extContext:ExtensionContext = ExtensionContext.createExtensionContext(拡張ID, コンテキスト作成引数);

ネイティブ拡張関数の呼び出し

ネイティブ拡張コンテキストに登録されているネイティブ拡張関数を呼び出すには、ExtensionContextインスタンスのcall関数を使って呼び出します。

extContext.call(ネイティブ拡張関数名, ネイティブ拡張関数引数);

サンプルでは、ネイティブ拡張ライブラリに登録されているGetHelloWorld関数を呼び出すクラスを作成します。

ソースコード:Ane/HelloWorldExtension/src/example/ane/HelloWorldExtension.as

package example.ane
{
    import flash.events.EventDispatcher;
    import flash.external.ExtensionContext;
    import flash.system.Capabilities;

    public class HelloWorldExtension extends EventDispatcher
    {
        private var context:ExtensionContext;

        public function HelloWorldExtension()
        {
            //ネイティブ拡張コンテキストを生成
            context=ExtensionContext.createExtensionContext("example.ane", "type");
        }

        public function getHelloWorld():String
        {
            return context.call("GetHelloWorld") as String;
        }

        public function dispose():void
        {
            return context.dispose();
        }
    }
}

コンパイル時は、図2のように[プロパティ]ウインドウの[追加コンパイラー引数]に「-swf-version 13」を指定してSWCを作成します。

図2 コンパイル引数の設定

図2 コンパイル引数の設定

図3 ネイティブ拡張ActionScriptライブラリ作成用のファイル構成

図3 ネイティブ拡張ActionScriptライブラリ作成用のファイル構成

 

ネイティブ拡張記述ファイルの作成

ネイティブ拡張記述ファイルは、ネイティブ拡張ライブラリについて定義したXMLファイルです。このファイルは、ANEファイルの作成時と、ANEファイルをAIRアプリに組み込む際に必要となります。

ネイティブ拡張記述ファイルのルートextensionタグの名前空間、AIRのバージョン、SWFのバージョンは下表のようになります。

名前空間とAIRバージョンとSWFバージョンの関係
名前空間 AIRバージョン ANEファイルに含まれるSWFファイルのバージョン
ns.adobe.com/air/extension/2.5 AIR 2.5(AIR for TV only) 10
ns.adobe.com/air/extension/2.5 AIR 3+ 13
ns.adobe.com/air/extension/3.1 AIR 3.1+ 14

次に、記述ファイルで使用する主なタグについて説明します。

<id>:

このIDは、ActionScriptからネイティブ拡張を指定する際に使います。

<nativeLibrary>:

ネイティブ拡張ライブラリのファイルを指定します。

<platform>:

プラットフォームを指定します。name要素には、下記のようなプラットフォームを示す値を入れます。

platformタグのname要素の値
name要素の値 プラットフォーム デバイス
Windows-x86 Windows Windowsデスクトップ
MacOS-x86 Mac OS Mac OSデスクトップ
Android-ARM Android Androidデバイス
iPhone-ARM iOS iPad、iPhone、iPod touch
QNX-ARM BlackBerry Tablet OS BlackBerry PlayBook
default プラットフォームが指定されていない場合 -

なお、AIR Debug Launcher(ADL)を使用したシミュレーターでアプリを実行した場合のプラットフォームは、defaultが選択されます。

<initializer>:

ネイティブJava APIの場合は、FREExtensionを実装したクラスの完全限定名を指定します。ネイティブC APIの場合は、初期関数名を指定します。

<finalizer>:

Java APIの場合は、FREExtensionを実装したクラスの完全限定名を指定します。C APIの場合は、破棄関数名を指定します。

サンプルでは、下記のようなネイティブ拡張記述ファイルをextension.xmlとして作成しました。platformをAndroid-ARMとする場合、ここではネイティブJava APIで作ったネイティブ拡張ライブラリにある<initializer>/<finalizer>にexample.ane.android.HelloWorldExtensionクラスを指定していたのでそれを用います。

platformをiPhone-ARMとする場合は、ネイティブC APIで作ったネイティブ拡張ライブラリにあるinitializerにExtInitializer関数を、finalizerにExtFinalizer関数を指定していたのでそれを用います。

platformをdefaultとする場合は、ネイティブ拡張ライブラリの指定は必要ありません。

※ネイティブ拡張ライブラリについては、前編をご覧ください。

ソースコード:Ane/HelloWorldExtension/extension.xml

<extension xmlns="http://ns.adobe.com/air/extension/3.1"> 
    <id>example.ane</id> 
    <versionNumber>1.0.0</versionNumber> 
    <name> 
        <text xml:lang="en_US">Hello World</text> 
        <text xml:lang="ja_JP">こんにちは 世界</text> 
    </name> 
    <platforms> 
        <platform name="Android-ARM"> 
            <applicationDeployment> 
                <nativeLibrary>HelloWorldANE.jar</nativeLibrary> 
                <initializer>example.ane.android.HelloWorldExtension</initializer> 
                <finalizer>example.ane.android.HelloWorldExtension</finalizer> 
            </applicationDeployment> 
        </platform> 
        <platform name="iPhone-ARM"> 
            <applicationDeployment> 
                <nativeLibrary>libHelloWorldANE.a</nativeLibrary> 
                <initializer>ExtInitializer</initializer> 
                <finalizer>ExtFinalizer</finalizer> 
            </applicationDeployment> 
        </platform>
        <platform name="default"> 
            <applicationDeployment/> 
        </platform> 
    </platforms> 
</extension>

これでANEファイルに必要な3つのファイルが揃いました。

  • ネイティブ拡張ライブラリ
  • ネイティブ拡張ActionScriptライブラリ
  • ネイティブ拡張記述ファイル

 

ANEファイルへパッケージ

ANEファイルは、AIR Developer Tools(ADT)を使用して、ネイティブ拡張ライブラリとネイティブ拡張ActionScriptライブラリを組み合わせます。ADTでパッケージする前に、必要な作業が2点あります。

library.swfの抽出

ネイティブ拡張ActionScriptライブラリのSWCファイルは実はZIP形式なので、ZIPツールなどを使って展開することができます。そして展開したフォルダーの中にあるlibrary.swfをプラットフォームごとにコピーします。

証明書の作成

これは、Flash BuilderでAIRアプリ開発時に作成する証明書を使うことができます。ネイティブ拡張は、プラットフォームに深くアクセスすることもできます。そのようなネイティブ拡張を配布する際は、AIRのAdobe AIRコード署名証明書を利用すべきです。

ADTでANEファイルにパッケージするには、下記のようなコマンドで行います(※実際には1行)。

adt
-package
-storetype pkcs12 -keystore 証明書ファイル
-target ane ANEファイル名 ネイティブ拡張記述ファイル
-swc ネイティブ拡張ActionScriptライブラリ
-platform プラットフォーム名
-C プラットフォームディレクトリ .

サンプルでは下記のようなADTコマンドで、HelloWorldExtensionフォルダー直下でANEファイルにパッケージングします。(※実際には1行)。

adt
-package
-storetype pkcs12 -keystore test.p12
-target ane HelloWorldExtension.ane extension.xml
-swc bin/HelloWorldExtension.swc
-platform Android-ARM
-C platform/android .
-platform iPhone-ARM
-C platform/iphone .
-platform default
-C platform/default 

図4 複数プラットフォーム対応したネイティブ拡張ActionScriptライブラリのファイル構成

図4 複数プラットフォーム対応したネイティブ拡張ActionScriptライブラリのファイル構成、そして作成したANEファイル

 

AIRアプリへの組み込み

ANEファイルをAIRアプリに組み込む際にもADTを使います。AIR 3のADTは、プラットフォーム向けのアプリケーションファイルにパッケージングする際に、ネイティブ拡張を指定することができます。そのためには、extdirを使ってネイティブ拡張のANEファイルがあるフォルダーを指定します。 ADTは、パッケージングする際にアプリケーション記述ファイルで指定したネイティブ拡張IDと一致するネイティブ拡張を探します。そしてネイティブ拡張がプラットフォームに対応していた場合、ネイティブ拡張ライブラリを抽出してアプリケーションに同梱します。

ここまでの作業で、「HelloWorld」を出力するANEファイルを作成しました。そのANEファイルをAIRアプリに組み込んでみましょう。ボタンを押したらネイティブ拡張のGetHelloWorldネイティブ関数を呼び出して結果を表示するという、Flexモバイルアプリケーションを作成します。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" applicationDPI="160"
               width="100%" height="100%"
               >
    <fx:Script>
        <![CDATA[
            import example.ane.HelloWorldExtension;
            
            private var extension:HelloWorldExtension = new HelloWorldExtension();
            
            protected function button1_clickHandler(event:MouseEvent):void
            {
                debugDisplay.appendText(extension.getHelloWorld());
            }
        ]]>
    </fx:Script>
    <s:layout>
        <s:VerticalLayout horizontalAlign="justify"/>
    </s:layout>
    <s:Button label="call getHelloWorld"
              click="button1_clickHandler(event)"/>
    <s:TextArea id="debugDisplay" width="100%" height="100%"/>
</s:Application>

アプリケーション記述ファイルの追加

アプリケーションでネイティブ拡張を使うことを示すために、アプリケーション記述ファイルにネイティブ拡張のIDを指定します。

<extensions>
<extensionID>example.ane</extensionID>
</extensions>

各プラットフォーム向けアプリケーションファイルの作成

ネイティブ拡張を使うのでextdirを使ってANEファイルがあるフォルダーを指定します。そして、下記のようなADTコマンドでプラットフォームごとにアプリケーションファイルを作成します。

iOS向けアプリケーション(※実際には1行)

adt
-package
-storetype pkcs12 -keystore test.p12
-target ipa-debug HelloWorldExtensionAIR.ipa
bin-debug/HelloWorldMobile-app.xml
-C bin-debug HelloWorldMobile.swf
-extdir extdir

Android向けアプリケーション(※実際には1行)

adt
-package
-storetype pkcs12 -keystore test.p12
-target apk HelloWorldExtensionAIR.apk
bin-debug/HelloWorldMobile-app.xml
-C bin-debug HelloWorldMobile.swf
-extdir extdir

以上で完成です。

 

おわりに

本記事では、AIR 3のネイティブ拡張について、ネイティブ拡張ライブラリの作成からANEファイル作成まで順を追って解説しました。ネイティブ拡張について理解を深めることができたと思います。次回は、ネイティブAPIを用いてプラットフォームの機能を使ったネイティブ拡張の作成について説明します。

また、Flash Builder 4.6はネイティブ拡張に対応しており、コマンドラインを使うことなく容易にネイティブ拡張を組み込むことができるほか、ネイティブ拡張を使用したアプリケーションのデバック実行も可能になります。詳しくは、「Flash Builder 4.6 でネイティブ拡張(Native Extensions)を使ってみよう」をご覧ください。

 

関連情報

ネイティブ拡張(Native Extensions)入門

Flash Builder 4.6 でネイティブ拡張(Native Extensions)を使ってみよう

 

著者について

有川 榮一氏
Arikawa Eiichi @ AKABANA ( http://akabana.net )

アーキテクト兼プログラマーです。Flex/AIR/CF/FMS/Java/C#を使ったアプリケーションソフトウェア設計や開発を中心に仕事をしています。