将资源包括在本机扩展包中

您的扩展的 ActionScript 端和本机代码端有时使用外部资源,如图像。

在 ActionScript 端,独立于平台的 SWC 文件可以包括它需要的资源。如果依赖于平台的 SWF 文件需要资源,请将资源包括在您在 ADT 命令中指定的依赖于平台的目录结构中。

在本机代码端,还可以将资源包括在依赖于平台的目录结构中。将资源放在相对于本机代码库的子目录中本机代码期望的位置。ADT 在打包您的 ANE 时将保留此目录结构。

使用 Android 和 iOS 设备上的资源有一些额外要求。

Android 设备上的资源

对于 Android-ARM 平台,将资源放在与包含本机代码库的目录对应的名为 res 的子目录中。使用 developer.android.com 上的 提供资源 中所述的资源填充目录。当 ADT 打包 ANE 文件时,它将资源放在生成的 ANE 包的 Android-ARM/res 目录中。

当访问扩展的 Java 本机代码库中的资源时,请使用 FREContext 类中的 getResourceID() 方法。不要使用标准 Android 资源 ID 机制访问资源。有关 getResourceID() 方法的详细信息,请参阅 方法详细信息

getResourceId() 方法提取作为资源名的 String 参数。为避免资源名在一个应用程序的扩展之间发生冲突,请在扩展中为每个资源文件提供一个唯一名称。例如,通过在资源名前加扩展 ID 创建资源名,如 com.sample.ext.MyExtension.myImage1.png

使用 R.* 机制访问本机资源

在以前的版本中,只能使用 getResourceID() API 访问 Android 本机扩展中的本机 Android 资源,而不能对 ANE 使用 R.* 机制。从 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 文件的包名称。

  • packagedDependencies packagedResources 将从扩展命名空间 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

    根据 iOS 约定设置 language region 的值。请参阅 iOS 开发人员库中的 语言和区域设置目标

  • 使用 developer.apple.com/library/ios/navigation 中所述的格式将本地化字符串放入 .strings 文件。不过,不要将任何文件命名为 Localizable.strings ,因为该名称是应用程序绑定中使用的默认名称。

以下目录结构是一个目录示例,该目录将包含的所有特定于 iOS 平台的文件都打包在 ANE 文件中:

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