В Windows системное свойство java.library.path начинается с пути к каталогу bin, содержащему тот файл java.exe, который использовался для запуска файла jar.
Это имеет смысл, потому что в Windows первое место, где любой исполняемый файл ищет DLL-файлы, - это каталог, содержащий сам исполняемый файл. Поэтому, естественно, когда JVM запускается, первое место, где он ищет DLL, - это каталог, содержащий java.exe.
Путь к java.exe можно получить следующим образом:
final String javaLibraryPath = System.getProperty("java.library.path");
final File javaExeFile = new File(
javaLibraryPath.substring(0, javaLibraryPath.indexOf(';')) + "\\java.exe"
);
final String javaExePath =
javaExeFile.exists() ? javaExeFile.getAbsolutePath() : "java";
Этот код специфичен для Windows - я жестко запрограммировал разделитель пути (;) и разделитель файлов (). Я также добавил в качестве отступления просто "java" на случай, если трюк с путём библиотеки не работает.
Я протестировал это с Java 6 и 7 на Windows 7. Я попробовал 32-битную и 64-битную версию Java.