LWJGL 3. Универсальная загрузка нативных библиотек

от
Java   library

Совсем недавно LWJGL третьей версии была новинкой, диковинкой. Когда я взялся за нее при переносе After Engine на OpenGL я, бывало, хотел откатиться на вторую версию, где были удобные вспомогательные классы и библиотеки. Однако, к счастью, я этого не сделал, зато открыл простоту и мощь третьей версии. Однако, чтобы не загружать пользователей моего движка лишней работой, я решил закопать все "шершавые" взаимодействия с библиотекой подальше в движок. В первую очередь меня озаботила проблема подгрузки нативных библиотек. Но, как оказалось, реализация автоматической загрузки не так уж и сложна. Стоит учитывать некоторые тонкости - во-первых представленный метод должен выполняться ДО любых обращений к LWJGL библиотеке, а во-вторых, есть некоторая неувязка имен папок с именами архитектуры, но об этом ниже, в третьих, сам по себе метод не осуществляет загрузку, он всего-лишь указывает корректный путь к бинарникам.

Сами бинарники при этом идут в комплекте поставки LWJGL, при этом они рассортированы по папкам вида "имя_ОС/архитектура" (например "windows/x64"). Для корректной работы метода, предположим, что бинарники лежат по пути "папка_приложения/lib/native/тут_папки_распределенные_по_ОС".

Итак, метод:
  1. //Вспомогательный метод, получает абсолютный путь к папке, из которой запущен jar,
  2. //будем считать ее корневой папкой приложения
  3. public static String getRootDir() {
  4.     return new File(".").getAbsoluteFile().getParentFile().getAbsolutePath();
  5. }
  6.  
  7. //Сам метод, указывающий путь к бинарникам
  8. public static loadNatives() {
  9.     String osName = System.getProperty("os.name").toLowerCase().substring(0, System.getProperty("os.name").indexOf(' ')); //Получаем имя OS - Windows или Linux
  10.     String osBit = System.getProperty("sun.arch.data.model"); //Получаем архитектуру ОС  (32 bit, 64 bit)
  11.  
  12.     if (osBit.equals("32")) osBit = "86";//HACKHACK: это необходимо, поскольку бинарники для 32 битной системы лежат в подпапке "x86"
  13.  
  14.     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"
  15. }

После этого при обращении к LWJGL будет загружена соответствующая версия нативной библиотеки
+7   7   0
2727