Maison  >  Article  >  Java  >  Les bibliothèques natives et JNI peuvent-elles être regroupées dans un JAR pour une distribution simplifiée ?

Les bibliothèques natives et JNI peuvent-elles être regroupées dans un JAR pour une distribution simplifiée ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-17 17:32:01273parcourir

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

Encapsuler les bibliothèques natives et JNI dans un seul JAR

Problème :

Incorporer le Tokyo Bibliothèque Cabinet dans un JAR pour simplifier la distribution tout en évitant le besoin de redistribution manuelle de la bibliothèque. La solution actuellement disponible est confrontée à des limitations dans l'inclusion de la bibliothèque native et la restriction de son utilisation à un plugin spécifique.

Solution : les bibliothèques natives et JNI peuvent-elles être regroupées ensemble dans un JAR ?

Oui, créer un JAR unifié contenant la bibliothèque JNI native pour diverses plateformes est réalisable. System.load(File) peut être utilisé pour charger la bibliothèque, en contournant le System.loadLibrary(String) habituel et en éliminant la nécessité d'installer la bibliothèque au niveau du système. L'inconvénient réside dans l'incompatibilité potentielle des plates-formes, car le JAR peut ne pas inclure de bibliothèques pour toutes les plates-formes prises en charge.

Processus :

  1. Assemblage JAR : Incluez les bibliothèques JNI natives dans le JAR à un emplacement spécifique à la plate-forme, tel que "NATIVE/${os.arch}/${os.name}/libname.lib".
  2. Initialisation statique : Implémentez un initialiseur statique dans la classe principale qui :

    • Détermine les os.arch et os.name actuels
    • Recherche la bibliothèque dans le JAR using Class.getResource(String)
    • Extrait la bibliothèque dans un fichier temporaire et la charge via System.load(File) si présent

Solution hybride :

Une approche hybride peut être utilisée, permettant à la fois le chargement de bibliothèques intégrées et la recherche de bibliothèques à l'échelle du système le long de java.library.path. Cela garantit la compatibilité pour les plates-formes sur lesquelles la bibliothèque intégrée n'est pas disponible.

Exemple d'implémentation :

Les liaisons Java jzmq de ZeroMQ présentent cette fonctionnalité. Son code, disponible [ici](lien vers le code jzmq), offre une expérience de chargement transparente tout en conservant la flexibilité de la plateforme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn