You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Java应用程序中运行依赖Flash的网页游戏?已尝试多版本JxBrowser未成功,可接受其他工具方案

在Java应用中加载Flash网页游戏的可行方案

Adobe Flash Player早已停止官方支持,但如果需要在Java应用中运行依赖Flash的网页游戏,这里有几个可行的方向——包括修复你之前尝试的JxBrowser配置问题,以及更灵活的替代工具方案:

一、修复JxBrowser的Flash加载问题

你之前用JxBrowser失败,大概率是因为选了对应Chromium版本过高的JxBrowser(Chromium 88及以后彻底移除了Flash支持),或者没正确配置Flash插件参数。JxBrowser基于CEF,只有JxBrowser 7.14及更早版本(对应Chromium 87)才支持Flash,具体修复步骤:

  1. 下载JxBrowser 7.14或更早的稳定版本,确保其底层Chromium版本≤87
  2. 获取最后一版PPAPI格式的Flash Player插件(版本32.0.0.465),文件名通常是pepflashplayer.dll(Windows)或libpepflashplayer.so(Linux)
  3. 在初始化JxBrowser时,明确指定Flash插件路径和启用参数:
import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.engine.EngineOptions;
import com.teamdev.jxbrowser.view.swing.BrowserView;

import javax.swing.*;
import java.awt.*;

public class FlashGameBrowser {
    public static void main(String[] args) {
        // 替换为你的Flash插件实际路径
        String flashPluginPath = "D:/plugins/pepflashplayer.dll";
        String flashVersion = "32.0.0.465";

        EngineOptions options = EngineOptions.newBuilder(HARDWARE_ACCELERATED)
                .addSwitch("--enable-plugins")
                .addSwitch("--ppapi-flash-path=" + flashPluginPath)
                .addSwitch("--ppapi-flash-version=" + flashVersion)
                // 部分游戏可能需要关闭沙箱才能正常加载
                .addSwitch("--no-sandbox")
                .build();

        try (Engine engine = Engine.newInstance(options)) {
            Browser browser = engine.newBrowser();
            BrowserView view = BrowserView.newInstance(browser);

            JFrame frame = new JFrame("Flash Game Loader");
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.add(view, BorderLayout.CENTER);
            frame.setSize(800, 600);
            frame.setVisible(true);

            // 替换为你的目标游戏URL
            browser.navigation().loadUrl("https://your-flash-game-url.com");
        }
    }
}
  1. 额外注意:
    • 确保Flash插件的架构(32/64位)与JxBrowser、Java虚拟机完全一致
    • 部分游戏需要启用本地存储权限,可以通过JxBrowser的Permissions API手动授权

二、使用JCEF(Java Chromium Embedded Framework)自定义集成

如果JxBrowser的方案还是不行,可以直接用官方的JCEF——它是Chromium的Java绑定,灵活性更高,同样基于支持Flash的旧版CEF:

  1. 下载对应Chromium 87版本的JCEF预编译包(比如jcef_build_87.1.13+g080c78d+chromium-87.0.4280.88_windows64
  2. 配置Flash插件参数,初始化CEF时添加启动开关:
import org.cef.CefApp;
import org.cef.CefClient;
import org.cef.CefSettings;
import org.cef.browser.CefBrowser;
import org.cef.swing.CefBrowserUI;

import javax.swing.*;
import java.awt.*;

public class JCEFFlashGame {
    public static void main(String[] args) {
        CefSettings settings = new CefSettings();
        // 替换为你的Flash插件路径
        settings.commandLineArgs.add("--ppapi-flash-path=D:/plugins/pepflashplayer.dll");
        settings.commandLineArgs.add("--ppapi-flash-version=32.0.0.465");
        settings.commandLineArgs.add("--enable-plugins");
        settings.commandLineArgs.add("--no-sandbox");

        // 初始化CEF应用
        CefApp cefApp = CefApp.getInstance(settings);
        CefClient client = cefApp.createClient();

        // 创建浏览器并加载游戏URL
        CefBrowser browser = client.createBrowser("https://your-flash-game-url.com", false, false);
        CefBrowserUI browserUI = browser.getUIComponent();

        JFrame frame = new JFrame("JCEF Flash Game");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(browserUI, BorderLayout.CENTER);
        frame.setSize(800, 600);
        frame.setVisible(true);

        // 关闭时销毁CEF资源
        frame.addWindowListener(new java.awt.event.WindowAdapter() {
            @Override
            public void windowClosing(java.awt.event.WindowEvent e) {
                cefApp.dispose();
                frame.dispose();
            }
        });
    }
}

三、使用Ruffle(Flash模拟器)替代原生Flash

如果不想依赖已废弃的Flash插件,推荐用Ruffle——一个开源的Flash Player模拟器(基于Rust+WebAssembly),可以在现代浏览器中运行Flash内容,Java应用只需集成支持WebAssembly的嵌入式浏览器即可:

  1. 下载Ruffle的Web版本(包含ruffle.jsruffle.wasm
  2. 用JavaFX WebView或最新版JCEF集成,注入Ruffle脚本自动接管Flash内容:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class RuffleFlashGame extends Application {
    @Override
    public void start(Stage stage) {
        WebView webView = new WebView();
        WebEngine engine = webView.getEngine();

        // 注入Ruffle初始化脚本,再嵌套加载游戏网页
        engine.loadContent("<html><head>" +
                "<script src='D:/plugins/ruffle.js'></script>" +
                "</head><body style='margin:0'>" +
                "<script>" +
                "RufflePlayer.config = { 'autoplay': 'on', 'unmuteOverlay': 'hidden' };" +
                "RufflePlayer.load();" +
                "</script>" +
                "<iframe src='https://your-flash-game-url.com' width='100%' height='100%' frameborder='0'></iframe>" +
                "</body></html>");

        Scene scene = new Scene(webView, 800, 600);
        stage.setTitle("Ruffle Flash Game");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

这个方案的优势是无需依赖旧版浏览器和Flash插件,安全性更高,且Ruffle仍在维护,支持大部分主流Flash游戏。

四、嵌入旧版Firefox ESR(备选方案)

如果上述方案都不适用,可以尝试嵌入Firefox 52 ESR(最后一个原生支持Flash的Firefox版本),通过SWT的浏览器组件实现:

  1. 下载Firefox 52 ESR的便携版
  2. 配置SWT浏览器指向该便携版:
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class FirefoxFlashGame {
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        shell.setSize(800, 600);

        // 指定Firefox 52 ESR的安装路径和配置文件路径
        System.setProperty("org.eclipse.swt.browser.DefaultType", "mozilla");
        System.setProperty("org.eclipse.swt.browser.mozilla.profile", "D:/firefox-52-esr/profile");
        System.setProperty("org.eclipse.swt.browser.mozilla.xulrunner.path", "D:/firefox-52-esr");

        Browser browser = new Browser(shell, SWT.NONE);
        browser.setUrl("https://your-flash-game-url.com");

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

注意:这个方案需要匹配系统架构的Firefox 52 ESR版本,维护成本较高,仅作为最后备选。


内容的提问来源于stack exchange,提问作者Leg

火山引擎 最新活动