FREObject 类型

FREObject 类型的变量引用与 ActionScript 类对象或基元类型对应的对象。在本机实现中使用 FREObject 变量来处理 ActionScript 数据。FREObject 类型主要用于本机函数参数和返回值。

在编写本机函数时,需决定参数的顺序。由于您同时还编写 ActionScript 端,并在 ExtensionContext 实例的 call() 方法中使用该参数顺序,因此,尽管每个本机函数参数都是 FREObject 变量,但您知道它对应的 ActionScript 类型。

类似地,您需要决定本机函数的返回值(如果有)的 ActionScript 类型。 call() 方法返回此类型的对象。尽管本机函数返回值始终是 FREObject 变量,但您知道它对应的 ActionScript 类型。

扩展 C API 提供用于使用 FREObject 变量所引用的对象的函数。由于这些对象与 ActionScript 数据相对应,因此这些 C API 函数决定您访问 ActionScript 类对象或基元数据变量的方式。所用的 C API 取决于 ActionScript 对象的类型。这些类型包括:

  • ActionScript 基元数据类型

  • ActionScript 类对象

  • ActionScript String 对象

  • ActionScript Array 或 Vector 类对象

  • ActionScript ByteArray 类对象

  • ActionScript BitmapData 类对象

注: 您只能从 FREFunction 函数在其中运行的同一线程调用扩展 C API。一种例外情况是用于将事件调度到 ActionScript 端的 C API。可以从任何线程调用该函数 FREDispatchStatusEventAsync()

确定 FREObject 变量的类型

有时,您不知道 FREObject 变量对应的 ActionScript 对象的类型。若要确定类型,请使用 C API 函数 FREGetObjectType()

FREResult FREGetObjectType( FREObject object, FREObjectType *objectType );

知道类型后,可使用适当的 C API 来处理该值。例如,如果类型是 FRE_TYPE_VECTOR ,可 使用 ActionScript Array 和 Vector 对象 中的 C API 来处理该 Vector 对象。

FREObject 有效性

如果您尝试在 C API 调用中使用无效的 FREObject 变量,C API 将返回 FRE_INVALID_OBJECT 返回值。

任何 FREObject 变量都只在调用堆栈上的第一个 FREFunction 函数返回之前有效。调用堆栈上的第一个 FREFunction 函数是运行时由于 ActionScript 端调用 ExtensionContext 实例的 call() 方法而调用的函数。

以下示意图演示了这种行为:

查看完全大小图形
调用堆栈上的 FREObject 有效性

注: FREFunction 函数可以间接调用其他 FREFunction 函数。例如, FREFunctionA() 可以调用 ActionScript 对象的方法。该方法随后可以调用 FREFunctionB()

因此,在使用 FREObject 变量时,应考虑以下事项:

  • 传递给 FREFunction 函数的任何 FREObject 变量都只在调用堆栈上的第一个 FREFunction 函数返回之前有效。

  • 任何本机函数使用扩展 C API 创建的任何 FREObject 变量都只在调用堆栈上的第一个 FREFunction 函数返回之前有效。

  • 不能在另一线程中使用 FREObject 变量。只能在与本机函数用于接收或创建 FREObject 变量的同一线程中使用该变量。

  • 例如,无法在调用 FREFunction 函数之间的这段时间内在全局数据中保存 FREObject 变量。由于在调用堆栈上的第一个 FREFunction 函数返回后,该变量将变得无效,因此保存的变量将没有用处。不过,您可以通过使用方法 FRESetContextActionScriptData() 保存对应的 ActionScript 对象。

  • FREObject 变量失效后,对应的 ActionScript 对象仍然可以存在。例如,如果 FREObject 变量是 FREFunction 函数的返回值,其对应的 ActionScript 对象将仍然被引用。但是,一旦 ActionScript 端删除其引用,运行时将立即释放 ActionScript 对象。

  • 不能在扩展之间共享 FREObject 变量,

    注: 但可以在同一扩展的扩展上下文之间共享 FREObject 变量。不过,无论是哪种情况,FREObject 变量在调用堆栈上的第一个 FREFunction 函数返回到运行时后都变得无效。