Supporting SWT on Windows/Mac & 32bit/64bit

爱⌒轻易说出口 提交于 2019-12-08 01:38:35

问题


I'm currently working with the DJProject to put a browser into my Java Swing application. DJProject uses SWT to run and I have very little experience with SWT.

I want to support Windows and Mac both 32bit and 64bit. I understand there is a swt.jar file for each of these platforms. I have all 4 swt.jar libraries added to my classpath as a library to the main application.

My problem is when I try running the application on a Mac for example I get the error:

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

how would I go about to automatically tell Java at run-time to load the proper variation of the SWT library.


回答1:


You can detect the OS and Java version and dynamically load the appropriate 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:


How would I go about to automatically tell Java at run-time to load the proper variation of the SWT library?

You don't. You create 4 jar files, one for each of the machines (Windows and Mac) and operating systems (32 bit and 64 bit).

Each jar file contains the SWT jar library appropriate for one machine and one operating system



来源:https://stackoverflow.com/questions/14144232/supporting-swt-on-windows-mac-32bit-64bit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!