是否可以从您的本机代码返回结构?返回int或boolean是相对简单的,但是如何将更复杂的结构返回到actionscript?
答案 0 :(得分:6)
您可以将任何可以在本机代码中表示的对象作为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等价物有些不同,但仍然可以从本机代码返回复杂对象。
有关详细信息,请参阅此处的大量文档:
答案 1 :(得分:0)
对于原始问题,接受的答案不准确。你想要返回一个结构...你实际上不能这样做但是正确的方法是将你的原生struct /类编写为actionscript类,然后使用ExtensionContext对象来关联你的本机结构或类指针与您的背景。然后,当你可以在struct / class中编写方法,直接与其中的方法和属性进行交互。如果返回另一个结构或类中的任何方法,则以递归方式重复该过程。
答案 2 :(得分:0)
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
答案 3 :(得分:-1)
完成流程的返回值仅限于int
。但是您可以将数据写入stdout并在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实现了像ByteArray这样的IDataOut接口,因此您可以从中读取任何基本类型。另请参阅NativeProcess文档。