2011-12-06 63 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函数的工作原理。