使用 ActionScript ByteArray 对象

使用 ActionScript ByteArray 类可高效地在扩展的 ActionScript 端和本机端之间传递大量字节。在本机函数中,输入参数、输出参数或返回值可以与 ActionScript ByteArray 类对象相对应。

与其他 ActionScript 类对象一样,FREObject 变量是 ActionScript ByteArray 对象的本机端表示形式。C API 提供了函数用于处理使用 FREObject 变量的 ByteArray 类对象。使用 FRESetObjectProperty() 、 FREGetObjectProperty() 和 FRECallObjectMethod() 可获取并设置 ActionScript ByteArray 对象的属性并调用其方法。

但是,若要操作本机代码中 ByteArray 对象的字节,请使用 C API 函数 FREAcquireByteArray() 。此方法访问在 ActionScript 端创建的 ByteArray 对象的字节:

FREResult FREAcquireByteArray( 
            FREObject     object, 
            FREByteArray* byteArrayToSet 
); 
// The type FREByteArray is defined as: 
 
typedef struct { 
            uint32_t length; 
            uint8_t* bytes; 
} FREByteArray;

处理完字节后,可使用 C API FREReleaseByteArray() :

FREResult FREReleaseByteArray( FREObject object );
注: 不要在调用 FREAcquireByteArray() 和 FREReleaseByteArray() 之间调用任何 C API 函数。存在这种限制的原因是其他调用执行的代码会使指向字节数组内容的指针无效。

示例

此示例显示了扩展的 ActionScript 端创建 ByteArray 对象并初始化其字节的过程。然后调用一个本机函数以操作这些字节。

// ActionScript side of the extension 
 
var myByteArray:ByteArray = new ByteArray(); 
myByteArray.writeUTFBytes("Hello, World"); 
myByteArray.position = 0; 
myExtensionContext.call("MyNativeFunction", myByteArray); 
 
 
// C code 
FREObject MyNativeFunction(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { 
 
    FREByteArray byteArray; 
    int retVal; 
 
    retVal = FREAcquireByteArray(argv[0], &byteArray); 
    uint8_t* nativeString = (uint8_t*) "Hello from C"; 
    memcpy (byteArray.bytes, nativeString, 12); 
    retVal = FREReleaseByteArray(argv[0]); 
 
    return NULL; 
}