通过c++为AIR本地扩展生成可变长度的ByteArrays

Producing variable length ByteArrays through C++ for AIR Native Extensions

本文关键字:ByteArrays c++ AIR 扩展 通过      更新时间:2023-10-16

对于以下c++和ActionScript3代码,当调用getBytes2方法时,我的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;
    }

请参阅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函数是如何工作的。