LWJGL 3. Универсальная загрузка нативных библиотек
от DominaN
Совсем недавно LWJGL третьей версии была новинкой, диковинкой. Когда я взялся за нее при переносе After Engine на OpenGL я, бывало, хотел откатиться на вторую версию, где были удобные вспомогательные классы и библиотеки. Однако, к счастью, я этого не сделал, зато открыл простоту и мощь третьей версии. Однако, чтобы не загружать пользователей моего движка лишней работой, я решил закопать все "шершавые" взаимодействия с библиотекой подальше в движок. В первую очередь меня озаботила проблема подгрузки нативных библиотек. Но, как оказалось, реализация автоматической загрузки не так уж и сложна. Стоит учитывать некоторые тонкости - во-первых представленный метод должен выполняться ДО любых обращений к LWJGL библиотеке, а во-вторых, есть некоторая неувязка имен папок с именами архитектуры, но об этом ниже, в третьих, сам по себе метод не осуществляет загрузку, он всего-лишь указывает корректный путь к бинарникам.
Сами бинарники при этом идут в комплекте поставки LWJGL, при этом они рассортированы по папкам вида "имя_ОС/архитектура" (например "windows/x64"). Для корректной работы метода, предположим, что бинарники лежат по пути "папка_приложения/lib/native/тут_папки_распределенные_по_ОС".
Итак, метод:
После этого при обращении к LWJGL будет загружена соответствующая версия нативной библиотеки
Сами бинарники при этом идут в комплекте поставки LWJGL, при этом они рассортированы по папкам вида "имя_ОС/архитектура" (например "windows/x64"). Для корректной работы метода, предположим, что бинарники лежат по пути "папка_приложения/lib/native/тут_папки_распределенные_по_ОС".
Итак, метод:
- //Вспомогательный метод, получает абсолютный путь к папке, из которой запущен jar,
- //будем считать ее корневой папкой приложения
- public static String getRootDir() {
- return new File(".").getAbsoluteFile().getParentFile().getAbsolutePath();
- }
- //Сам метод, указывающий путь к бинарникам
- public static loadNatives() {
- String osName = System.getProperty("os.name").toLowerCase().substring(0, System.getProperty("os.name").indexOf(' ')); //Получаем имя OS - Windows или Linux
- String osBit = System.getProperty("sun.arch.data.model"); //Получаем архитектуру ОС (32 bit, 64 bit)
- if (osBit.equals("32")) osBit = "86";//HACKHACK: это необходимо, поскольку бинарники для 32 битной системы лежат в подпапке "x86"
- System.setProperty("org.lwjgl.librarypath", new File(getRootDir().concat("/lib/native/").concat(osName).concat("/x").concat(osBit)).getAbsolutePath()); //Устанавливаем абсолютный путь до бинарников. В случае с ОС Linux 32 bit путь будет "папка_приложения/lib/native/linux/x86"
- }
После этого при обращении к LWJGL будет загружена соответствующая версия нативной библиотеки