Wie kann ich Java-Webstart mehrerer, abhängiger, nativer Bibliotheken durchführen?

  • Beispiel: Ich habe zwei gemeinsam genutzte Objekte (das gleiche gilt für .dlls). Das erste gemeinsam genutzte Objekt stammt aus einer Drittanbieter-Bibliothek. Wir nennen es libA.so. Ich habe einige davon mit JNI verpackt und meine eigene Bibliothek libB.so erstellt. LibB hängt jetzt von libA ab.

    Beim Webstart befinden sich beide Bibliotheken in einem Webstart-Arbeitsbereich. Mein Java-Code versucht, libB zu laden. An diesem Punkt versucht der Systemlader, libA zu laden, die sich nicht im Pfad der Systembibliothek befindet (java.library.path hilft nicht). Das Endergebnis ist, dass libB einen nicht erfüllten Link hat und nicht verwendet werden kann.

    Ich habe versucht, libA vor libB zu laden, aber das funktioniert immer noch nicht. Anscheinend will das Betriebssystem das Laden für mich tun. Gibt es eine Möglichkeit, diese Arbeit anders als statisch zu kompilieren?

    07 August 2008
    basszero
3 answers
  • Ich bin nicht sicher, ob dies für Webstart auf dieselbe Weise gehandhabt wird, aber wir sind in einer Desktopanwendung auf diese Situation gestoßen, wenn wir mit einer Reihe von nativen Bibliotheken (in unserem Fall dlls) umgehen.

    Laden von libA, bevor libB funktionieren sollte, es sei denn, eine dieser Bibliotheken hat eine Abhängigkeit, die nicht berücksichtigt wird und nicht im Pfad enthalten ist. Ich verstehe, dass, sobald es zu einem Aufruf von system loadLibrary gelangt ist (dh Java die Bibliothek in seinem java.library.path gefunden hat und nun dem Betriebssystem sagt, dass es geladen werden soll), es vollständig von dem Betriebssystem abhängt, um alle abhängigen Bibliotheken zu finden , da zu diesem Zeitpunkt das Betriebssystem die Bibliothek für den Prozess lädt und das Betriebssystem nur im Systempfad suchen kann. Das scheint im Fall einer Webstart-App schwer zu definieren, aber es gibt einen Weg, um das statische Kompilieren zu vermeiden. Möglicherweise können Sie den Speicherort Ihrer Bibliotheken neu bestimmen.

    Wenn Sie einen benutzerdefinierten Classloader verwenden, können Sie loadLibrary und findLibrary überschreiben, sodass Ihre Bibliotheken innerhalb eines Bibliotheksverzeichnisses lokalisiert werden können jar in Ihrem Classpath, und wenn Sie es auch auf Ihre nativen Bibliotheksabhängigkeiten aufmerksam machen (dh libB hängt von libA ab, hängt von libX ab. Wenn Sie libB laden, können Sie sich also selbst einfangen und sicherstellen, dass Sie libA zuerst laden und in dieser Benachrichtigung prüfen und libX laden Zuerst versucht das Betriebssystem nicht, eine Bibliothek zu finden, die sich nicht in Ihrem Pfad befindet. Es ist klunky und ein bisschen schmerzhaft, aber sicherzustellen, dass Java sie findet und alle in der richtigen Reihenfolge lädt, kann funktionieren.

    07 August 2008
    Joshua McKinnon
  • Die statische Kompilierung erwies sich als einzige Möglichkeit, um mehrere abhängige native Bibliotheken im Web zu starten.

    26 January 2009
    basszero
  • Sind beide native Bibliotheken in einem -signierten -Jar gepackt, das als

     <nativelib ...> 
     

    In der JNLP-Datei?

    17 September 2008
    Adam Mitz