新增一个跨平台 ANE API
初始化后的 isSupported、version、echo 就是一套最小参考实现。新增 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 value1. 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 一致。