2008年5月27日火曜日

Appletからネイティブライブラリをロードする(リフレクション編)

以前、NyARToolkitをApplet化するときに、かなり複雑なことをしてネイティブライブラリをロードしていました。
が、リフレクション使えばもっと簡単に出来そうなことに今更ながら気が付きました。

URL url = NativeLoadTest.class.getResource("jogl_awt.dll");
File file = new File(url.toURI());

ClassLoader cl = Thread.currentThread().getContextClassLoader();

Field f = ClassLoader.class.getDeclaredField("usr_paths");
f.setAccessible(true);
String[] paths = (String[]) f.get(cl);

String[] paths2 = new String[paths.length + 1];
System.arraycopy(paths, 0, paths2, 0, paths.length);
paths2[paths2.length - 1] = file.getParentFile().getAbsolutePath();

f.set(cl, paths2);
f.setAccessible(false);

System.loadLibrary("jogl_awt");
まだAppletでは試していませんが、これならかなり簡単。
もちろんセキュリティーは無視するとして。
ClassLoaderの実装依存(フィールド名が変わったらダメ)なのが問題点ですが、今更変わるものでもないでしょう。
ということで、近々NativeCapableフレームワーク更新します。


SunがApplet Launcherというものを公開しているのを最近知りました。
Java Web StartのApplet適用っていう感じです。
Sunが署名しているため、安心して使うことが出来ます。
メジャーなネイティブライブラリ(JOGLやJava3Dなど)を使う場合はこれを使うのがよさそうです。
(ライブラリ側で対応しておかないといけないのが難点ですが)

時間があれば使ってみて感想を書きたいと思います。

0 件のコメント: