Я использую собственный интерфейс Java для включения статически скомпилированного кода в мое приложение Java. В частности, у меня есть файл DLL с скомпилированным кодом в WAR, который содержит мое приложение.
К сожалению, загрузчик классов не может загрузить DLL изнутри WAR (из предварительного исследования ... если это не так, обязательно сообщите мне!). Поэтому я должен скопировать DLL во временную папку, а затем загрузить ее оттуда.
Но когда я пытаюсь загрузить скопированную DLL, я получаю java.lang.UnsatisfiedLinkError: C:\path\to\dll\VIX.dll: %1 is not a valid Win32 application
. Размеры файлов выглядят одинаково (оба 401K, согласно Windows), но это просто не работает. Вот код, который выполняет копирование:
InputStream ReadDLL = Thread.currentThread().getContextClassLoader().getResourceAsStream("/VIX.dll");
File file = new File(workDir, "VIX.dll");
OutputStream WriteDLL = null;
try {
WriteDLL = new FileOutputStream(file);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
byte[] buffer = new byte[1024];
int numchars;
try {
while((numchars = ReadDLL.read(buffer)) > 0) {
WriteDLL.write(buffer, 0, numchars);
}
ReadDLL.close();
WriteDLL.close();
} catch (IOException e) {
e.printStackTrace();
}
Сравнивая оригинальную и скопированную версии DLL, я обнаружил, что каждый экземпляр байта 0x0A (символ перевода строки ASCII) в оригинале заменяется двумя байтами: 0x0D0A (CRLF ASCII). Конечно, это DLL, 0x0A - это не на самом деле перевод строки, а просто двоичный код операции. Но по какой-то причине Java настаивает на том, чтобы сделать этот полезный перевод для меня.
Наконец, ReadDLL InputStream получается путем вызова Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
, где, очевидно, fileName
- это имя моего файла.