2

我在本机扩展中从 Java 调用 ActionScript 方法时遇到问题。在构建实际数组、使用 FREObjects 填充它并使用我要调用的方法初始化 ActionScript 类时,我没有收到任何错误。但是当我实际调用该方法时,我会收到一个 FREASErrorException。

Java 代码:

try {
        FREArray freArray = FREArray.newArray("com.industrycorp.extensions.product.IAPProduct", mProducts.size(), true);

        for (int i = 0; i < mProducts.size(); i++) {
            JavaProduct product = mProducts.get(i);
            FREObject[] freArguments = new FREObject[6];
            freArguments[0] = FREObject.newObject(product.getName());
            freArguments[1] = FREObject.newObject(product.getPrice());
            freArguments[2] = FREObject.newObject(product.getDescription());
            freArguments[3] = FREObject.newObject(product.getType());
            freArguments[4] = FREObject.newObject(product.getIsPurchased());
            freArguments[5] = FREObject.newObject(product.getInventory());

            FREObject freObject = FREObject.newObject("com.industrycorp.extensions.product.IAPProduct", freArguments);
            freArray.setObjectAt(i, freObject);

        }

        FREObject resultHandler = FREObject.newObject("com.industrycorp.extensions.result.ResultHandler", null);
        FREObject[] args = new FREObject[1];
        args[0] = freArray;


        resultHandler.callMethod("receivedProducts", args);



    } catch (Exception e) {
        mContext.dispatchStatusEventAsync("message", "Error converting Java Products to IAP Products: "+e.toString());
    }

罪魁祸首是:resultHandler.callMethod("receivedProducts", args)。我不确定问题是什么。命名空间是正确的,方法名称是好的。

动作脚本类:

package com.industrycorp.extensions.result {
import com.industrycorp.extensions.IAPController;

public class ResultHandler {

    public function ResultHandler() {
    }

    public function receivedProducts(products:Array):void {

        IAPController.getInstance().setProducts(products);

    }
}
}

更新

只为那些好奇的人。这个对象工作正常。

动作脚本代码

    // Test FREObject Creation
    FREObject testObject = FREObject.newObject("com.industrycorp.extensions.TestObject", null);
    FREObject message = FREObject.newObject("FREObject wOrks");
    FREObject[] testArgs = new FREObject[1];
    testArgs[0] = message;
    testObject.callMethod("PrintTest", testArgs);

Java 代码

package com.industrycorp.extensions {
public class TestObject {

    public function TestObject() {
    }

    public function PrintTest(message:String):void {
        trace(message);
    }

}
}

所以这绝对是 FREArray/Array 作为参数的问题。

4

2 回答 2

0

因此,尽管对象名称是 FREArray,但您在 Java 中对其进行初始化的方式决定了 Actionscript 需要 Vector 还是 Array。

数组初始化:

FREArray.newArray(int numElements);

向量的初始化

FREArray.newArray(String classname, int numElements, boolean fixed);

它在文档中说得很清楚:

http://help.adobe.com/en_US/air/extensions/WS982b6f491d178e6d6565d9b1132a79a012f-7ff8.html

我只是忽略了构造函数也没有创建的事实,它是特定的。感谢您在这个问题上的帮助。我赞成你的评论。

于 2013-08-14T14:58:51.057 回答
0

我不知道这是否可行,因为我无法进行测试,但是评论太大了,所以如果有错误请不要标记。

查看文档,您似乎正在创建一个向量数组,我认为您遇到了错误,因为操作脚本中的参数被设置为一个数组。

尝试这样的事情

    public function receivedProducts(products:Vector.<IAPProduct>):void {
        IAPController.getInstance().setProducts(products);
    }

[编辑]

我想我看到的另一个问题是这行代码

FREObject[] freArguments = new FREObject[6];

文档说

public static FREObject newObject( int value )
Creates an FREObject containing a 32-bit signed integer value.

难道不应该

FREArray [] freArguments = new FREArray [6];
于 2013-08-08T18:25:54.263 回答