2

私は現在、DJProjectを使用して、ブラウザーをJavaSwingアプリケーションに組み込んでいます。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ライブラリの適切なバリエーションをロードするように自動的に指示するにはどうすればよいでしょうか。

4

2 に答える 2

5

OSと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);
    }
}
于 2013-07-02T16:57:39.747 に答える
1

実行時にJavaにSWTライブラリの適切なバリエーションをロードするように自動的に指示するにはどうすればよいですか?

あなたはそうしない。マシン(WindowsおよびMac)およびオペレーティングシステム(32ビットおよび64ビット)ごとに1つずつ、合計4つのjarファイルを作成します。

各jarファイルには、1台のマシンと1台のオペレーティングシステムに適したSWTjarライブラリが含まれています。

于 2013-01-03T18:35:22.507 に答える