国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

淺談將JNI庫打包入jar文件

2024-07-13 10:15:07
字體:
來源:轉載
供稿:網友

在Java開發時,我們有時候會接觸到很多本地庫,這樣在對項目打包的時候我們不得不面臨一個選擇:要么將庫文件與包好的jar文件放在一起;要么將庫文件包入jar。

將一個不大的項目包成一個jar有諸多發布優勢,本次將分享一個將JNI包入jar的方法。

[實現思路]

將JNI庫(dll、so等)包入jar后,我們無法通過路徑來訪問它們,而庫的讀取依賴一個java.library.path下對應名稱的外部庫文件,我們僅僅需要在調用JNI前將其由jar包釋放出來,這類似于文件的拷貝過程。

[部署位置的選取]

java.library.path并不是一個固定的位置,使用下面代碼可以打印出來:

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

例如在本人的計算機上,結果是這樣的:

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

絕對路徑會由于不同系統而變化,因而這里選擇了”.”這個相對路徑,也就是項目目錄下。

[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>();		//這里加入本地庫文件名,也可以稍加修改讀取一個外部xml或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;		} else{			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]:ERROR IN COPY JNI LIB!");				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("本地庫加載失敗");		}	}}

之后我們將本地庫放置在與該類同包下:

jni,打包,jar

[運行結果]

[JNIDEV]:DEFAULT JNI INITION:luajava-1.1.dll
[JNIDEV]:DEFAULT JNI INITION:libluajava-1.1.so
本地庫加載成功

總結

以上就是本文關于淺談將JNI庫打包入jar文件的全部內容,希望對大家有所幫助。感興趣的朋友可以參閱本站其他Java相關專題。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江孜县| 古田县| 西宁市| 兴化市| 灯塔市| 哈巴河县| 平陆县| 垫江县| 靖州| 河间市| 仁怀市| 宣恩县| 蕉岭县| 元谋县| 长沙市| 佳木斯市| 康保县| 嵊州市| 芮城县| 新泰市| 阿荣旗| 宜春市| 崇信县| 夏津县| 汤阴县| 临湘市| 河东区| 永安市| 夏津县| 靖安县| 平阳县| 龙里县| 治多县| 姚安县| 古田县| 芦山县| 墨竹工卡县| 连平县| 平乐县| 永新县| 丹东市|