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

A Brief Discussion on Packaging JNI Libraries into JAR Files

Bei der Java-Entwicklung stoßen wir manchmal auf viele lokale Bibliotheken, weshalb wir bei der Zusammenstellung des Projekts vor einer Wahl stehen: entweder die Bibliotheksdateien zusammen mit der gepackten jar-Datei platzieren oder die Bibliotheksdateien in die jar einbauen.

Das Päckchen eines kleinen Projekts in ein jar hat viele Vorteile für die Veröffentlichung, in diesem Beitrag werde ich eine Methode zur Einbettung von JNI in ein jar-Paket teilen.

[Implementierungsidee]

Wenn wir JNI-Bibliotheken (dll, so usw.) in ein jar-Paket einbetten, können wir sie nicht über den Pfad erreichen, da das Lesen der Bibliotheken von einer externen Bibliothek abhängt, die unter java.library.path mit dem entsprechenden Namen vorhanden ist. Wir müssen sie nur vor dem Aufruf von JNI aus dem jar-Paket freigeben, was dem Kopiervorgang von Dateien ähnelt.

[Wahl des Deployment-Orts]

java.library.path ist kein festgelegter Ort, und kann mit folgendem Code ausgegeben werden:

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

Zum Beispiel auf meinem Computer ergibt sich das folgendermaßen:

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

Der absolute Pfad kann je nach System variieren, daher wurde hier der relative Pfad "." gewählt, der sich im Projektverzeichnis befindet.

[JNI Deployment Class]

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>();
		//Hier können Sie den Namen der lokalen Bibliothek hinzufügen oder leicht ändern, um eine externe xml- oder properties-Datei zu lesen 
		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 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]:在复制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]:标准JNI初始化:luajava-1.1.dll
[JNIDEV]:标准JNI初始化:libluajava-1.1.so
本地库加载成功

总结

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

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

You May Also Like