ネイティブ拡張のアーキテクチャ

アーキテクチャの概要

AIR で拡張を使用すると次のことができます。

  • ActionScript から、ネイティブコードで実装された関数を呼び出します。

  • ActionScript とネイティブコードの間でデータを共有します。

  • ネイティブコードから ActionScript にイベントを送出します。

ネイティブ拡張を作成する際には、次の項目を設定します。

  • ユーザー定義の ActionScript 拡張クラス。これらの ActionScript クラスでは、ネイティブコードにアクセスし、ネイティブコードとデータを交換できる、ビルトインの ActionScript API を使用します。

  • ネイティブコード実装。ネイティブコードでは、ユーザーの ActionScript 拡張クラスにアクセスし、それらとデータを交換できる、ネイティブコード API を使用します。

  • ActionScript 拡張クラスまたはネイティブコードが使用する、画像などのリソース。

ネイティブ拡張では、複数のプラットフォームをターゲットにすることができます。複数のプラットフォームをターゲットにする場合は、それぞれのターゲットプラットフォーム向けに、異なる ActionScript 拡張クラスおよびネイティブコード実装のセットを作成できます。詳しくは、 複数プラットフォームのターゲット を参照してください。

次の図に、ネイティブ拡張、AIR ランタイム、デバイスの間で連携する様子を示します。

フルサイズのグラフィックを表示
ネイティブ拡張のアーキテクチャ

ネイティブコードのプログラミング言語

Adobe AIR では、ネイティブコード実装が ActionScript 拡張クラスとの連携に使用する、ネイティブコード API が提供されます。これらの API は次の言語で使用できます。

  • C プログラミング言語

  • Java

ネイティブコード実装では、C API または Java API のいずれかを使用して(ただし両方同時には使用しない)、ActionScript 拡張クラスを操作します。ただし、残りのネイティブコード実装で、API と異なる言語を使用しても問題はありません。例えば、C API を使用する開発者は次の言語も使用できます。

  • C++

  • Objective-C

  • アセンブラコード(高度に最適化されたルーチンの活用)

次の表に、ターゲットデバイスに応じて使用すべき拡張 API を示します。

デバイス

使用するネイティブコード API

Android デバイス

Java API と Android SDK

C API と Android NDK

iOS デバイス

C API

Blackberry PlayBook

C API

Windows デスクトップデバイス

C API

Mac OS X デスクトップデバイス

C API

複数プラットフォームのターゲット

ネイティブ拡張では、複数のプラットフォームをターゲットにすることが多くあります。例えば、1 つの拡張が、iOS を実行しているデバイスと Android を実行しているデバイスをターゲットとする場合があります。この場合、ネイティブコード言語を含む、ActionScript クラス実装およびネイティブコード実装はターゲットプラットフォームに基づいて変更できます。

ベストプラクティスとしては、ActionScript 拡張クラスで、実装にかかわらず同じ ActionScript パブリックインターフェイスを提供します。常に同じパブリックインターフェイスを使用することで、真のクロスプラットフォームネイティブ拡張となります。ActionScript パブリックインターフェイスが同じで、ActionScript 実装が異なる場合は、プラットフォームごとに別々の ActionScript ライブラリを作成します。

一部のターゲットプラットフォームに対して、ネイティブコード実装を含まない拡張を作成することもできます。このような拡張は、次のような場合に便利です。

  • 一部のターゲットプラットフォームのみが、目的の機能のネイティブ実装をサポートしている場合。

    拡張はこれらのプラットフォームのみでネイティブ実装を使用できますが、他のプラットフォーム上では ActionScript 専用の実装を使用します。例えば、コンピュータープロセス間通信のための特殊なメカニズムを提供するプラットフォームがあるとします。このプラットフォーム用の拡張にはネイティブ実装を用意します。他のプラットフォーム用の同じ拡張は、ActionScript Socket クラスを使用した ActionScript 専用の拡張とします。

    アプリケーション開発者が拡張を使用するときには、異なるターゲットプラットフォーム上で拡張がどのように実装されているのかを知らなくても、1 つのアプリケーションを記述できます。

  • 拡張をテストする場合。

    モバイルデバイスの特定の機能を使用するネイティブ拡張があるとします。この場合、デスクトップ向けの ActionScript 専用の拡張を作成できます。次に、アプリケーション開発者は、実際のターゲットデバイスでテストする前に、開発中にシミュレーションテストを行うためにデスクトップ拡張を使用できます。同様に、拡張の開発者は、ネイティブコード実装と連携する前に、ActionScript 側の拡張をテストできます。

拡張をパブリッシュするときに、拡張記述ファイル内の <platform> エレメントでターゲットプラットフォームを指定できます。個々の <platform> エレメントには、ターゲットの名前を指定します(例: iPhone-ARM Windows-x86 )。また、 default という名前の <platform> エレメントを指定することもできます。 default プラットフォームには、 <platform> エレメントで指定されていないすべてのプラットフォームで使用する ActionScript 専用の実装があります。詳しくは、 ネイティブ拡張記述ファイル を参照してください。

注意: 少なくとも 1 つのターゲットプラットフォームの実装に、ネイティブコードが含まれている必要があります。ネイティブコードを必要とするターゲットプラットフォームがない場合は、ネイティブ拡張の使用は、適切な方法ではありません。その場合は SWC ライブラリを作成します。

ランタイムでの拡張の利用

アプリケーションはランタイムで、次のいずれかの方法でネイティブ拡張を利用できます。

アプリケーションバンドル
拡張は AIR アプリケーションと共にパッケージ化され、アプリケーションと共にターゲットデバイスにインストールされます。通常、拡張パッケージには、複数のプラットフォーム用のネイティブ実装と ActionScript 実装が含まれますが、1 つのプラットフォーム専用のネイティブ実装と ActionScript 実装が含まれる場合もあります。また、サポート対象外のプラットフォーム用またはテストプラットフォーム用に、ActionScript 専用の実装も含まれる場合があります。

デバイスバンドル
拡張は、ターゲットデバイス上のディレクトリ内に、AIR アプリケーションとは独立してインストールされます。デバイスバンドルを使用するには、通常、デバイス製造元の協力を得て、デバイス上に拡張をインストールします。

次の表に、アプリケーションバンドルとデバイスバンドルに関するデバイスのサポート状況を示します。

アプリケーションバンドル

デバイスバンドル

Android

不可

iOS

不可

Blackberry PlayBook

Windows

不可

Mac OS X

不可

拡張コンテキスト

ネイティブ拡張は、アプリケーションが実行されるたびに 1 回ロードされます。ただし、ネイティブ実装を使用するには、拡張の ActionScript 側で特殊な ActionScript API を呼び出して、「拡張コンテキスト」を作成します。

ネイティブ拡張では次のいずれかの操作を実行できます。

  • 拡張コンテキストを 1 つだけ作成します。

    拡張コンテキストを 1 つだけ作成する方法は、ネイティブ実装で 1 つの関数セットのみを提供するシンプルな拡張で一般的です。

  • 共存する複数の拡張コンテキストを作成します。

    複数の拡張コンテキストは、ActionScript オブジェクトをネイティブオブジェクトと関連付けるのに便利です。ActionScript オブジェクトとネイティブオブジェクト間の関連のそれぞれが、1 つの拡張コンテキストインスタンスとなります。これらの拡張コンテキストインスタンスには異なるコンテキストタイプを設定できます。ネイティブ実装は各コンテキストタイプ用に、異なる関数セットを提供できます。

それぞれの拡張コンテキストには、ネイティブ実装内で定義して使用するコンテキスト固有のデータを含めることができます。

拡張コンテキストは、拡張内の ActionScript コードでのみ作成できます。ネイティブコードやアプリケーションコードでは作成できません。