【问题标题】:Returning a struct from an Air Native extension从 Air Native 扩展返回一个结构
【发布时间】:2012-02-13 23:57:46
【问题描述】:

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

【问题讨论】:

    标签: actionscript-3 air native air-native-extension


    【解决方案1】:

    您可以将本机代码中可以表示为 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        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
        

        【讨论】:

          【解决方案4】:

          已完成进程的返回值仅限于 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 docs。

          【讨论】:

          • 这仅适用于 NativeProcess,不适用于 Native Extensions。
          猜你喜欢
          • 2014-11-24
          • 2015-12-13
          • 2021-06-17
          • 2017-08-20
          • 2016-12-07
          • 2016-07-04
          • 2014-09-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多