本机扩展体系结构

体系结构概述

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 设备

具有 Android SDK 的 Java API。

具有 Android NDK 的 C API。

iOS 设备

C API

Blackberry PlayBook

C API

Windows 桌面设备

C API

Mac OS X 桌面设备

C API

面向多种平台

一个本机扩展通常面向多种平台。例如,一个扩展可以面向运行 iOS 的设备和运行 Android 的设备。在这种情况下,您的 ActionScript 类实现和本机代码实现(包括本机代码语言)可能因目标平台而异。

对于 ActionScript 扩展类,最佳做法是提供与其实现无关的相同 ActionScript 公共接口。通过保持相同的公共接口,可以创建一个真正的跨平台本机扩展。如果 ActionScript 公共接口相同,但 ActionScript 实现不同,则需要为每个平台创建一个不同的 ActionScript 库。

您还可以为某些目标平台创建没有本机代码实现的扩展。此类扩展在以下情形中非常有用:

  • 只有一些目标平台支持所需功能的本机实现时。

    扩展可以在这些平台上使用本机实现,但在其他平台上使用仅 ActionScript 实现。例如,假设一个平台为计算机进程之间的通信提供专用机制。对于该平台,扩展具有一个本机实现。对于另一平台,该扩展采用使用 ActionScript Socket 类的仅 ActionScript 实现。

    当应用程序开发人员使用扩展时,他们可以编写一个应用程序,无需了解扩展在不同目标平台上的实现方式。

  • 在测试扩展时。

    假设有一个本机扩展使用移动设备的特定功能。您可以为桌面创建仅 ActionScript 扩展。然后,应用程序开发人员可以在开发期间使用该桌面扩展进行模拟测试,然后才在实际目标设备上测试。同样,作为扩展开发人员,您也可以在涉及本机代码实现之前测试扩展的 ActionScript 端。

在发布扩展时,可以在扩展描述符文件的 <platform> 元素中指定目标平台。每个 <platform> 元素指定一个目标,如 iPhone-ARM Windows-x86。 您还可以指定一个名为 default <platform> 元素。 default 平台有一个未使用 <platform> 元素指定的、在所有平台上使用的仅 ActionScript 实现。有关详细信息,请参阅 本机扩展描述符文件

注: 针对至少一个目标平台的实现必须包含本机代码。如果无任何目标平台需要本机代码,则使用本机扩展不是正确选择。在这样的情况下,请创建一个 SWC 库。

扩展在运行时的提供方式

本机扩展在运行时可以通过下列方式之一供应用程序使用:

应用程序绑定
扩展与 AIR 应用程序一起打包,并随应用程序安装在目标设备上。一个扩展包通常包含用于多种平台的本机实现和 ActionScript 实现,但只能包含一个平台的本机实现和 ActionScript 实现。有时,扩展包还包含一个用于不支持的平台或测试平台的仅 ActionScript 实现。

设备绑定
扩展单独安装在目标设备上的某个目录中,独立于任何 AIR 应用程序而存在。要使用设备绑定,通常需要与设备制造商协作将扩展安装在设备上。

下表说明了哪些设备支持应用程序绑定和设备绑定:

应用程序绑定

设备绑定

Android

iOS

Blackberry PlayBook

Windows

Mac OS X

扩展上下文

本机扩展在每次运行应用程序时都会加载。不过,要使用本机实现,扩展的 ActionScript 部分需要调用一个特殊的 ActionScript API 来创建 扩展上下文

本机扩展可以执行以下任一操作。

  • 仅创建一个扩展上下文。

    对于本机实现中仅提供一个函数集的简单扩展,通常只有一个扩展上下文。

  • 创建多个共存的扩展上下文。

    在将 ActionScript 对象与本机对象关联时,多个扩展上下文非常有用。ActionScript 对象与本机对象之间的每个关联都是一个扩展上下文实例。这些扩展上下文实例可以具有不同的上下文类型。本机实现可以为每种上下文类型提供不同的函数集。

每个扩展上下文都可以具有在本机实现中定义和使用的特定于上下文的数据。

扩展上下文只能由扩展中的 ActionScript 代码创建,而不能由本机代码或应用程序代码创建。