是否可以从您的本机代码返回结构?返回 int 或 boolean 相对简单,但是如何将更复杂的结构返回给 actionscript?
4 回答
您可以将可以在本机代码中表示为 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 等价物有些不同,但仍然可以从原生代码返回复杂对象。
有关更多信息,这里有大量文档:
接受的答案对于您的原始问题不准确。您想返回一个结构......好吧,您实际上不能这样做,但正确的方法是将您的本机结构/类编写为一个动作脚本类,然后使用 ExtensionContext 对象来关联您的本机结构或类指针与您的上下文。然后,当您可以将方法写入您的结构/类时,这些方法将直接与其中的方法和属性进行交互。如果其中的任何方法返回另一个结构或类,则递归地重复该过程。
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
完成过程的返回值限制为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文档。