sigar-amd64-winnt.dll не может ссылаться на него или связывать его с .jar

(Может быть, это очевидная ошибка, которую я совершаю, но я не смог заставить ее работать через 6 часов.)

Я пытаюсь получить информацию о процессоре, используя sigar.jar в своем проекте eclipse (пока просто тестирую API sigar).

Он работает в затмении без проблем:

  • что заставило его работать в eclipse, так это поместить dll в ту же папку, что и sigar.jar
  • Я проверил, что добавление пути к dll в качестве «собственного свойства кода» в диалоговом окне конфигурации пути сборки не имеет никакого эффекта.
  • Добавление аргументов vm в конфигурацию запуска также не дает никакого эффекта.
  • Я протестировал размещение 2 поддельных путей в этих 2 местах, и пока у меня есть dll в той же папке, что и sigar.jar... он хорошо работает в eclipse.

Проблема в том, что я пытаюсь экспортировать исполняемый файл .jar для своего проекта. Я пробовал 2 вещи:

  • Я изменил файл MANIFEST.MF с помощью Bundle-NativeCode: libs/sigar-amd64-winnt.dll (здесь я предполагаю, что путь указан относительно папки проекта) -> безуспешно:
 main starting!! no sigar-amd64-winnt.dll in java.library.path
 org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in
 java.library.path
         at org.hyperic.sigar.Sigar.loadLibrary(Sigar.java:172)
         at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:100)
         at CpuData.main(CpuData.java:59) 
 cpudata(sigar s) starting!!! cpuInfo() starting!!! 
 Exception in thread
 "main" java.lang.UnsatisfiedLinkError:
 org.hyperic.sigar.Sigar.getCpuInfoList()[Lorg/hyperic/sigar/C puInfo;
         at org.hyperic.sigar.Sigar.getCpuInfoList(Native Method)
         at CpuData.cpuInfo(CpuData.java:103)
         at CpuData.<init>(CpuData.java:29)
         at CpuData.main(CpuData.java:59)
  • Затем я решил поместить .dll в ту же папку, что и мой проект.jar, и использовать в командной строке: java -Djava.library.path=./native/ -jar C:\cpu_usage_log\cpu3.jar (я m, предполагая, что здесь путь относится к папке, содержащей project.jar) ... но снова безуспешно:

Ошибка: невозможно найти или загрузить основной класс .library.path=..native

(Я подозревал, что мне следует указать имя основного класса в качестве второго аргумента после -Djava.library.path=./path/, но я не могу найти это предполагаемое имя «основного класса» или какие-либо примеры в Интернете, которые делают указать такой класс ... это основной класс из .dll?)

Я действительно не знаю, что еще попробовать на данный момент. Я читал, что эти 2 решения работали для других, и это еще больше расстраивает, потому что я представляю, что это может быть что-то очевидное, что я пропустил или не понял при чтении других сообщений и что я просто не могу найти (это первый раз, когда я имею дело с собственными DLL в проекте Java).


person Nick463    schedule 22.03.2013    source источник
comment
вам удалось решить проблему. У меня та же проблема.   -  person Peter Penzov    schedule 18.07.2016


Ответы (1)


Для меня всегда было лучше изменить способ загрузки библиотеки Java.

Обычно вы вызываете System.loadLibrary("mylib");, который ищет библиотеку по пути к библиотеке.

ИМХО, гораздо лучше загружать библиотеку, используя ее абсолютный путь. Это позволяет реализовать пользовательскую логику поиска в вашей программе:

// Extends the name to mylib.so or mylib.dll
mylibname = System.mapLibraryName("mylib"); 

// Load the library via its absolute path
System.load(new File(path, mylibname).getAbsolutePath());

Обратите внимание, что каждая библиотека может быть загружена только один раз, поэтому, если вы загрузите библиотеку, как показано выше, последующие вызовы System.loadLibrary("mylib"); будут игнорироваться, поскольку библиотека уже загружена.

person Robert    schedule 22.03.2013
comment
Спасибо. что сделал это. как ни странно, я все еще получаю ошибку «библиотека не найдена» в терминале — выдается еще до того, как запускается первая строка основной — но в остальном все работает. C:\Users\Nick>java -jar C:\cpu_usage_log\cpu_utilization_statistics_to_output file_csv.jar no sigar-amd64-winnt.dll in java.library.path org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in java.library.path at org.hyperic.sigar.Sigar.loadLibrary(Sigar.java:172) at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:100) at CpuData.main(CpuData.java:67) - person Nick463; 02.04.2013