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



## GuestfortheRest (31. Aug 2012)

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:

```
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:


```
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?


----------



## nillehammer (31. Aug 2012)

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.


----------



## GuestfortheRest (31. Aug 2012)

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


----------



## maki (31. Aug 2012)

Nutzt du denn auch ein 64 Bit JRE/JDK?


----------



## nillehammer (31. Aug 2012)

Habe es mir gerade angeschaut. Ich glaube, so krieg man den Libary-Path nicht hin. In dem Thread hier ist das Thema schon ausführlich diskutiert. Da müsstest Du eigentlich alle Alternativen finden, die Du brauchst_ http://www.java-forum.org/allgemeine-java-themen/140705-jni-unsatisfiedlinkerror.html


----------



## Nardian (31. Aug 2012)

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)


```
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


----------



## GuestfortheRest (31. Aug 2012)

Also mein Path ist:


```
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...


----------



## nillehammer (31. Aug 2012)

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.


----------



## Nardian (31. Aug 2012)

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.


----------



## GuestfortheRest (31. Aug 2012)

nillehammer hat gesagt.:


> 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 


```
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 ^^


----------



## Marco13 (31. Aug 2012)

Er findet offenbar die Bibliothek, aber nicht die Funktion "org.hyperic.sigar.Mem.gather(Lorg/hyperic/sigar/SigarV". (Das nur nebenbei, eine Lösung wüßte ich auch nicht, das müßte ich mir näher ansehen...)


----------



## GuestfortheRest (1. Sep 2012)

> ..., eine Lösung wüßte ich auch nicht, das müßte ich mir näher ansehen...)



Das wäre super. ;-)


----------



## GuestfortheRest (1. Sep 2012)

Also ich hab mal weiter gegooglet:

Folgende Lösungsmöglichkeiten gefunden, welche mir bei meinem Problem leider auch nicht helfen:
1) 
	
	
	
	





```
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.


----------



## Nardian (1. Sep 2012)

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.


----------



## GuestfortheRest (1. Sep 2012)

Ja, aber ändert nix an der Situation.


----------



## Marco13 (1. Sep 2012)

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.


----------



## Nardian (1. Sep 2012)

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.


----------



## GuestfortheRest (2. Sep 2012)

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


----------

