ネイティブ コードから構造体を返すことは可能ですか? int または boolean を返すのは比較的簡単ですが、より複雑な構造体をアクション スクリプトに返すにはどうすればよいでしょうか?
4 に答える
ネイティブ コードで FREObject として表現できる任意のオブジェクトを返すことができます。これには実際には、すべての Actionscript クラスまたは Actionscript プリミティブ データ型が含まれます。これには、int、String、Array、BitmapData、ByteArray などが含まれます。
たとえば、int 値 0 ~ 3 で長さ 4 の戻り配列を作成してみましょう。
FREObject returnAnArray( FREContext cts, void* funcData, uint32_t argc, FREObject argv[])
{
FREObject returnArray = NULL;
FRENewObject((const uint8_t*)"Array", 0, NULL, &returnArray, nil );
FRESetArrayLength( returnArray, 4 );
for ( int32_t i = 0; i < 4; i++)
{
FREObject element;
FRENewObjectFromUint32( i, element );
FRESetArrayElementAt( returnArray, i, element );
}
return returnArray;
}
Actionscript クラスを構築する方法はもう少し複雑ですが、同様のパスに従います。もちろん、これはネイティブ C の例です。同等の Java は多少異なりますが、ネイティブ コードから複雑なオブジェクトを返すことは可能です。
詳細については、ここに大量のドキュメントがあります。
受け入れられた答えは、元の質問に対して正確ではありません。構造体を返したい...実際にはできませんが、これを行う適切な方法は、ネイティブの構造体/クラスをactionscriptクラスとして記述し、ExtensionContextオブジェクトを使用してネイティブの構造体またはクラスポインターを関連付けることです。あなたの文脈で。次に、内部のメソッドおよびプロパティと直接インターフェイスするメソッドを構造体/クラスに書き込むことができる場合。内のメソッドのいずれかが別の構造体またはクラスを返す場合は、プロセスを再帰的に繰り返します。
終了したプロセスからの戻り値は に限定されますint
。ただし、データを stdout に書き込んで、AIR アプリケーションで読み取ることができます。
p = new NativeProcess();
p.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
private function onOutputData(evt:ProgressEvent):void {
var outputData:String = p.standardOutput.readUTFBytes(p.standardOutput.bytesAvailable);
trace(outputData);
}
StandardOutputは ByteArray のようなIDataOutインターフェイスを実装しているため、そこから任意の基本型を読み取ることができます。NativeProcessドキュメントも参照してください。