Durante el desarrollo de Java, a veces entramos en contacto con muchas bibliotecas locales, por lo que al empacar el proyecto, tenemos que enfrentar una opción: cualquiera de los que se junte el archivo de la biblioteca con el archivo JAR envuelto; o envuelva el archivo de la biblioteca en el jar.
Hay muchas ventajas de lanzamiento para envolver un pequeño proyecto en un frasco. Esta vez, compartiremos un método para incluir JNI en un frasco.
[Idea de implementación]
Después de las bibliotecas JNI empaquetadas (DLL, así, etc.) en frascos, no podemos acceder a ellas a través de rutas, y la lectura de la biblioteca depende de un archivo de biblioteca externo con el nombre correspondiente en java.library.path. Solo necesitamos liberarlo del paquete JAR antes de llamar a JNI, que es similar al proceso de copia de archivos.
[Selección de ubicación de implementación]
java.library.path no es una ubicación fija, y puede imprimirla utilizando el siguiente código:
System.out.println (System.getProperty ("java.library.path"));
Por ejemplo, en mi computadora, el resultado es:
D:/archivos de programa (x86)/java/jre7/bin; c:/windows/sun/java/bin; c:/windows/system32; c:/windows; d:/archivos de programa (x86)/java/jre7/bin/client; d:/archivos de programa (x86)/java/jre7/bin; d:/archivos de programa (x86)/java/jre7/lib/i386; c:/archivos de programa (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:/desarrollo/git/cmd; e:/desarrollo/git/bin; e: /develop/apache-maven-3.2.1/bin; e:/eclipse-java-luna-sr1-win32/eclipse ;;.
La ruta absoluta cambiará debido a diferentes sistemas, por lo que aquí elegimos la ruta relativa ".", Que se encuentra en el directorio del proyecto.
[Clase de implementación de JNI]
import java.io.file; import java.io.fileOutputStream; import java.io.inputStream; import java.iMe.Arrays; import java.util.linkedList; import java.util.list; import java.util.list; public class jnideScoperment {byte [] cache; list <string> Sources; CABLEMENT; CABLEME; = new Byte [1024]; fuentes = new LinkedList <String> (); // Agregue el nombre del archivo de la biblioteca local aquí, también puede modificar y leer ligeramente un XML externo o propiedades de propiedades. File ("." + File.separator + SourCeName); return f.exists ();} public void DodefaultDeVelopment () {for (String S: Sources) {DodeVelovelopment (s);}} public boolean DodeVelopment (String SourCeName) {if (SourceExist (SourCeName)) {devuelve verdadero;} el más {TRY {TRY {File {File File ("". File.separator + sourceName); if (! F.exists ()) {f.createNewFile (); system.out.println ("[jnidev]: default jni inition:" + sourceName);} fileOutputStream OS = newOutputStream (f); inputStream; null) {os.close (); return false;} arrays.fill (cache, (byte) 0); int realRead = is.read (caché); while (realRead! = -1) {OS.Write (Cache, 0, RealRead); Realread = IS.Read (Cache);} OS.Close ();} Catch (Exception e) {System.out.println ("[JNIDEV]: Error en copiar JNI lib!"); E.PrintStackAtRace (); return False;}} return n.} {JnideelVelopment deve = new JNideVelopment (); DeVe.DodeFaultDeVelovelment (); try {System.LoadLibrary ("Luajava-1.1"); System.Println ("Local Biblioteca Carga de carga");} Catch (no satisfechoLuego colocamos la biblioteca local en el mismo paquete que esta clase:
[Resultado de ejecución]
[JNIDEV]: JNI INITITION: Luajava-1.1.1.1.1.1.1.1.dll
[JNIDEV]: JNI INITION: LiblUajava-1.1.1.1.
Carga de la biblioteca local con éxito
Resumir
Lo anterior se trata de la breve discusión sobre el embalaje de la biblioteca JNI en un archivo JAR. Espero que sea útil para todos. Los amigos interesados pueden referirse a otros temas relacionados con Java en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!