从 Air Native 扩展返回结构

发布于 01-05 01:16 字数 62 浏览 4 评论 0原文

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

Is it possible to return a struct from your native code? It's relatively straight forward to return an int or a boolean but how do you return a more complex struct back to the actionscript?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不醒的梦2025-01-12 01:16:04

您可以返回任何可以在本机代码中表示为 FREObject 的对象。这实际上包括任何 Actionscript 类或 Actionscript 原始数据类型。这包括:int、String、Array、BitmapData、ByteArray 等。

例如,让我们用 int 值 0 - 3 构造一个长度为 4 的返回数组:

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/扩展/index.html

You can return any object that can be represented in the native code as a FREObject. This actually includes any Actionscript class or Actionscript primitive data type. This includes things like: int, String, Array, BitmapData, ByteArray etc.

For example lets construct a return array of length 4 with the int values 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;
}

The method to construct Actionscript classes is a little more complex but follows a similar path. This is ofcourse a native C example, the Java equivalent is somewhat different but still it is possible to return complex objects from the native code.

For more information there is heaps of documentation here:

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

只等公子2025-01-12 01:16:04

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

The accepted answer is not accurate for your original question. You want to return a struct... well you can't actually do that but the proper way to do this is to write your native struct/class as an actionscript class, then use the ExtensionContext object to associate your native struct or class pointer with your context. Then when you can write methods into your struct/class that will directly interface with methods and properties within. If any of the methods within return another struct or class, repeat the process recursively.

a√萤火虫的光℡2025-01-12 01:16:04

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

Java examples

Returning Array

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

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

Also consider using 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
煞人兵器2025-01-12 01:16:04

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

Return value from finished process is limited to an int. But you can write data to stdout and read it in your AIR application:

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 implements IDataOut interface like ByteArray, so you can read any basic types from it. See also NativeProcess docs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文