拡張の ActionScript 側とネイティブ側の間で大量のバイトデータの受け渡しを効率的に行うには、ActionScript ByteArray クラスを使用します。ネイティブ関数の入力パラメーター、出力パラメーターまたは戻り値は、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;
}