0

この修正でアプレットを操作するために、jar から dll ファイルを読み込もうとしています。

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
4

1 に答える 1