2011-12-06 3 views
2

次のC++およびActionScript3コードでは、getBytes2メソッドが呼び出されるとAIRアプリケーションがクラッシュします。なぜこうなった?ソリューションの提案は高く評価されます。可変長のByteArraysをC++でAIRネイティブ拡張用に作成する

C++コード:

FREObject getBytes2(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) 
{ 
    FREObject result; 
    FREByteArray actualBytes; 

    FREAcquireByteArray(argv[0], &actualBytes); 
    uint8_t* nativeString = (uint8_t*) "Hello World from C++"; 
    memcpy(actualBytes.bytes, nativeString, sizeof(nativeString)); 

    FREReleaseByteArray(&actualBytes); 

    FRENewObjectFromBool(1, &result); 
    return result; 
} 

ActionScript3コード:

public function getBytes2():ByteArray { 
     var ba:ByteArray = new ByteArray(); 
     this._ExtensionContext.call("getBytes2", ba); 
     ba.position = 0; 
     return ba; 
    } 

答えて

1

動的に長さを設定する作業例については、FREImageProcessor.cppを参照してください。基本的には、ActionScriptの場合と同じように長さを設定します。

FREObject length; 
FRENewObjectFromUint32(sizeof(nativeString), &length); 
FRESetObjectProperty(argv[0], (const uint8_t*) "length", length, NULL); 
0

あなたが任意の特定のエラーやクラッシュメッセージが出ていますか?どのIDEを使用していますか?そのプロセスにデバッガを接続することは可能ですか?私はmemcpyの機能の間にクラッシュに私のお金を入れて...

あなたが文字列を送信している間、あなたは文字列からあなたのBAにヌルターミネーターをコピーしていません。しかし、それは問題ではないと思います(AS3側でデータを抽出することがあるかもしれませんが、問題は起こらないはずです)。

+0

エラーが発生しないため、AIRデバッガは約1秒後にフリーズします。ネイティブエクステンションとサンプルAIRアプリケーションのAS3側では、私はFlash Builder 4.6を使用しています。私はVS2010を使用しているC + +の側については。私はデバッガを接続することができます。私は使用しているコードがas3-arduinoコネクタで使用したコードとほとんど同じであるため、なぜこれが発生するのだろうかと疑問に思っています... –

+0

エラーは本当にmemcpy関数によるもので、入力bytearrayが小さい結果として得られるbytearrayよりも、しかし、そのロジックas3-arduinoコネクタもクラッシュするだろう... –

0

実際に、byteArraysを取得しているときに同様の問題を報告している人がいました。私はまだArduinoConnectorコードに投稿していないkludgyの修正をしています。ほとんどの場合、AS3側に4096バイトのbyteArrayをシードして送信します。同様の結果を持つc側に新しいbyteArrayを作成してみました。 AIRエンジニアによると、この問題は起こらないはずですが、memcpy関数がどのように機能するのかを説明しているかどうかはわかりません。

関連する問題