Use the ActionScript ByteArray class to efficiently pass
many bytes between the ActionScript side and native side of your
extension. In your native functions, an input parameter, output
parameter, or return value can correspond to an ActionScript ByteArray
class object.
As with other ActionScript class objects, an FREObject variable
is the native side representation of an ActionScript ByteArray object.
The C APIs provide functions for manipulating a ByteArray class
object using an FREObject variable. Use
FRESetObjectProperty()
,
FREGetObjectProperty()
,
and
FRECallObjectMethod()
to get and set the ActionScript
ByteArray object’s properties and to call its methods.
However, to manipulate the bytes of the ByteArray object in the
native code, use the C API function
FREAcquireByteArray()
. This method
accesses the bytes of a ByteArray object that was created on the
ActionScript side:
FREResult FREAcquireByteArray(
FREObject object,
FREByteArray* byteArrayToSet
);
// The type FREByteArray is defined as:
typedef struct {
uint32_t length;
uint8_t* bytes;
} FREByteArray;
After you have manipulated the bytes, use the C API
FREReleaseByteArray()
:
FREResult FREReleaseByteArray( FREObject object );
Note:
Do not call any C API functions between the calls to
FREAcquireByteArray()
and
FREReleaseByteArray()
.
This prohibition is because other calls could, as a side effect,
execute code that invalidates the pointer to the byte array contents.
Example
This example shows the ActionScript
side of the extension creating a ByteArray object and initializing
its bytes. Then it calls a native function to manipulate the bytes.
// 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;
}