Announcement

Collapse
No announcement yet.

Eingebundene DLL in IDE verfügbar aber nicht beim Export in JAR

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Eingebundene DLL in IDE verfügbar aber nicht beim Export in JAR

    Hallo,
    ich habe ein ziemlich verwirrendes Problem.
    Ich habe für mein Java-Projekt 3 Geräteschnittstellen-DLLS geschrieben.
    Ich habe diese in der IDE in mein Projekt eingebunden.
    Alles läuft, kein Problem.
    Ich exportiere das ganze in ein JAR-File aus dem ich das Projekt nachher aufrufen möchte.
    Mit der ersten DLL funktioniert alles prima.
    Ich binde die 2 anderen auch ein,
    nur die dritte DLL erzeugt folgenden Fehler:

    Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Windows\System32\CLM_ph.dll: Can't find dependent libraries...

    Weiß jemand Hilfe? Ich suche schon seit 3 Wochen. Ob im Buid-Path oder nicht. Ob im Package-Explorer aktualisieren oder neu einfügen. Immer das gleiche Problem. Ich weiß echt nicht weiter und die Zeit drängt.
    Schöne Grüße

  • Christian Marquardt
    replied
    Danke sehr

    Leave a comment:


  • ngomo
    replied
    Beispielcode

    Ich hab mal quick and dirty code geschrieben, der von einem Inputstream eine dll liest, sie in eine Datei auf Platte schreibt, und dann direkt lädt. Der InputStream ist zwar eine Datei, aber es dürfte nicht all zu schwierig sein, den so umzustellen, dass er eine Resource lädt (siehe mein Post weiter oben).


    Ich habe gegen die dll nicht programmiert, aber es klappt zumindest soweit, dass keine Exceptions fliegen. Ist wie gesagt alles quick and dirty. Was man besser machen sollte hab ich im Code in Kommentare geschrieben.

    Code:
    // Die ganzen Aktionen werden hier in main gemacht, damit man das direkt
    // ausprobieren kann. Normalerweiser hat man eine eigene Klasse, die sich
    // um das Laden von Libraries kümmert. In dieser Klasse benutzt man am 
    // besten einen static initializer. Auch das zusammenbauen der Pfade mit "+"
    // sollte man schöner lösen.
    public static final void main(final String[] args) throws Exception {
    
    // Hier sollte man prüfen, ob die Datei vielleicht schon vorhanden ist.
    // Dann kann man sich das unnötige Schreiben sparen
    
    // Hier kommt die dll aus einer anderen Datei. Beim Laden aus einem jar
    // getResourceAsStream benutzen.
      final InputStream in = new BufferedInputStream(
        new FileInputStream("C:/Programme/7-Zip/7-zip.dll"));
    
    // Hier wird einfach in das home-Verzeichnis des Users geschrieben. Ein
    // anwendungsspezifischer Unterordner im home-Verzeichnis wäre sicher
    // besser.        
      final OutputStream out = new BufferedOutputStream(
        new FileOutputStream(System.getProperty("user.home")+"\\7-zip.dll"));
    
      int b;
      while ((b = in.read()) != -1) {
        out.write(b);
       }
    
       in.close();
       out.close();
    
    // Der Ordner wird einfach dem libary path hinzugefügt. Man sollte 
    // vielleicht prüfen, ob er evtl. schon vorhanden ist.
       final String libraryPath = System.getProperty("java.library.path") + 
          ";" + System.getProperty("user.home");
            
      System.setProperty("java.library.path", libraryPath);
    
    // Ohne ".dll" klappts mit dem Laden.        
      System.loadLibrary("7-zip");
    }
    Gruß ngomo

    Leave a comment:


  • Christian Marquardt
    replied
    Nein, versuche Java & DLLs zu vermeiden.

    Sehe auch nicht, wie das hier weiter gehen könnten. Sicher kannte ich getResourceAsStream. Aber wenn ich die DLL dann auf Platte geschrieben habe ist die DLL immer noch nicht geladen. Dann erst die DLL laden? Dann ist m.E. der Weg über ein "Installations ZIP" sinnvoller

    Leave a comment:


  • ngomo
    replied
    Den Stream auf Platte schreiben

    Hallo Christian,

    den Stream auf Platte schreiben. Wenn es geht in den aktuellen Ordner. Das ist für das laden der lib am einfachsten, weil der (zuminest auf meinem Windows) im java.library.path ist. Sonst z.B. in ein Unterverzeichnis von "user.home". Da hat der Anwender des Programms in der Regel Schreibrechte. Dann muss man den java.library.path entsprechend erweitern.

    Ich kann garnicht glauben, dass Du das nicht wusstest.

    Gruß ngomo
    Zuletzt editiert von ngomo; 16.02.2011, 01:55.

    Leave a comment:


  • Christian Marquardt
    replied
    Wei läuft dann der Code der DLL ab? Ist ja im JAR gezippt?

    Leave a comment:


  • ngomo
    replied
    War quatsch

    Moin,
    mir fällt grad ein
    Kann man keine Libs (z.B. andere jars oder auch dlls) in Jars packen.
    Das war glaub ich Blödsinn. Du könnest die dll doch in Dein jar packen und z.B. mit folgendem Code laden:
    Code:
    this.getClass().getResourceAsStream("voll-qualifizierter-dllName");
    Gruß ngomo

    Leave a comment:


  • ngomo
    replied
    Libs kann man nicht in jars packen

    Hallo,

    im Gegensatz zu anderen Containerformaten (z.B. war). Kann man keine Libs (z.B. andere jars oder auch dlls) in Jars packen. Ein praktikabler weg ist, das Du Dein jar in irgend einem Verzeichnis baust. Unterhalb dieses Verzeichnises gibt es ein Verzeichnis (z.B. libs), in das Du alle externen libs (also dlls und andere jars legst. Für den Start der Anwendung erstellst Du eine Verknüpfung, die die jars dem Classpath hinzufügt. Die libs lädtst Du im Programm selbst nach. Für die Auslieferung alles in ein zip verpacken und das dann ausliefern.

    Gruß ngomo

    Leave a comment:


  • Christian Marquardt
    replied
    Die DLL wird im Ordner C:\Windows\System32\CLM_ph.dll nicht gefunden. Mehr kann man mit deinen Infos nicht sagen und eine DLL IN einem JAR wird wohl auch nicht gehen -> wer sollte die entpacken?
    Zuletzt editiert von Christian Marquardt; 14.02.2011, 07:46.

    Leave a comment:

Working...
X