actionscript-3 - swf - debug actionscript
Devolver una estructura de una extensión Air Native (4)
¿Es posible devolver una estructura desde tu código nativo? Es relativamente sencillo devolver un int o un booleano, pero ¿cómo se devuelve una estructura más compleja al actionscript?
El valor de retorno del proceso finalizado está limitado a un int
. Pero puede escribir datos en stdout y leerlos en su aplicación de 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 implementa la interfaz IDataOut como ByteArray, por lo que puede leer cualquier tipo básico de la misma. Ver también documentos de NativeProcess .
Puede devolver cualquier objeto que pueda representarse en el código nativo como un objeto FREObject. Esto realmente incluye cualquier clase Actionscript o tipo de datos de primitiva Actionscript. Esto incluye cosas como: int, String, Array, BitmapData, ByteArray, etc.
Por ejemplo, construyamos una matriz de retorno de longitud 4 con los valores 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;
}
El método para construir clases Actionscript es un poco más complejo pero sigue un camino similar. Por supuesto, este es un ejemplo de C nativo, el equivalente de Java es algo diferente, pero aún es posible devolver objetos complejos desde el código nativo.
Para obtener más información, hay montones de documentación aquí:
La respuesta aceptada no es precisa para su pregunta original. Desea devolver una estructura ... bueno, no puede hacerlo, pero la forma correcta de hacerlo es escribir su estructura / clase nativa como una clase actionscript, luego use el objeto ExtensionContext para asociar su estructura nativa o puntero de clase con tu contexto Luego, cuando pueda escribir métodos en su estructura / clase que interactuarán directamente con los métodos y propiedades dentro de. Si alguno de los métodos dentro de devuelve otra estructura o clase, repita el proceso recursivamente.
Ejemplos de Java
Devolución de matriz
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
Más información http://help.adobe.com/en_US/air/extensions/WS982b6f491d178e6d6565d9b1132a79a012f-7ff8.html
Considere también usar 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