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()
方法而调用的函数。
以下示意图演示了这种行为:
注:
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 函数返回到运行时后都变得无效。
|
|
|