创建本机扩展包

要将您的本机扩展提供给应用程序开发人员,需要将所有相关的文件打包到一个 ANE 文件中。ANE 文件是一个存档文件,它包含:

  • 扩展的 ActionScript 库

  • 扩展的本机代码库

  • 扩展描述符文件

  • 扩展的证书

  • 扩展的资源,如图像。

使用 AIR 开发人员工具 (ADT) 创建 ANE 文件。ADT 的完整文档位于 AIR 开发人员工具 中。

打包扩展的 ADT 示例

下例说明如何使用 ADT 打包 ANE 文件。本示例打包 ANE 文件,以便与在以下设备上运行的应用程序一起使用:

  • Android 设备。

  • Android x86 设备。

  • iOS 设备。

  • iOS Simulator。

  • 使用默认的仅 ActionScript 实现的其他设备。

adt -package <signing options> -target ane MyExtension.ane MyExt.xml -swc MyExtension.swc     -platform Android-ARM -C platform/Android . 
                        -platform Android-x86 -C platform/Android-x86 . 
                        -platform iPhone-ARM -platformoptions platform.xml 
                        abc/x.framework lib.o -C platform/ios . 
                        -platform iPhone-x86 -C platform/iosSimulator 
                        -platform default -C platform/default library.swf

在本示例中,使用以下命令行选项创建 ANE 包:

  • <signing options>

    您可以选择对 ANE 文件签名。有关详细信息,请参阅 为本机扩展创建签名证书

  • -target ane

    -target 标志指定要创建哪种类型的包。使用 ane 目标打包本机扩展。

  • MyExtension.ane

    指定要创建的包文件的名称。使用 .ane 文件扩展名。

  • MyExt.xml

    指定扩展描述符文件。该文件指定扩展 ID 和支持的平台。AIR 使用此信息定位并加载应用程序的扩展。在本示例中,扩展描述符是:

    <extension xmlns="http://ns.adobe.com/air/extension/3.1"> 
                                    <id>com.sample.ext.MyExtension</id> 
                                    <versionNumber>0.0.1</versionNumber> 
                                    <platforms> 
                                    <platform name="Android-ARM"> 
                                    <applicationDeployment> 
                                    <nativeLibrary>MyExtension.jar</nativeLibrary> 
                                    <initializer>com.sample.ext.MyExtension</initializer> 
                                    </applicationDeployment> 
                                    </platform> 
                                    <platform name="Android-x86"> 
                                    <applicationDeployment> 
                                    <nativeLibrary>MyExtension.jar</nativeLibrary> 
                                    <initializer>com.sample.ext.MyExtension</initializer> 
                                    </applicationDeployment> 
                                    </platform>  
                                    <platform name="iPhone-ARM"> 
                                    <applicationDeployment> 
                                    <nativeLibrary>MyExtension.a</nativeLibrary> 
                                    <initializer>InitMyExtension></initializer> 
                                    </applicationDeployment> 
                                    </platform> 
                                    <platform name="iPhone-x86"> 
                                    <applicationDeployment> 
                                    <nativeLibrary>MyExtension.a</nativeLibrary> 
                                    <initializer>InitMyExtension></initializer> 
                                    </applicationDeployment> 
                                    </platform> 
                                    <platform name="default"> 
                                    <applicationDeployment/> 
                                    </platform> 
                                    </platforms> 
                                    </extension>

    有关详细信息,请参阅 本机扩展描述符文件

  • MyExtension.swc

    指定包含扩展的 ActionScript 端的 SWC 文件。

  • -platform Android-ARM -C platform/Android . -platform Android-x86 -C platform/Android-x86 .-platform iPhone-ARM -platformoptions platform.xml-Cplatform/iOS.

    -platform 标志指定此 ANE 文件支持的平台。该名称后面的选项指定在何处查找特定于平台的库和资源。在本示例中, Android-ARM 平台的 -C 选项指示将相对目录 platform/Android 作为工作目录。后面的目录和文件都是相对于新工作目录。

    因此,在本示例中,相对目录 platform/Android 包含所有 Android 本机代码库和资源。它还包含特定于 Android 平台的 library.swf 文件和任何其他特定于 Android 平台的 SWF 文件。

    iPhone-ARM 平台的 -platformoptions 标志是一个可选项,用于指定特定于平台的选项。这些选项包含用于链接到 iOS 框架(而不是默认项)以及将第三方静态库绑定到本机扩展的选项。请参阅 iOS 本机库

  • -platform default -C platform/default library.swf

    -platform 选项指定 default 平台时,请不要指定任何本机代码文件。仅指定一个 library.swf 文件,和其他 SWF 文件(如果有)。

ANE 包中的 SWC 文件和 SWF 文件

您在 ADT 打包命令的 -swc 选项中指定一个 SWC 文件。此 SWC 文件是您的 ActionScript 库。它包含一个名为 library.swf 的文件。ADT 将 library.swf 从 SWC 文件放入 ANE 文件。当 AIR 应用程序使用本机扩展时,它在其库路径中包括该扩展的 ANE 文件,以便该应用程序可以编译。事实上,该应用程序根据 library.swf 中的公共接口进行编译。

有时,您需要为每个目标平台分别创建一个不同的 ActionScript 实现。在此情况下,应在使用 ADT 打包命令之前,为每个平台编译一个 SWC 文件并将每个 SWC 文件中的 library.swf 文件放在适当的平台目录中。您可以使用提取工具(如 WinZip)从 SWC 文件提取 library.swf。

考虑扩展的公共接口在所有平台上都相同的情况。这种情况下,在 ADT 命令的 -swc 选项中使用哪个平台特定 SWC 文件无关紧要。无关紧要的原因是 SWC 文件中的 SWF 文件只用于应用程序编译。您放入平台目录中的 SWF 文件是本机扩展在运行时使用的文件。

请注意有关 library.swf 文件的以下情况:

  • ADT 需要您为每个平台提供一个名为 library.swf 的主 SWF 文件。在创建 SWC 文件时,library.swf 就是 SWF 文件的名称。

  • 每个平台的 library.swf 文件可以不相同。

  • 如果 ActionScript 端没有平台依赖项,则每个平台的 library.swf 文件可以相同。

  • 每个平台的 library.swf 可以加载您在特定于平台的目录中包括的其他 SWF 文件。这些其他 SWF 文件可以是任何名称。

应用程序打包的 ANE 文件规则

利用 ADT 打包使用本机扩展的应用程序。在打包使用扩展的应用程序时,ADT 会验证 ANE 文件中指定的平台与应用程序打包目标是否匹配。例如,平台 Android-ARM 匹配 Android apk 包。

此外,ADT 将 default 平台与 任何 目标包匹配。 default 平台指定扩展的仅 ActionScript 版本。假定有一个使用应用程序绑定扩展的 AIR 应用程序。如果扩展的任何指定平台都不与设备对应,AIR 仅加载 default 平台扩展的 ActionScript 库。

例如,假定有一个指定 iPhone-ARM Android-ARM default 平台的应用程序绑定扩展。当使用该扩展的应用程序运行于 Windows 平台时,它将使用该扩展的 default 平台库。

因此,当您创建用于应用程序绑定的 ANE 文件时,请在打包使用 ANE 文件的应用程序时,考虑 ADT 使用的以下规则:

  • 要创建 Android 应用程序包,ANE 文件必须包括 Android-ARM 平台。或者,ANE 文件必须包括默认平台和至少一个其他平台。

  • 要创建 iOS 应用程序包,ANE 文件必须包括 iPhone-ARM 平台。或者,ANE 文件必须包括默认平台和至少一个其他平台。

  • 要创建 iOS Simulator 应用程序包,ANE 文件必须包括 iPhone-x86 平台。或者,ANE 文件必须包括默认平台和至少一个其他平台。

  • 要创建 Mac OS X 应用程序包,ANE 文件必须包括 MacOS-x86-64 平台。或者,ANE 文件必须包括默认平台和至少一个其他平台。

  • 要创建 Windows 应用程序包,ANE 文件必须包括 Windows-x86 平台。或者,ANE 文件必须包括默认平台和至少一个其他平台。

一个应用程序只能绑定一个平台实现。但是,如果使用 ADL 实用程序测试包含扩展的应用程序,则会在运行时选择实现。根据测试平台和 ANE 包的不同,这种在运行时进行的选择可能导致行为差异。例如,如果 ANE 包含 Android-ARM Windows-x86 default 平台的实现,测试时使用的实现将有所不同,具体取决于测试计算机运行的是 Windows 还是 OS X。在 Windows 上,将使用 Windows-x86 平台实现(即使是使用移动配置文件进行测试);在 OS X 上,将使用 default 实现。

在 ANE 包中包括其他 Android 共享 .so 库

假定有一个面向平台 Android-ARM 的本机扩展。扩展本机端的主要库为以下任一项:

  • .so 库(如果使用 Android NDK)

  • JAR 文件(如果使用 Android SDK)

不过,本机端有时需要比扩展的主要 .so 库或 JAR 文件更多的本机库(.so 库)。

例如:

  • 您正在使用 Java API 开发本机扩展。但是,您需要使用 JNI(Java 本机接口)从 Java 代码访问本机 .so 库。

  • 您正在使用 C API 开发本机扩展。但是,您需要将代码划分到多个共享库中。根据扩展的逻辑,您需要在运行时加载适当的共享 .so 库。

在创建 ANE 包时,请使用以下目录结构:

<Android platform directory>/ 
                        libs/ 
                        armeabi/ 
                        <Android emulator native libraries> 
                        armeabi-v7a/ 
                        <Android device native libraries>

在使用 ADT 创建 ANE 包时,请设置 -platform 选项以指定 Android 平台目录内容:

-platform Android-ARM -C <Android platform directory> .

当应用程序开发人员使用 ADT 将 ANE 包包括在 APK 包中时,APK 包包括以下库:

  • libs/armeabi-v7a 中的库(如果 ADT 目标为 apk apk-captive-runtime )。

  • libs/armeabi 中的库(如果 ADT 目标为 apk-emulator apk-debug apk-profile )。

注: 对于 iPhone-ARM 平台,不能在 ANE 文件中包括共享库。有关详细信息,请参阅 构建本机库