この修正でアプレットを操作するために、jar から dll ファイルを読み込もうとしています。
ファイルを作成し、書き込み可能および実行可能に設定しましたが、canWrite()/canExecute() でチェックすると false が返されます。アプレットは署名されています。
コード:
private static void loadLib() {
URL res = SystemActivityNotifications.class.getResource("/sys-native
/sysactivitynotifications.dll");
InputStream in = res.openStream();
File dll = new File(path + "sysactivitynotifications.dll");
dll.setExecutable(true);
dll.setWritable(true);
logger.info(dll.canWrite() + " " + dll.canExecute());
FileOutputStream fos = new FileOutputStream(dll);
byte[] array = new byte[1024];
try {
for(int i = in.read(array); i != 1; i=in.read(array)) {
fos.write(array, 0, i);
}
} catch (IOException e) { logger.info("Cannot write to file: " + e.getMessage()); }
fos.close();
in.close();
System.load(dll.getAbsolutePath());
}
ファイルは正しく作成されますが、ファイルに書き込もうとすると例外がスローされます。
編集: アプレットを 2 回目に実行したときにファイルに書き込みますが、ファイルを削除して再度実行すると、最初の反復が機能しません。
言い忘れましたが、上記のコードはすべて System.load.library(dll); の後の catch ブロックからのものです。例外をスローします。
try
{
System.loadLibrary("sysactivitynotifications");
ptr = allocAndInit();
if (ptr == -1)
ptr = 0;
}
catch (Throwable t)
{
if (t instanceof ThreadDeath)
throw (ThreadDeath) t;
else {
loadLib();
}
}
編集:このエラーがスローされます:
java.lang.UnsatisfiedLinkError: C:\: The process cannot access the file because it is being used by another process