通过C ++为AIR Native Extensions生成可变长度的ByteArrays

时间:2011-12-06 22:37:06

标签: c++ actionscript-3 air

对于以下C ++和ActionScript3代码,我的AIR应用程序在调用getBytes2方法时崩溃。为什么会这样?解决方案建议将不胜感激。

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;
    }

3 个答案:

答案 0 :(得分:1)

有关动态设置长度的工作示例,请参阅FREImageProcessor.cpp。基本上,您可以像在ActionScript中一样设置长度。

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

答案 1 :(得分:0)

您是否收到任何特定错误或崩溃消息?您使用的是哪个IDE - 是否可以在该进程上附加调试器?我会把钱花在memcpy函数中的崩溃上......

我唯一的但是当你发送字符串时,你没有将空终结符从字符串复制到你的BA。我不认为这应该是重要的(您可能会遇到在AS3端提取数据,但这不应该导致问题)。

答案 2 :(得分:0)

实际上有些人在获取byteArrays时会报告类似的问题。我有一个kludgy修复我尚未在ArduinoConnector代码中发布它。几乎涉及在AS3端播种4096字节byteArray并发送它。我还尝试在c侧创建一个具有类似结果的新byteArray。根据AIR工程师的说法,我们不应该有这个问题,但我不知道他们是否考虑了memcpy函数的工作原理。