Heim  >  Artikel  >  Java  >  Können native und JNI-Bibliotheken zur einfacheren Verteilung in einem JAR zusammengefasst werden?

Können native und JNI-Bibliotheken zur einfacheren Verteilung in einem JAR zusammengefasst werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-17 17:32:01269Durchsuche

Can Native and JNI Libraries Be Packaged Together in a JAR for Simplified Distribution?

Einkapselung nativer und JNI-Bibliotheken in einem einzigen JAR

Problem:

Einbindung von Tokyo Schrankbibliothek in ein JAR, um die Verteilung zu vereinfachen und gleichzeitig die Notwendigkeit einer manuellen Neuverteilung der Bibliothek zu vermeiden. Die derzeit verfügbare Lösung weist Einschränkungen hinsichtlich der Einbeziehung der nativen Bibliothek und der Beschränkung ihrer Verwendung auf ein bestimmtes Plugin auf.

Lösung: Können native und JNI-Bibliotheken zusammen in einem JAR verpackt werden?

Ja, die Erstellung eines einheitlichen JAR mit der nativen JNI-Bibliothek für verschiedene Plattformen ist machbar. System.load(File) kann zum Laden der Bibliothek verwendet werden, wodurch das übliche System.loadLibrary(String) umgangen wird und die Notwendigkeit einer Bibliotheksinstallation auf Systemebene entfällt. Der Nachteil liegt in einer möglichen Plattforminkompatibilität, da das JAR möglicherweise nicht Bibliotheken für alle unterstützten Plattformen enthält.

Prozess:

  1. JAR-Assemblierung: Fügen Sie native JNI-Bibliotheken in die JAR an einem plattformspezifischen Ort ein, z „NATIVE/${os.arch}/${os.name}/libname.lib“.
  2. Statische Initialisierung: Implementieren Sie einen statischen Initialisierer innerhalb der Hauptklasse, der:

    • Bestimmt den aktuellen os.arch und os.name
    • Sucht nach der Bibliothek innerhalb der JAR mit Class.getResource(String)
    • Extrahiert die Bibliothek in eine temporäre Datei und lädt sie über System.load(File), falls vorhanden

Hybrid Lösung:

Es kann ein hybrider Ansatz verwendet werden, der sowohl das Laden eingebetteter Bibliotheken als auch die systemweite Bibliothekssuche entlang dieser ermöglicht java.library.path. Dies stellt die Kompatibilität für Plattformen sicher, auf denen die eingebettete Bibliothek nicht verfügbar ist.

Beispielimplementierung:

Die jzmq-Java-Bindungen von ZeroMQ zeigen diese Funktionalität. Der [hier] verfügbare Code (Link zum JZMQ-Code) bietet ein nahtloses Ladeerlebnis bei gleichzeitiger Beibehaltung der Plattformflexibilität.

Das obige ist der detaillierte Inhalt vonKönnen native und JNI-Bibliotheken zur einfacheren Verteilung in einem JAR zusammengefasst werden?. 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