3

是否可以从您的本机代码返回结构?返回 int 或 boolean 相对简单,但是如何将更复杂的结构返回给 actionscript?

4

4 回答 4

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 等价物有些不同,但仍然可以从原生代码返回复杂对象。

有关更多信息,这里有大量文档:

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

于 2012-02-14T21:17:07.877 回答
0

接受的答案对于您的原始问题不准确。您想返回一个结构......好吧,您实际上不能这样做,但正确的方法是将您的本机结构/类编写为一个动作脚本类,然后使用 ExtensionContext 对象来关联您的本机结构或类指针与您的上下文。然后,当您可以将方法写入您的结构/类时,这些方法将直接与其中的方法和属性进行交互。如果其中的任何方法返回另一个结构或类,则递归地重复该过程。

于 2012-04-30T22:20:09.933 回答
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
于 2014-07-07T18:28:26.303 回答
-1

完成过程的返回值限制为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 实现了类似 ByteArray 的IDataOut接口,因此您可以从中读取任何基本类型。另请参阅NativeProcess文档。

于 2012-02-14T05:09:17.510 回答