【问题标题】:Supporting SWT on Windows/Mac & 32bit/64bit在 Windows/Mac 和 32bit/64bit 上支持 SWT
【发布时间】:2013-01-03 17:41:24
【问题描述】:

我目前正在使用DJProject 将浏览器放入我的Java Swing 应用程序中。 DJProject 使用 SWT 运行,我对 SWT 的经验很少。

我想同时支持 32 位和 64 位的 Windows 和 Mac。我知道每个平台都有一个 swt.jar 文件。我已将所有 4 个 swt.jar 库作为主应用程序的库添加到我的类路径中。

我的问题是,例如,当我尝试在 Mac 上运行应用程序时出现错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM

我将如何在运行时自动告诉 Java 加载 SWT 库的正确变体。

【问题讨论】:

标签: java cross-platform swt


【解决方案1】:

您可以检测操作系统和Java版本并动态加载相应的jar:

private void loadSwtJar() {
    try {
        Class.forName (ORG_ECLIPSE_SWT_WIDGETS_SHELL);
        return;
    } catch (ClassNotFoundException e) {
        System.out.println (" ! Need to add the proper swt jar: "+e.getMessage());
    }

    String osName = System.getProperty("os.name").toLowerCase();
    String osArch = System.getProperty("os.arch").toLowerCase();

    //NOTE - I have not added the mac and *nix swt jars.
    String osPart = 
        osName.contains("win") ? "win" :
        osName.contains("mac") ? "cocoa" :
        osName.contains("linux") || osName.contains("nix") ? "gtk" :
        null;

    if (null == osPart)
        throw new RuntimeException ("Cannot determine correct swt jar from os.name [" + osName + "] and os.arch [" + osArch + "]");

    String archPart = osArch.contains ("64") ? "64" : "32";

    System.out.println ("Architecture and OS == "+archPart+"bit "+osPart);

    String swtFileName = "swt_" +osPart + archPart +".jar";
    String workingDir = System.getProperty("user.dir");
    String libDir = "\\lib\\";
    File file = new File(workingDir.concat(libDir), swtFileName);
    if (!file.exists ())
        System.out.println("Can't locate SWT Jar " + file.getAbsolutePath());

    try {
        URLClassLoader classLoader = (URLClassLoader) getClass().getClassLoader ();
        Method addUrlMethod = URLClassLoader.class.getDeclaredMethod ("addURL", URL.class);
        addUrlMethod.setAccessible (true);

        URL swtFileUrl = file.toURI().toURL();
        //System.out.println("Adding to classpath: " + swtFileUrl);
        addUrlMethod.invoke (classLoader, swtFileUrl);
    }
    catch (Exception e) {
        throw new RuntimeException ("Unable to add the swt jar to the class path: " + file.getAbsoluteFile (), e);
    }
}

【讨论】:

    【解决方案2】:

    如何在运行时自动告诉 Java 加载 SWT 库的正确变体?

    你没有。您创建 4 个 jar 文件,每个机器(Windows 和 Mac)和操作系统(32 位和 64 位)各一个。

    每个 jar 文件都包含适用于一台机器和一个操作系统的 SWT jar 库

    【讨论】:

    • 问题是我有所有 4 个 jar 文件,但 Java 似乎加载了错误的一个,我有所有 4 个,它适用于 Win 64 但是当我在 Mac 64 上测试时它不起作用,我得到那个错误。
    • 也许我不清楚。 Mac 64 位 jar 只能在 Mac 64 位机器上运行。其他 3 个罐子不会靠近那台 Mac 64 位机器。其他 3 个罐子也是如此。
    • 我明白,但我不想让我的应用程序出现 4 种不同的偏差。我想同时发布一款适用于所有 4 个平台的应用程序。所以我要问的是,是否有可能在运行时根据应用程序运行的平台准确选择要使用的 swt jar。
    • 不,你不能总是得到你想要的。但如果你尝试一下,你可能会发现你得到了你需要的东西。
    猜你喜欢
    • 2015-07-10
    • 2016-05-10
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多