Skip to content

新增一个跨平台 ANE API

初始化后的 isSupportedversionecho 就是一套最小参考实现。新增 API 的核心是让同一个 function name 贯穿 ActionScript facade 与各 native platform。

下面以 getGreeting(name) 为例。

调用链

text
src/.../Basic.as
    -> ExtensionContext.call("getGreeting", ...)
    -> native function registry
    -> Android / iOS / macOS / Windows implementation
    -> FREObject
    -> ActionScript return value

1. Public ActionScript facade

src/<package-path>/Basic.as 增加公开方法,并使用统一 function name:

actionscript
public static function getGreeting(name:String):String
{
    var context:ExtensionContext = getContext();
    if (context == null)
    {
        return "Hello, " + name;
    }

    return String(context.call("getGreeting", name));
}

2. Default fallback

native/default/ 中公开 API 必须保持一致,但 default 不创建 ExtensionContext

actionscript
public static function getGreeting(name:String):String
{
    return "Hello, " + name;
}

3. Android

Android 使用 AIR Java FRE 模型:

text
FREExtension
  -> FREContext
  -> Map<String, FREFunction>
  -> FREFunction.call(...)

实现新的 FREFunction 后,在 context 的 function map 中注册:

java
functions.put("getGreeting", new GetGreetingFunction());

4. iOS / macOS

Apple 平台在 functions 文件中声明并实现对应 FRE function,再在 FRENamedFunction[] 注册相同名称。

objc
{ (const uint8_t*)"getGreeting", NULL, &BasicGetGreeting }

iOS 与 macOS 可以共享 FRE 数据转换思路,但不要混用平台生命周期 API:iOS 使用 UIKit/mobile lifecycle,macOS 使用 AppKit/NSApplication/NSWorkspace。

5. Windows

Windows 使用 AIR 官方 FRE C API,实现函数后在 FRENamedFunction[] 中注册:

cpp
{ reinterpret_cast<const uint8_t*>("getGreeting"), nullptr, &BasicGetGreeting }

6. Core 的角色

“基于 distriqt Core”不表示每个函数、每个平台都必须强制调用同一个 Core helper。

合理边界是:

  • ActionScript 在创建 ExtensionContext 前初始化 Core;
  • Apple 可使用 DTFREUtils 等 integration helper;
  • Android 简单参数转换可直接使用 AIR Java FRE API;
  • Windows 使用公开 AIR FRE C API。

7. 验证

bash
apm-cli package doctor
apm-cli package build
apm-cli package assemble
apm-cli package inspect
apm-cli package validate
apm-cli package validate --strict

每增加一个公开 API,都要确认 facade、default 和所有 enabled native platform 的参数、返回类型与 function name 一致。