我想按照 java.exe 的方式用 C 语言构建一个特殊的 AIR 启动程序。
我用进程查看器查看了运行 AIR 程序,并且能够找到正在使用的 AIR 运行时 DLL。AIR 程序与 Java 的不同之处在于,它们作为特定于平台的可执行文件安装,一旦启动,它们就会将 AIR 运行时绑定为进程内共享库(用户双击它们的图标)。
好吧,我想制作一个类似于 java.exe 的 AIR 启动器。
java.exe 作为平台操作系统进程启动,它作为进程内共享库绑定到 Java JVM 运行时 (JRE)。要执行的 java 应用程序被指定为 java.exe 的命令行参数。一旦 java.exe 运行并且 JVM 完全正常运行,指定的 java 应用程序类将由 JVM 类加载器加载以执行。然后,指定的 Java 应用程序接管,在某种意义上“劫持”了 java.exe 的进程。当然,指定的 java 应用程序会在任何进程列表中显示为托管它的 java.exe 程序。
我想让 AIR 应用程序启动像这样工作。为什么?所以我可以探索破解 AIR 的方法,也许可以克服它的许多缺陷。例如,对于初学者,我想通过一些新的 API 来扩展 AIR 运行时体验,这些 API 可用于正在运行的 AIR 应用程序。
我的首要任务是:
- 实现与 .NET PInvoke 相当的 ActionScript3 到 C 的绑定接口
- 添加一个用于启动进程的 API,该 API 与 Java SE 中的 API 相当(Runtime.exec、ProcessBuilder、Process)
- 添加对 AIR 应用程序的支持,以便能够与 stdin、stdout、stderr 交互。奇怪的是,尽管 Adobe 在 AIR 中添加了对本地文件访问的支持,但它们却省略了与这些标准文件管道的交互(但它们可以在 AIR 支持的任何操作系统平台上找到)。
- 通过 stdin、stdout、stderr 实现对 AMF 的支持——因此 AIR(或 Java 或任何支持 AMF 的语言)应用程序可以通过交换 AMF 对象来进行通信。这将为 AIR 添加一点微软的 PowerShell。
目前 Merapi 提供了一个带有 Java 的 AMF 桥接器,从而证明了它的功效。唉,Merapi 必须使用 localhost 端口和套接字来进行进程间通信——相对于使用 stdin/stdout/stderr 进程间管道,这是一种笨拙的方式。