ActionScript ByteArray オブジェクトの操作

拡張の 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; 
}