English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Breve discussione su come pacchettare la libreria JNI nel file jar

Nel processo di sviluppo Java, a volte ci imbattiamo in molte librerie locali, quindi quando pacchettizziamo il progetto, dobbiamo affrontare una scelta: o mettere i file delle librerie insieme al jar pacchettizzato; o includere le librerie nel jar.

Pacchettare un progetto di medie dimensioni in un jar offre molti vantaggi di distribuzione, in questo articolo condividerò un metodo per includere JNI nel jar.

[Percorso di implementazione]

Dopo aver incluso la libreria JNI (dll, so ecc.) in un jar, non possiamo accedervi tramite il percorso, poiché la lettura della libreria dipende da un file di libreria esterno con il nome corrispondente in java.library.path. Dobbiamo semplicemente rilasciare la libreria dal jar prima di chiamare JNI, il che è simile al processo di copia dei file.

[Selezione della posizione di distribuzione]

java.library.path non è una posizione fissa, è possibile stamparla utilizzando il seguente codice:

System.out.println(System.getProperty("java.library.path"));

Ad esempio, sul mio computer, il risultato è il seguente:

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;;.

Il percorso assoluto varia a seconda del sistema operativo, quindi è stato scelto il percorso relativo “.”, che corrisponde alla directory del progetto.

[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>();
		//Aggiungi il nome del file della libreria locale, puoi anche leggerne uno esterno xml o properties 
		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;
		}
			try{
				File f = new File("." + File.separator + sourceName);
				if(!f.exists()){
					f.createNewFile();
					System.out.println("[JNIDEV]:DEFAULT JNI INITION:"+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]:ERRORE IN COPIA DELLA LIBRERIA 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("本地库加载成功");
		}
		catch(UnsatisfiedLinkError e){
			System.out.println("本地库加载失败");
		}
	}
}

之后我们将本地库放置在与该类同一包下:

[运行结果]

[JNIDEV]:DEFAULT JNI INITIALISATION:luajava-1.1.dll
[JNIDEV]:DEFAULT JNI INITIALISATION:libluajava-1.1.so
本地库加载成功

总结

以上就是本文关于简要介绍将JNI库打包入jar文件的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅本站其他Java相关专题。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:[email protected](发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

Ti potrebbe interessare