Tool(sbt)slf4jsambasubcutsubversionsniffingSVGswtTDDThrifttomcatTractwitterthymeleafvaadinwicketwindowswippienwordpresszebedee仮想化vlcjVisualVMXAMPPプログラム設計論その他・未整理SWTSWTはなぜDLLが要らない(ように見える)のか大昔のSWTはjarファイルとDLLファイル(Windowsの場合)とに分離しており、これをアプリケーションで使うにはアプリ自体にはjarを付属させ、dllファイルは「パス」に置くしかなかった(起動時にjava.library.pathを指定してもよいが)。現在のswtはswt.jarのみをアプリに付属させれば良いようになっている。当然のことながら、相変わらずDLLは必要なのであり、しかもこれはOS側がロードするものなので、それぞれのDLLはそれぞれ一つのファイルとなっていなければならない。やっているのか?以下はswt3.7での検証結果である。jarの中にすべてのdllが含まれている例えば、win32-win32-x86用のswt.jarを展開してみると、以下のようなファイルが現れる。バイトこのように、実はswt.jarのトップに必要なdllが格納された状態になっている。これをどうやって実行時に「Windowsにロードさせる」だろうか?DLLロードまでの経緯ここで、実際にDLLがロードされるまでの経緯を追ってみる。これはswtのソースコードを見ればすぐにわかる。org.eclipse.swt.awt.SWT_AWT.javaを見てみる。これは、SWTからSwingの機能を呼び出すためのクラスである。冒頭に、以下の部分がある。Library.loadLibrary("swt-awt");}とりあえず、「System.loadLibrary("jawt")」は無視し、「Library.loadLibrary」("swt-awt")に注目する。//$NON-NLS-1$}}前半は、与えられた名称をプラットフォームに合わせて適切な名称に変換している。この場合には「swt-awt」を「swt-awt-win32-3735」に変換しているものと思われる。後半はそれをロードするわけであるが、まずは、swt.library.pathや通常のjavaライブラリパスを優先してロードしてみる。それが失敗すると、「user.home」のSWT_LIB_DIRからロードしようとする。arch();」などと定義されている。7(32ビット)でユーザ名がfooの場合には、「c:\users\foo\.swt\lib\win32\x86」となる。}として、jarファイルからdllを抜き出してそれをロードするが、これはextract,loadメソッドを見ればわかるが単純な処理である。jar中のリソースとしてdllファイルをオープンし、先のパスのファイルとしてコピーし、それをSystem.loadLibraryでロードしている。Startの場合でも全く同じになる。Startにネイティブライブラリを含めるには、nativelibというタグを使わなくてはならないが、swtの場合にはあたかもネイティブライブラリ無しのjarファイルであるかのように扱ってよい。href="lib/win32-win32-x86/swt.jar"/></resources>もちろん、swt.jarが署名されていることが前提である。署名しなければ、、「c:\users\foo\.swt\lib\win32\x86」のようなディレクトリに書きこむことはできず、そもそもネイティブライブラリの呼び出し自体ができない。