Создание ByteArrays переменной длины через C ++ для собственных расширений AIR - PullRequest
2 голосов
/ 07 декабря 2011

Для следующего кода 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 ]

1 голос
/ 14 декабря 2011

См. FREImageProcessor.cpp для рабочего примера динамической установки длины.По сути, вы устанавливаете длину так же, как в ActionScript.

FREObject length;
FRENewObjectFromUint32(sizeof(nativeString), &length);
FRESetObjectProperty(argv[0], (const uint8_t*) "length", length, NULL);
0 голосов
/ 07 декабря 2011

На самом деле некоторые люди сообщали о похожих проблемах, когда получали байт-массивы. У меня есть клёвое исправление, которое я еще не опубликовал в коде ArduinoConnector. В значительной степени это включает заполнение байтового массива 4096 байтов на стороне AS3 и его отправку. Я также попытался просто создать новый массив байтов на стороне c с похожими результатами. По словам инженеров AIR, у нас не должно быть этой проблемы, но я не знаю, объясняли ли они, как работает функция memcpy.

0 голосов
/ 07 декабря 2011

Получаете ли вы сообщение об ошибке или сбое?Какой IDE вы используете - возможно ли подключить отладчик к этому процессу?Я бы положил деньги на сбой во время функции memcpy ...

Единственное, что при отправке строки вы не копируете нулевой терминатор из строки в ваш BA.Однако я не думаю, что это должно иметь значение (может возникнуть проблема с извлечением данных на стороне AS3, но это не должно вызывать проблем).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...