ネイティブ拡張パッケージにリソースを含める

拡張の ActionScript 側とネイティブコード側では、画像などの外部リソースを使用する場合があります。

ActionScript 側では、プラットフォームに依存しない SWC ファイルに、必要なリソースを含めることができます。プラットフォームに依存する SWF ファイルにリソースが必要な場合は、プラットフォームに依存するディレクトリ構造(ADT コマンドで指定)内にリソースを含めます。

ネイティブコード側でも、プラットフォームに依存するディレクトリ構造にリソースを含めることができます。ネイティブコードディレクトリと相対的な位置にあるサブディレクトリ内の、ネイティブコードで想定されている場所に、リソースを配置します。ADT では、ANE をパッケージ化するときに、このディレクトリ構造を保持します。

Android デバイスおよび iOS デバイスでリソースを使用する場合も、いくつかの追加要件があります。

Android デバイス上のリソース

Android-ARM プラットフォームの場合は、ネイティブコードライブラリを含むディレクトリに対して相対的な位置にある res というサブディレクトリにリソースを配置します。developer.android.com にある「Providing Resources」の説明に従って、ディレクトリにリソースを配置します。ADT では、ANE ファイルをパッケージ化するときに、生成される ANE パッケージの Android-ARM/res ディレクトリにリソースが配置されます。

拡張の Java ネイティブコードライブラリからリソースにアクセスするときは、FREContext クラスの getResourceID() メソッドを使用します。標準の Android リソース ID メカニズムを使用してリソースにアクセスしないでください。getResourceID() メソッドについて詳しくは、メソッドの詳細を参照してください。

getResourceId() メソッドは、リソース名の文字列パラメーターを使用します。アプリケーション内の拡張間におけるリソース名の競合を回避するために、拡張内の各リソースファイルには一意の名前を指定してください。例えば、リソース名の先頭に拡張 ID を付け、com.sample.ext.MyExtension.myImage1.png のようなリソース名を作成します。

R.* メカニズムを使用したネイティブリソースへのアクセス

以前のリリースでは、Android ネイティブ拡張のネイティブの Android リソースにアクセスするには、getResourceID() API を使用する必要がありました。R.* メカニズムを ANE とともに使用することはできませんでした。AIR 4.0 以降では、R.* メカニズムを使用してリソースにアクセスできます。R.* メカニズムを使用する場合は、プラットフォーム記述ファイル(platform.xml)を使用してください。このファイルには、すべての依存関係が定義されています。

<?xml version="1.0"?> 
                            <xs:schema 
                            xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                            targetNamespace="http://ns.adobe.com/air/extension/4.0" 
                            xmlns="http://ns.adobe.com/air/extension/4.0" 
                            elementFormDefault="qualified"> 
                            <xs:element name="platform"> 
                            <xs:complexType> 
                            <xs:all> 
                            <xs:element name="description"   type="LocalizableType" minOccurs="0"/> 
                            <xs:element name="copyright"     type="xs:string"       minOccurs="0"/> 
                            <xs:element name="packagedDependencies" minOccurs="0"> 
                            <xs:complexType> 
                            <xs:all> 
                            <xs:element name="packagedDependency" type="name" minOccurs="0" maxOccurs="unbounded"/> 
                            </xs:all> 
                            </xs:complexType> 
                            </xs:element> 
                            <xs:element name="packagedResources" minOccurs="0"> 
                            <xs:complexType> 
                            <xs:all> 
                            <xs:element name="packagedResource" minOccurs="0" maxOccurs="unbounded"/> 
                            <xs:complexType> 
                            <xs:all> 
                            <xs:element name="packageName" type="name" minOccurs="0"/> 
                            <xs:element name="folderName" type="name" minOccurs="0"/> 
                            </xs:all> 
                            </xs:complexType> 
                            </xs:all> 
                            </xs:element> 
                            </xs:complexType> 
                            </xs:element> 
                            </xs:all> 
                            </xs:complexType> 
                            </xs:element> 
                            <xs:simpleType name="name"> 
                            <xs:restriction base="xs:string"> 
                            <xs:pattern value="[A-Za-z0-9\-\.]{1,255}"/> 
                            </xs:restriction> 
                            </xs:simpleType> 
                            <xs:complexType name="LocalizableType" mixed="true"> 
                            <xs:sequence> 
                            <xs:element name="text" minOccurs="0" maxOccurs="unbounded"> 
                            <xs:complexType> 
                            <xs:simpleContent> 
                            <xs:extension base="xs:string"> 
                            <xs:attribute name="lang" type="xs:language" use="required"/> 
                            </xs:extension> 
                            </xs:simpleContent> 
                            </xs:complexType> 
                            </xs:element> 
                            </xs:sequence> 
                            </xs:complexType> 
                            </xs:schema>

platform.xml 内に定義された依存関係の例を次に示します。

<packagedDependencies> 
                            <packagedDependency>android-support-v4.jar</packagedDependency> 
                            <packagedDependency>google-play-services.jar</packagedDependency> 
                            </packagedDependencies> 
                            <packagedResources> 
                            <packagedResource> 
                            <packageName>com.myane.sampleasextension</packageName> 
                            <folderName>ane-res</folderName> 
                            </packagedResource> 
                            <packagedResource> 
                            <packageName>com.google.android.gms</packageName> 
                            <folderName>google-play-services-res</folderName> 
                            </packagedResource> 
                            </packagedResources>

次に、各指定項目について説明します。

  • packagedDependencies は、ANE が依存するすべての jar の名前を指定するために使用します。

  • packagedResources は、ANE またはその他の jar ファイルが使用するリソースを定義します。

  • folderName は、リソースフォルダーの名前を定義します。

  • packageName は、リソースを使用する jar のパッケージ名を定義します。

  • packagedDependenciespackagedResources は拡張の名前空間 4.0 以降から使用できます。

Android-ARM フォルダーには、ANE jar ファイルとリソースおよびサードパーティの jarファイルがすべて格納されます。サンプルの ANE パッケージ化コマンドを次に示します。

bin/adt -package -target ane sample.ane extension.xml -swc sampleane.swc -platform Android-ARM -platformoptions platform.xml -C Android-ARM .

R.* リソースアクセスメカニズムを使用する場合、サードパーティの jar ファイルとリソースを ANE jar とリソースに結合する必要はありません。ADT は jar とリソースを内部で結合します。すべての依存関係とリソースは引き続き ANE にパッケージ化する必要があります。

次の点に注意してください。

  • ANE プロジェクトは、使用する R.* リソースアクセスメカニズム用のライブラリプロジェクトである必要があります。

  • リソースフォルダーの名前に制限はありません。「res」またはその他の任意の有効な文字列で始まる名前を使用できます。

  • ANE のパッケージ化で -platformoptions スイッチを使用しない場合は、getResourceId() メカニズムを使用してリソースにアクセスする必要があります。

iOS デバイス上のリソース

リソースの場所

ADT を使用して iOS デバイス用の ANE ファイルを作成する前に、ネイティブコードライブラリを含むディレクトリに、ローカライズされていないリソースを配置します。ローカライズされているリソースは、次の節で説明するように、サブディレクトリに配置されます。

ただし、iOS アプリケーションバンドルでは、アプリケーションバンドルディレクトリの最上位にリソースが含まれています。このようなリソースには、各拡張のプラットフォーム固有の部分で使用されるすべてのリソースが含まれます。AIR アプリケーション開発者が ANE ファイルをアプリケーションと共にパッケージ化すると、ADT では次の処理が行われます。

  1. ANE パッケージの iPhone-ARM ディレクトリの内容を確認します。

  2. そのディレクトリ内の library.swf を除くすべてのファイルおよび拡張記述ファイルを、リソースファイルと見なします。

  3. リソースファイルをアプリケーションの最上位ディレクトリに移動します。

複数の拡張からのリソースファイルが同じ場所に移動されるので、リソースファイル名が競合する可能性があります。競合が発生した場合、ADT ではアプリケーションがパッケージ化されず、エラーが報告されます。したがって、拡張内の各リソースファイルには一意の名前を指定してください。例えば、名前の先頭に拡張 ID を付け、com.sample.ext.MyExtension.myImage1.png のようなリソース名を作成します。

注意: リソースは、拡張のディレクトリではなく、アプリケーションの最上位ディレクトリにあります。したがって、リソースにアクセスするには、ActionScript プロパティ File.applicationDirectory を使用します。ActionScript API ExtensionContext.getExtensionDirectory() を使用して拡張ディレクトリに移動し、リソースを検索することはしないでください。リソースは、そこにはありません。

ローカライズされたリソース

拡張のネイティブコードライブラリ(ActionScript 側ではない)では、ローカライズされたリソースを使用できます。ローカライズされたリソースを使用するには、次の手順を実行します。

  • ADT を使用して ANE ファイルを作成するときに指定したプラットフォーム固有のディレクトリで、ローカライズされたリソースを言語固有のサブディレクトリに配置します。これらのサブディレクトリに、それぞれ次のように名前を付けます。

    language[_region].lproj

    language および region の値を、iOS の規則に従って設定します。iOS Developer Library の「Language and Locale Designations」を参照してください。

  • developer.apple.com/library/ios/navigation で説明されている形式で、ローカライズされた文字列を .strings ファイル内に指定します。ただし、どのファイルにも、Localizable.strings という名前は付けないでください。これはアプリケーションバンドルで使用されるデフォルト名であるからです。

以下のディレクトリ構造は、ANE ファイルにパッケージ化するすべての iOS プラットフォーム固有ファイルを含むディレクトリの例です。

platform/ 
                            iOS/ 
                            library.swf 
                            myNativeLibrary.a 
                            myNonLocalizedImage1.jpg 
                            de.lproj/ 
                            MyGermanLocalizable.strings 
                            MyGermanLocalizedImage1.png 
                            en_us.lproj/ 
                            MyAmericanLocalizable.strings 
                            MyAmericanLocalizedImage1.png 
                            en_gb.lproj/ 
                            MyBritishLocalizable.strings 
                            MyBritishLocalizedImage1.png