English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En el desarrollo de Java, a veces nos enfrentamos a muchas bibliotecas locales, por lo que al empacar el proyecto, debemos enfrentar una elección: o poner los archivos de biblioteca junto con el archivo jar empacado; o empacar la biblioteca en el jar.
Empaquetar un proyecto pequeño en un jar tiene muchas ventajas de publicación, esta vez compartiré un método para incluir JNI en un jar.
[Enfoque de implementación]
Al incluir la biblioteca JNI (dll, so, etc.) en un jar, no podemos acceder a ellos mediante la ruta, y la lectura de la biblioteca depende de un archivo de biblioteca externo con el nombre correspondiente en java.library.path, solo necesitamos liberarlos del paquete jar antes de llamar a JNI, lo que es similar al proceso de copia de archivos.
[Selección de ubicación de despliegue]
java.library.path no es una ubicación fija, se puede imprimir con el siguiente código:
System.out.println(System.getProperty("java.library.path"));
Por ejemplo, en mi computadora, el resultado es así:
D:\Program Files (x86)\Java\jre7\bin;C:\windows\Sun\Java\bin;C:\windows\system32;C:\windows;D:/ProgramFiles (x86)/Java/jre7/bin/client;D:/Program Files(x86)/Java/jre7/bin;D:/Program Files (x86)/Java/jre7/lib/i386;C:\Program Files(x86)\NVIDIA Corporation\PhysX\Common;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;E:\Develop\jdk1.7.0_71\bin;E:\Develop\Git\cmd;E:\Develop\Git\bin;E:\Develop\apache-maven-3.2.1\bin;E:\eclipse-java-luna-SR1-win32\eclipse;;.
La ruta absoluta puede variar según el sistema, por lo que se ha elegido la ruta relativa ".", es decir, el directorio del proyecto.
[JNI部署类]
import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.Arrays; import java.util.LinkedList; import java.util.List; public class JNIDevelopment { byte[] cache; List<String> sources; public JNIDevelopment(){ cache = new byte[1024]; sources = new LinkedList<String>(); //Añadir aquí el nombre del archivo de biblioteca local, también se puede modificar ligeramente para leer un xml o properties externo sources.add("luajava-1.1.dll"); sources.add("libluajava-1.1.so"); } private Boolean sourceExist(String sourceName){ File f = new File("."); + File.separator + sourceName); return f.exists(); } public void doDefaultDevelopment(){ for (String s:sources){ doDevelopment(s); } } public Boolean doDevelopment(String sourceName){ if(sourceExist(sourceName)){ return true; } else{ try{ File f = new File("."); + File.separator + sourceName); if(!f.exists()){ f.createNewFile(); System.out.println("[JNIDEV]:DEFAULT JNI INITIALISATION:");+sourceName); } FileOutputStream os = new FileOutputStream(f); InputStream is = getClass().getResourceAsStream(sourceName); if(is == 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 EN LA COPIA DE LA LIBRERÍA JNI!");}} e.printStackTrace(); return false; } } return true; } public static void main(String[] args) { JNIDevelopment deve = new JNIDevelopment(); deve.doDefaultDevelopment(); try{ System.loadLibrary("luajava-1.1"); System.out.println("Carga de la biblioteca local exitosa"); } catch(UnsatisfiedLinkError e){ System.out.println("Falla en la carga de la biblioteca local"); } } }
Después de eso, colocamos la biblioteca local en el mismo paquete que la clase:
[Resultado de ejecución]
[JNIDEV]:INICIALIZACIÓN JNI POR DEFECTO:luajava-1.1.dll
[JNIDEV]:INICIALIZACIÓN JNI POR DEFECTO:libluajava-1.1.so
Carga de biblioteca local exitosa
Resumen
Esto es todo sobre el contenido de este artículo sobre cómo empaquetar la biblioteca JNI en un archivo jar. Esperamos que sea útil para todos. Los amigos interesados pueden consultar otros temas relacionados con Java en este sitio. Si hay deficiencias, bienvenidos a dejar comentarios. Gracias por el apoyo de los amigos a este sitio!
Declaración: El contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha realizado un procesamiento editorial humano y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.