2011-12-06 49 views
2

對於以下C++和ActionScript3的代碼,當getBytes2方法被稱爲我的AIR應用程序崩潰。這是爲什麼發生?解決方案建議將不勝感激。生產可變長度的ByteArray爲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 Debugger在〜1秒後凍結。對於本機擴展的AS3端和示例AIR應用程序,我使用的是Flash Builder 4.6。對於C++端我使用VS2010。我可以附加調試器。我想知道爲什麼會出現這種情況,因爲我使用的代碼與您在as3-arduino連接器上使用的代碼幾乎相同... –

+0

錯誤確實是由於memcpy函數造成的,並且當輸入bytearray較小時比得到的字節陣列,但與邏輯as3-arduino連接器也會崩潰... –

0

實際上有一些人報告類似的問題時,他們得到的ByteArray。我有一個kludgy修復,我還沒有發佈在它的ArduinoConnector代碼中。很大程度上涉及在AS3端播種一個4096字節的byteArray併發送它。我也嘗試在c端創建一個新的byteArray,並得到相似的結果。根據AIR的工程師,我們不應該有這個問題,但我不知道他們是否說明了memcpy函數的工作原理。