通过c++为AIR本地扩展生成可变长度的ByteArrays
Producing variable length ByteArrays through C++ for AIR Native Extensions
对于以下c++和ActionScript3代码,当调用getBytes2
方法时,我的AIR应用程序崩溃。为什么会发生这种情况?如能提供解决方案建议,将不胜感激。
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;
}
请参阅FREImageProcessor.cpp获取动态设置长度的工作示例。基本上你可以像在ActionScript中一样设置长度。
FREObject length;
FRENewObjectFromUint32(sizeof(nativeString), &length);
FRESetObjectProperty(argv[0], (const uint8_t*) "length", length, NULL);
您是否收到任何特定的错误或崩溃消息?您使用的是哪个IDE——是否可以将调试器附加到该进程上?我会把我的钱放在memcpy函数期间的崩溃上…
我唯一的想法是,当你发送字符串时,你没有从字符串复制空终止符到你的BA。我认为这应该无关紧要(您可能会在AS3端提取数据,但这不应该引起问题)。
实际上有些人在获取byteArrays时报告了类似的问题。我有一个笨拙的修复,我还没有在ArduinoConnector代码中发布它。基本上包括在AS3端播种一个4096字节的byteArray并将其发送进来。我还尝试在c端创建一个新的byteArray,结果类似。根据AIR工程师的说法,我们不应该有这个问题,但我不知道他们是否考虑到memcpy函数是如何工作的。