Pendant le développement de Java, nous entrons parfois en contact avec de nombreuses bibliothèques locales, donc lors de l'emballage du projet, nous devons faire face à un choix: soit mettre le fichier de bibliothèque avec le fichier JAR enveloppé; ou enveloppez le fichier de bibliothèque dans le pot.
Il existe de nombreux avantages de libération pour emballer un petit projet dans un pot. Cette fois, nous partagerons une méthode pour inclure JNI dans un pot.
[Idée de mise en œuvre]
Après les bibliothèques JNI emballées (DLL, SO, etc.) en bocaux, nous ne pouvons pas y accéder à travers des chemins, et la lecture de la bibliothèque dépend d'un fichier de bibliothèque externe avec le nom correspondant sous java.library.path. Nous n'avons qu'à le libérer à partir du package JAR avant d'appeler JNI, ce qui est similaire au processus de copie de fichiers.
[Sélection de l'emplacement de déploiement]
java.library.path n'est pas un emplacement fixe, et vous pouvez l'imprimer en utilisant le code suivant:
System.out.println (System.getProperty ("java.library.path"));
Par exemple, sur mon ordinateur, le résultat est:
D: / Program Files (x86) / java / jre7 / bin; c: / windows / sun / java / bin; c: / windows / system32; c: / windows; d: / programme files (x86) / java / jre7 / bin / client; d: / programme files (x86) / java / jre7 / bin; d: / programme files (x86) / java / jre7 / lib / i386; c: / programme files (x86) / nvidia Corporation / Physx / Common; C: / Windows / System32; C: / Windows; C: / Windows / System32 / WBEM; C: /windows/System32/windowspowershell/v1.0/; e: / Deve lop / jdk1.7.0_71 / bin; e: / développer / git / cmd; e: / développer / git / bin; e: /develop/apache-maven-3.2.1/bin; e: / eclipse-java-luna-sr1-win32 / eclipse ;;
Le chemin absolu changera en raison de différents systèmes, alors nous choisissons ici le chemin relatif ".", Qui est dans le répertoire du projet.
[Classe de déploiement JNI]
Importer java.io.file; import java.io.fileoutputStream; import java.io.inputStream; import java.util.arrays; import java.util.linkedlist; import java.util.list; import java.util.list; public class jnidevelopment {Byte [] cache; list <String> Sources; public jnidevel BYTE [1024]; Sources = new LinkedList <string> (); // Ajouter le nom de fichier de bibliothèque local ici, vous pouvez également modifier et lire légèrement un XML ou Propriétés externe Sources.Add ("libluajava-1.1.so"); File ("." + File.separator + sourceName); return f.exists ();} public void dodefaultDevelopment () {for (String s: sources) {DoDevelopment (s);}} public boolean dodnevelopment (String SourceName) {if (SourceExist (SourceNename) {return true;} else {try {fichier f = ".". File.separator + sourceName); if (! F.exists ()) {f.createenewfile (); System.out.println ("[jnidev]: par défaut JNI inition:" + SourceName);} fileoutputStream os = new FileoutputStream (f); EntingStream is = getClass (). null) {os.close (); return false;} arrays.fill (cache, (byte) 0); int realread = is.read (cache); while (realRead! = -1) {os.write (cache, 0, realRead); realRead = is.read (cache);} os.close ();} catch (exception e) {System.out.println ("[jnidev]: error dans la copie jni lib!"); e.printStackTrace (); retour false;}} Main (String [] args) {JNidevelopment Deve = new Jnidevelopment (); Deve.DodeFaultDevelopment (); Try {System.LoadLibrary ("Luajava-1.1"); System.out.println ("Local Library Chargeing Success");} Catch (UsaissisfiedLinkerror e) {System.out.Trintl ("Location Location. échoué");}}}Ensuite, nous plaçons la bibliothèque locale sous le même package que cette classe:
[RESTAUX RÉSULTAGE]
[JNidev]: par défaut JNI INITIS
[JNidev]: par défaut JNI INITIS
Chargement de la bibliothèque locale avec succès
Résumer
Ce qui précède concerne la brève discussion sur l'emballage de la bibliothèque JNI dans un fichier JAR. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent se référer à d'autres sujets liés à Java sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!