2011-06-23 4 views
0

で無SWT-炭素-3346またはSWT-炭素は、私が行くハローワールドSWTアプリケーションを取得しようとしています:SWT + Mavenの+のEclipse =ます。java.lang.UnsatisfiedLinkError:swt.library.path

public static void main(String args[]) throws IOException{ 
    Display display = new Display(); 
    Shell shell = new Shell(display); 
    shell.open(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) display.sleep(); 
    } 
    display.dispose(); 
} 

しかし、私は次の例外を得ています。私はorg.eclipse.swt.carbonのmacosx版をeclipse/mavenで使用しています。誰もこれを見たことがありますか?

Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-carbon-3346 or swt-carbon in swt.library.path, java.library.path or the jar file 
    at org.eclipse.swt.internal.Library.loadLibrary(Library.java:219) 
    at org.eclipse.swt.internal.Library.loadLibrary(Library.java:151) 
    at org.eclipse.swt.internal.C.<clinit>(C.java:21) 
    at org.eclipse.swt.widgets.Display.createDisplay(Display.java:943) 
    at org.eclipse.swt.widgets.Display.create(Display.java:937) 
    at org.eclipse.swt.graphics.Device.<init>(Device.java:119) 
    at org.eclipse.swt.widgets.Display.<init>(Display.java:749) 
    at org.eclipse.swt.widgets.Display.<init>(Display.java:740) 
    at com.wuntee.aat.command.adb.LogCat.main(LogCat.java:30) 

答えて

2

SWTはネイティブUIライブラリを使用して実装されている - この場合には、マックカーボンライブラリ - とは、ネイティブカーボンコールへのSWTの呼び出しをマーシャリングするために、いくつかのJNIコードが必要です。 JNIライブラリの読み込みは、通常のクラスローディングとは少し異なります(ダイナミックライブラリには、最初にSystem#loadLibraryがロードされている必要があります)。

最初に、64ビットマシンを使用している場合は、-d32引数をJREに渡していることを確認してください。 (すなわち、java -d32 MyTestClass)。 Carbon SWTライブラリは32ビットのみで、64ビットのランタイムではロードされません。

デフォルトでは、SWTはクラスパス内のJARファイルから.jnilib動的ライブラリをロードしようとします。ライブラリlibswt-carbon-3346.jniliborg.eclipse.swt.carbon.macosx... JARに存在する必要があります。 SWTはこのjnilibをあなたのJARから一時的な場所に解凍してロードしようとします。

何らかの理由で(java.io.tmpdirが書き込み可能でない場合)これを実行できない場合、これは失敗します。この問題を回避するには、org.eclipse.swt.carbon.macosx JARからlibswt-carbon-3346.jnilibを抽出し、例外の指示に従ってください。 (たとえば、そのjnilibの場所にswt.library.pathを設定してください)

SWT 3.3を使用しています。それ以来、(おそらく望ましい)ココアのサポートを含む多くの変更がなされています。最新のEclipseで最新のSWTライブラリにアップグレードすることは非常に役に立ちます。

+0

私はあなたが言っていることを理解していますが、もし私が物事をできるだけ「きれい」にしたいのであればどうしますか?たとえば、Eclipseからインポートしたswtライブラリの.jnilibファイルを見ることができます。アプリケーションを実行するときに、巨大なjava -D ... -D ... -D ...呼び出しをしたくありません。どうやって間違っているのか正確に知ることができますか? – wuntee

+0

最新のSWTバージョンのダウンロードが終了し、正常に動作しているようです。私が持っていた1つの問題は、ライブラリを私のローカルMavenリポジトリに組み込み、m2eclipse経由でプロジェクトに組み込むときでした。アプリケーションがメインスレッドとして実行されていないというエラーがありましたが、うまく動作しているようです....助けてくれてありがとう。 – wuntee

関連する問題