Возврат структуры из расширения Air Native - PullRequest
3 голосов
/ 14 февраля 2012

Возможно ли вернуть структуру из вашего нативного кода? Относительно легко вернуть int или логическое значение, но как вернуть более сложную структуру обратно в ActionScript?

Ответы [ 4 ]

6 голосов
/ 15 февраля 2012

Вы можете вернуть любой объект, который может быть представлен в собственном коде как FREObject. На самом деле это включает в себя любой класс Actionscript или тип данных примитива Actionscript. Это включает в себя такие вещи, как: int, String, Array, BitmapData, ByteArray и т. Д.

Например, давайте создадим возвращаемый массив длины 4 со значениями int 0 - 3:

FREObject returnAnArray( FREContext cts, void* funcData, uint32_t argc, FREObject argv[])
{
    FREObject returnArray = NULL;
    FRENewObject((const uint8_t*)"Array", 0, NULL, &returnArray, nil );
    FRESetArrayLength( returnArray, 4 );

    for ( int32_t i = 0; i < 4; i++)
    {
        FREObject element;
        FRENewObjectFromUint32( i, element );
        FRESetArrayElementAt( returnArray, i, element );
    }
    return returnArray;
}

Метод создания классов Actionscript немного сложнее, но он следует похожему пути. Это, конечно, собственный пример C, Java-эквивалент несколько отличается, но все же возможно возвращать сложные объекты из собственного кода.

Для получения дополнительной информации здесь есть куча документации:

http://help.adobe.com/en_US/air/extensions/index.html

0 голосов
/ 07 июля 2014

Примеры Java

Возвращаемый массив

FREObject stringElement = FREObject.newObject("String element value"); 
FREArray array = FREArray.newArray( "String", 1, false ); 
array.setObjectAt( 0, stringElement );
//now you can return array to AS3

Подробнее http://help.adobe.com/en_US/air/extensions/WS982b6f491d178e6d6565d9b1132a79a012f-7ff8.html

Также рассмотрите возможность использования JSON

JSONObject jsonObject = new JSONObject();

try
{
    jsonObject.put("messgae", "Hello");
    jsonObject.put("name", "John");
}
catch (JSONException e)
{
}

FREObject jsonString FREObject.newObject(jsonObject.toString());
//now you can return jsonString to AS3
0 голосов
/ 01 мая 2012

Принятый ответ не соответствует исходному вопросу.Вы хотите вернуть структуру ... ну, на самом деле вы не можете этого сделать, но правильный способ сделать это - написать свой собственный struct / class как класс actionscript, а затем использовать объект ExtensionContext, чтобы связать вашу собственную структуру или указатель классас вашим контекстом.Затем, когда вы можете написать методы в вашей структуре / классе, которые будут напрямую взаимодействовать с методами и свойствами внутри.Если какой-либо из методов внутри возвращает другую структуру или класс, повторите процесс рекурсивно.

0 голосов
/ 14 февраля 2012

Возвращаемое значение из завершенного процесса ограничено int.Но вы можете записать данные в стандартный вывод и прочитать их в своем приложении AIR:

p = new NativeProcess();
p.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);

private function onOutputData(evt:ProgressEvent):void {
    var outputData:String = p.standardOutput.readUTFBytes(p.standardOutput.bytesAvailable);
    trace(outputData);
}

StandardOutput реализует интерфейс IDataOut , такой как ByteArray, так что вы можете читать из него любые основные типы.См. Также NativeProcess документы.

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