SWTでdll指定が不要になった?
昔はSWTのDLLにネイティブのライブラリーパス(java.library.pathとか)を指定しないといけなかったはずだが
http://d.hatena.ne.jp/muimy/20050902/p3
最近SWTをためしたら、そんな設定いらんことになってる。
なんで???
JARのルートに配置したDLLって勝手に読まれるんだったっけ???
SWTのソースを見てみたら、どうやら中でそのような処理を行っているようだ。
org.eclipse.swt.internal.Libraryクラスの
loadLibrary (String, boolean)メソッドで
DLLが見つからなかったらJARの中からDLLをひろって、
java.io.tmpdir(C:\Documents and Settings\誰それ\Local Settings\Temp)
にコピーしてそこから読むとかしてる。
該当コード
/* Try loading library from the tmp directory if swt library path is not specified */ if (path == null) { path = System.getProperty ("java.io.tmpdir"); //$NON-NLS-1$ path = new File (path).getAbsolutePath (); if (load (path + SEPARATOR + mappedName1)) return; if (mapName && load (path + SEPARATOR + mappedName2)) return; } /* Try extracting and loading library from jar */ if (path != null) { if (extract (path + SEPARATOR + mappedName1, mappedName1)) return; if (mapName && extract (path + SEPARATOR + mappedName2, mappedName2)) return; }
で、一度、そこにコピーした後消さないから、
その後、DLL抜きで(swt.jarを展開してDLLをとって)試してみても、動く(上のjava.io.tmpdirから拾ってくる)
一方、自分で
System.loadLibrary("swt-win32-3346")
とかしても、ひろってこない。あくまでSWTの中のクラスでやってる処理。
うーん、便利といえば便利なんだけど、前と違うおかしいな、
と思ってちょっとはまった。
きっとドキュメントよめばちゃんと書いてるんだろうな。