Frage

Beispiel:Ich habe zwei gemeinsam genutzte Objekte (dasselbe sollte für DLLs gelten).Das erste gemeinsam genutzte Objekt stammt aus einer Bibliothek eines Drittanbieters, wir nennen es libA.so.Ich habe einiges davon mit JNI verpackt und meine eigene Bibliothek erstellt, libB.so.Jetzt hängt libB 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 Systembibliothekspfad befindet (java.library.path hilft hier nicht).Das Endergebnis ist, dass libB einen unbefriedigten Link hat und nicht verwendet werden kann.

Ich habe versucht, libA vor libB zu laden, aber das funktioniert immer noch nicht.Scheint, als ob das Betriebssystem das Laden für mich übernehmen möchte.Gibt es eine andere Möglichkeit, dies zum Laufen zu bringen, als statisch zu kompilieren?

War es hilfreich?

Lösung 2

Die statische Kompilierung erwies sich als die einzige Möglichkeit, mehrere abhängige native Bibliotheken per Webstart zu starten.

Andere Tipps

Ich bin mir nicht sicher, ob dies bei Webstart genauso gehandhabt wird, aber wir sind in einer Desktop-Anwendung auf diese Situation gestoßen, als wir mit einer Reihe nativer Bibliotheken (in unserem Fall DLLs) arbeiteten.

Das Laden von libA vor libB sollte funktionieren, es sei denn, eine dieser Bibliotheken weist eine Abhängigkeit auf, die nicht berücksichtigt wird und nicht im Pfad enthalten ist.Meines Wissens nach kommt es zu einem Systemaufruf „loadLibrary“ (d. h.Java hat die Bibliothek in seinem java.library.path gefunden und weist nun das Betriebssystem an, sie zu laden. Es hängt vollständig vom Betriebssystem ab, ob es abhängige Bibliotheken findet, da zu diesem Zeitpunkt das Betriebssystem die Bibliothek lädt Bibliothek für den Prozess, und das Betriebssystem weiß nur, wie es im Systempfad suchen muss.Das scheint im Fall einer Webstart-App schwer einzustellen, aber es gibt eine Möglichkeit, dies zu umgehen, ohne statisches Kompilieren.Möglicherweise können Sie den Speicherort Ihrer Bibliotheken ändern – ich bin mir nicht sicher

Wenn Sie einen benutzerdefinierten Klassenlader verwenden, können Sie „loadLibrary“ und „findLibrary“ überschreiben, damit er Ihre Bibliotheken in einem JAR in Ihrem Klassenpfad finden kann, und wenn Sie ihn auch auf Ihre nativen Bibliotheksabhängigkeiten aufmerksam machen (d. h.libB hängt von libA ab, hängt von libX ab. Wenn Sie also libB laden, können Sie sich selbst fangen und sicherstellen, dass Sie zuerst libA laden. Überprüfen Sie diesen Hinweis und laden Sie zuerst libX.Dann versucht das Betriebssystem nicht, eine Bibliothek zu finden, die sich nicht in Ihrem Pfad befindet.Es ist umständlich und etwas mühsam, aber sicherzustellen, dass Java sie findet und sie alle in der richtigen Reihenfolge lädt, kann funktionieren.

Sind beide nativen Bibliotheken in einer verpackt unterzeichnet jar, der als aufgeführt ist

<nativelib ...> 

In der JNLP-Datei?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top