2013-01-03 131 views
2

我目前正在使用DJProject將瀏覽器放入我的Java Swing應用程序中。 DJProject使用SWT來運行,而我對SWT的經驗很少。在Windows/Mac和32位/ 64位上支持SWT

我想支持Windows和Mac 32位和64位。我知道每個平臺都有一個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庫。

+0

可能重複[創建跨平臺的Java SWT應用程序](http://stackoverflow.com/questions/2706222/create-cross-platform-java-swt-application) –

回答

3

您可以檢測操作系統和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); 
    } 
} 
1

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

你不知道。您可以創建4個jar文件,每個機器(Windows和Mac)和操作系統(32位和64位)都有一個。

每個jar文件包含適用於一體機和一個操作系統的SWT JAR庫

+0

事情是我有所有4個jar文件,但Java似乎加載了錯誤的一個,我有全部4,它在Win 64上工作,但是當我在Mac 64上測試時,它不起作用,我得到了這個錯誤。 –

+0

也許我不清楚。 Mac 64位jar只能在Mac 64位機器上運行。其他3個罐子不會靠近Mac 64位機器。其他3個罐子也是如此。 –

+0

我明白,但我不想讓我的應用程序有4個不同的傾斜。我想要發佈一個適用於所有4個平臺的應用程序。所以我問的是,在運行時,是否可以根據應用程序運行的平臺來選擇使用哪個swt jar。 –