Heim  >  Artikel  >  Java  >  Wie können Sie native und JNI-Bibliotheken in einer einzigen JAR-Datei bündeln?

Wie können Sie native und JNI-Bibliotheken in einer einzigen JAR-Datei bündeln?

Susan Sarandon
Susan SarandonOriginal
2024-11-12 02:02:01781Durchsuche

How Can You Bundle Native and JNI Libraries in a Single JAR File?

Bündelung nativer und JNI-Bibliotheken in einem JAR

Kürzlich suchte ein Entwickler nach einer Möglichkeit, mehrere Abhängigkeiten, einschließlich nativer Bibliotheken, innerhalb eines zu konsolidieren einzelne JAR-Datei. Diese Strategie zielt darauf ab, die Verteilung zu vereinfachen und Umverteilungsprobleme zu reduzieren.

Das Rätsel der nativen Bibliothek

Eine der Herausforderungen bei diesem Unterfangen war die Einbeziehung der eigentlichen nativen Bibliothek, als bestehender Versuch, der sich ausschließlich auf die JNI-Bibliothek konzentrierte. Darüber hinaus schien die vorherige Lösung auf ein bestimmtes natives Abhängigkeits-Plugin zugeschnitten zu sein und möglicherweise nicht für die allgemeine Weiterverteilung geeignet.

Eine umfassende Lösung

Der bevorzugte Ansatz beinhaltet die Verwendung System.load(File) zum Laden der Bibliothek anstelle des herkömmlichen Systems.loadLibrary(String), das auf der Systemeigenschaft java.library.path basiert. Diese Methode macht es für Benutzer überflüssig, die Bibliothek manuell zu installieren, kann jedoch die plattformübergreifende Portabilität beeinträchtigen, wenn das JAR nicht alle erforderlichen Bibliotheken kapselt.

Implementierungsprozess

  1. Integrieren Sie die nativen JNI-Bibliotheken an plattformspezifischen Standorten in die JAR, z. B. NATIVE/${os.arch}/${os.name}/libname.lib.
  2. Implementieren Sie Code im statischen Initialisierer einer Hauptklasse, um:

    • Bestimmen Sie die aktuelle os.arch und os.name.
    • Suchen Sie mit nach der Bibliothek im JAR im vordefinierten Pfad Class.getResource(String).
    • Wenn die Bibliothek vorhanden ist, extrahieren Sie sie in eine temporäre Datei und laden Sie sie mit System.load(File).

Fallstudie: jzmq

Diese Lösung wurde in jzmq, Java-Bindungen für ZeroMQ, mit Hybridfunktionalität eingesetzt Ermöglicht die Suche nach der Bibliothek entlang des java.library.path, wenn die eingebettete Version nicht geladen werden kann.

Das obige ist der detaillierte Inhalt vonWie können Sie native und JNI-Bibliotheken in einer einzigen JAR-Datei bündeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn