seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

JAVAアプレットからDLLを呼び出す方法

 署名付きアプレットは特にセキュリティポリシーを設定しないかぎり(JAVA1.1の互換性のため)制限なしで動作するため、ローカルファイルもいじれるしJNIも使えるようになる。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/security/spec/security-spec.doc1.html
 しかし、アプレットのJARの中にDLLを入れるだけでは、System.loadLibrary()等ではDLLをロードできない。そのため、自作DLLをJNIで呼び出すことはできない。

 この制約を回避するにはDLLを(アプレットから)ローカルにダウンロードさせればよい。
 署名付きアプレットがローカルファイルへの操作権限をもっている以上、自分のJARファイルをClassLoader#getResouceAsStream()等で読み込んで、ユーザ・テンポラリに書き込むことは問題ない。
 ローカルファイルのパスが分かればSystem.load()メソッドでDLLをロードできる。
 DLLがロードできればJNIが起動できるようになる。

[モトネタ]
http://www.javaworld.com/javaworld/jw-10-1998/jw-10-apptowin32.html

※ テンポラリディレクトリを検出するには、System.getProperty("java.io.tmpdir") が使える。(これは、File#createTempFile()メソッドのソースコードで使われているプロパティ)