Native Library / Fehler beim Laden der .so/.dll Datei

Hallöle,
ich hab eine .Jar Datei der JRE System Library hinzugefügt (sigar.jar).
Nun kann ich wie gewollt erfolgreich auf die packages und so zugreifen, die benötigten .so / .dll Dateien habe ich über die Fenster manuell in Java/jre6/lib hineinkopiert.

Nun zu meinem Programm:
Java:
import java.io.*;
import java.util.*;
import java.text.*;
import java.lang.*;


import org.hyperic.sigar.Mem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;


public class MemExample {

    private static Sigar sigar = new Sigar();

    public static void getInformationsAboutMemory() {
        System.out.println("**************************************");
        System.out.println("*** Informations about the Memory: ***");
        System.out.println("**************************************\n");

        Mem mem = null;
        try {
            mem = sigar.getMem();
        } catch (SigarException se) {
            se.printStackTrace();
        }

        System.out.println("Actual total free system memory: "
                + mem.getActualFree() / 1024 / 1024+ " MB");
        System.out.println("Actual total used system memory: "
                + mem.getActualUsed() / 1024 / 1024 + " MB");
        System.out.println("Total free system memory ......: " + mem.getFree()
                / 1024 / 1024+ " MB");
        System.out.println("System Random Access Memory....: " + mem.getRam()
                + " MB");
        System.out.println("Total system memory............: " + mem.getTotal()
                / 1024 / 1024+ " MB");
        System.out.println("Total used system memory.......: " + mem.getUsed()
                / 1024 / 1024+ " MB");

        System.out.println("\n**************************************\n");


    }

    public static void main(String[] args) throws Exception{

                getInformationsAboutMemory();

                }

}

und nach ausführung erhalte ich folgende Fehlermeldung:

Java:
Failed to load sigar-amd64-winnt: java.lang.NullPointerException
org.hyperic.sigar.SigarException: Failed to load sigar-amd64-winnt: java.lang.NullPointerException
	at org.hyperic.sigar.Sigar.loadLibrary(Sigar.java:170)
	at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:100)
	at MemExample.<clinit>(MemExample.java:14)
**************************************
*** Informations about the Memory: ***
**************************************

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Mem.gather(Lorg/hyperic/sigar/Sigar;)V
	at org.hyperic.sigar.Mem.gather(Native Method)
	at org.hyperic.sigar.Mem.fetch(Mem.java:30)
	at org.hyperic.sigar.Sigar.getMem(Sigar.java:304)
	at MemExample.getInformationsAboutMemory(MemExample.java:23)
	at MemExample.main(MemExample.java:48)

Wo liegt mein Problem?! Bzw wie bekomme ich das hin, dass die sigar api weiß wo die .so / .dll files sind?
 
Zuletzt bearbeitet von einem Moderator:
Java schaut nach native Libs im sog. Library Path. Standardmäßig zeigt dieser mindestens auf die Library-Verzeichnisse des jeweiligen OS (/usr/lib bei Unix, system32 bei Windows). Da legt man seine eigenen Libraries aber selten ab. Wenn man sie in einem anderen Verzeichnis ablegt, muss man dieses noch zum Library-Path hinzufügen.
 
Ich hab ja schon versucht mittels Java Build Path > Libraries > JRE System Library [jre6] > Native Library Location > ... und dann den Java/jre6/lib Pfad als location Folder eingegeben...

das ganze hab ich auch mit
Java Build Path > Source > ../src > Native Library Location > ... und dann den Pfad...

beides funktioniert nicht 😉
 
Hi,

Wie nillehammer schon darauf hingewiesen hat, könntest du dir den library-path genauer ansehn.
Um herauszufinden wo sich dieser (bzw diese) auf deinem rechner befinden, führe das hier mal aus (vielleicht in einer eigenen main, da dein Proggy nichtmal zur main kommt, da ihm die imports fehlen)

Java:
System.out.println(System.getProperty("java.library.path"));

Ansonsten, wenn du diese .jar nur für dieses eine Programm benötigst, könntest du dir überlegen es ins root-verzeichnis des Programms (nicht auf / unter linux) einfach hinzukopieren. Dieser sollte meines Wissens nach auch "gescannt" und somit gefunden werden.

MfG
 
Also mein Path ist:

Java:
C:\Program Files\Java\jre6\lib;C:\Program Files\Java\jre6\lib

und dein anderer Link bringt mir leider nix, da ich nicht die rechte hab in der .Jar datei zu ändern und diese Meckert ja das sie die dateien nicht findet

Ich habe die .so/.dll daten für
Windows x86 NT 4.0, 2000 Pro/Server, 2003 Server, XP, Vista, 2008 Server, 7
Windows x64 2003 Server, Vista, 2008 Server, 7

also darin sollte es nicht liegen...
 
Das sieht mehr nach einem Classpath für Java-Libraries aus, nicht nach einem Library-Path für native Libraries. Führ mal Nardians Code aus. Der wird Dir sicherlich etwas anderes zeigen. Wenn in der Ausgabe Dein Verzeichnis erscheint, dann ist gut.
 
Der Hinweis mit dem "ins root kopieren" war schon so gemeint.. Ich meinte nich du sollst die .jar ändern, sondern ins root von DEINEM Programm kopieren.
Ich kenns von zb der OpenGL-Anbindung für Java (JOGL), dass es dort auch paar .jar Dateien gibt, und ich noch extra .dll's in den root von meinem Projekt kopieren musste (an der .jar hab ich auch nichts geändert).

Sicher, ist nur geraten dass es so sein könnte, aber versuchen kostet nix.
 
Das sieht mehr nach einem Classpath für Java-Libraries aus, nicht nach einem Library-Path für native Libraries. Führ mal Nardians Code aus. Der wird Dir sicherlich etwas anderes zeigen. Wenn in der Ausgabe Dein Verzeichnis erscheint, dann ist gut.

Die Ausgabe ist

Java:
C:\Program Files\Java\jre6\lib;C:\Program Files\Java\jre6\lib

und ja da befinden sich auch die dateien
sigar-amd64-winnt.dll
und falls java mit 64 nicht klar kommt (was eigentlich nicht sein kann, weil bisher alles gepasst hat) auch
sigar-x86-winnt.dll

Wie kopiere ich die denn ins root? ich hab win 7 64Bit ... nicht Linux ^^
 
Er findet offenbar die Bibliothek, aber nicht die Funktion "org.hyperic.sigar.Mem.gather(Lorg/hyperic/sigar/Sigar😉V". (Das nur nebenbei, eine Lösung wüßte ich auch nicht, das müßte ich mir näher ansehen...)
 
Also ich hab mal weiter gegooglet:

Folgende Lösungsmöglichkeiten gefunden, welche mir bei meinem Problem leider auch nicht helfen:
1)
Java:
System.setProperty("path", "-")
2) Run Configuration > VM Arguments > DJava.library.path="path/of/the/lib"

Also wie könnte man noch das Probelm beheben? Ich meine das Programm findet ja die lib nur das Laden der .dll funktioniert nicht.
 
Sorry wenn ich falsch liege, aber hast du wirklich schon mal versucht die dlls in deinen programm-Root zu kopieren? Also nich in die jar rein, sondern wenn du zb eclipse verwendest direkt neben die .project file.

musste ich damals mit JOGL (Javas anbindung zu OpenGL) auch machen - alternativ dazu war ein eigener classloader, aber sowas ist meist eher mühsam.
 
Tja, hab' gerade mal ein minimalistisches Testprogramm in den lib-Ordner von Sigar kopiert, compiliert und gestartet und das ging - war aber auf WinXP. Also entweder das kommt nicht mit Win7 klar, oder du hast beim Angeben der native library location was falsch gemacht. Vielleicht kanns ja noch jemand auf Win7 testen, um das auszuschließen.
 
Sorry, aber es liegt wohl nich an der library...

ich hab win7, eclipse juno und java 7. hab die sigar.jar zum buildpath eingebunden, und die eine sigar-amd64-winnt.dll in den root vom projekt kopiert und das testprogramm vom 1. post läuft fehlerfrei.

keine ahnung ob es einen unterschied macht, aber hast du vielleicht nen intel? könnte sein dass das teil was recht spezifisches mit amd prozessoren machen will, was intel nicht unterstützt?
wie gesagt, kann auch reiner blödsinn sein, ist nur geraten.. aber die jar und die dll funktionieren.
 
gut ich hab natürlich einen Intel, ich hoffe mal das es nicht daran liegt.
werde jetzt noch mal alles neu machen, .dll ins root und sigar.jar in den buildpath einbinden...

wenns dann nicht klappt muss ich halt auf javamelody umsteigen 🙂
 
Zuletzt bearbeitet:

Zurück
Oben