最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析Java和Eclipse中加載本地庫(kù)(.dll文件)的詳細(xì)說(shuō)明

 更新時(shí)間:2013年05月17日 11:15:16   作者:  
本篇文章是對(duì)Java和Eclipse中加載本地庫(kù)(.dll文件)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
最近在做的工作要用到本地方法,需要在Java中加載不少動(dòng)態(tài)鏈接庫(kù)(以下為方便延用Windows平臺(tái)下的簡(jiǎn)寫dll,但并不局限于Windows)。剛剛把程序跑通,趕緊把一些心得寫出來(lái),mark。也希望對(duì)大家的類似工作有所幫助
首先,應(yīng)當(dāng)明確,dll有兩類:(1)Java所依賴的dll和,(2)dll所依賴的dll。正是由于第(2)種dll的存在,才導(dǎo)致了java中加載dll的復(fù)雜性大大增加,許多說(shuō)法都是這樣的,但我實(shí)驗(yàn)的結(jié)果卻表明似乎沒(méi)有那么復(fù)雜,后面會(huì)予以詳細(xì)闡述。
其次,Java中加載dll的方式也有兩種:(1)通過(guò)調(diào)用System.loadLibrary(String filename)和,(2)通過(guò)調(diào)用System.load(String filename)方法。其底層都是通過(guò)使用ClassLoader中的loadLibrary(Class fromClass, String name, boolean isAbsolute)方法來(lái)實(shí)現(xiàn)的,區(qū)別僅在于(1)中的filename必須是絕對(duì)路徑,(2)中的filename只能是dll名,不允許包含文件夾。
再者,Eclipse是一個(gè)相當(dāng)強(qiáng)大的平臺(tái),其提供的BundleClassLoader的強(qiáng)大是一個(gè)很重要的原因,對(duì)于dll的加載也有自己一套很別致的做法,值得我們采納。
根據(jù)上面的介紹,分兩部分闡述Java中加載dll面臨的主要問(wèn)題和解決途徑。
1. 在一般Java程序中加載dll
我所做的工作,需要加載的dll如下:
DigitDll.dll 
DsivsAcct.dll
DsivsComm.dll
DsivsTrans.dll
JBPack.dll
XCodeDll.dll
ImageDllCtrl.dll
yhfiche.dll
yhocr.dll
yhbill.dll
TSealSvrDll.dll
TImg.dll
TImage.dll   
直接調(diào)用的是TImage中的若干方法,列表中TImage之前的所有其直接或間接依賴的,不僅要把所有的dll load全,更要注意他們之間的依賴關(guān)系,被依賴dll一定要先加載,否則就會(huì)報(bào)錯(cuò):UnsatisfiedLinkError。故而,首先應(yīng)理清dll 之間的依賴關(guān)系,上面的列表已經(jīng)是處理過(guò)的了。

接下來(lái)是設(shè)置JVM的搜索路徑,使其能夠找到你的dll。JVM的搜索路徑由java.library.path系統(tǒng)屬性決定,其默認(rèn)值為系統(tǒng)環(huán)境變量中的PATH 內(nèi)容。因此,可以通過(guò)修改PATH變量來(lái)達(dá)到設(shè)置java.library.path屬性的目的(改變之后Eclipse需要重新啟動(dòng)),一般的方法是在 PATH中加入dll所在文件夾的絕對(duì)路徑。另一種方法是在Java命令的參數(shù)中加入“-Djava.library.path=dll所在文件夾的絕對(duì)路徑”來(lái)設(shè)置(可以用;分開(kāi)多個(gè)路徑)。對(duì)于Eclipse開(kāi)發(fā)環(huán)境上的應(yīng)用程序,可以通過(guò)修改其啟動(dòng)參數(shù),在VM arguments編輯框中加入前述參數(shù)。對(duì)于打包出來(lái)的Eclipse安裝包,可編輯其啟動(dòng)目錄下的application.ini(假設(shè)其啟動(dòng)文件為 application.exe),在-vmargs后加入前述參數(shù)來(lái)設(shè)置java.library.path的值。需要注意的是,一旦JVM已經(jīng)啟動(dòng),則無(wú)法再修改java.library.path的內(nèi)容了,也就是說(shuō),通過(guò):
System.setProperty("java.library.path", "c:/mylib");
這樣的方式是無(wú)法達(dá)到目的的,因?yàn)樵搶傩允侵蛔x的。Sun公司的論壇上曾經(jīng)討論過(guò)如何在代碼中修改java.library.path的問(wèn)題,結(jié)論是:不能通過(guò)代碼修改!如果嫌"java -Djava.library.path=c:/mylib"這樣的方式寫得太死,也只能是通過(guò)shell編程之類的方法對(duì)路徑進(jìn)行預(yù)處理,以改善其靈活性了。
如果你的dll是封裝在jar包中的,則需要首先將之解壓縮到一個(gè)臨時(shí)路徑上,然后再將該路徑加入到Djava.library.path中,或者干脆將其解壓縮到系統(tǒng)路徑上。
2. 在Eclipse平臺(tái)上加載dll
上面提到,Java中對(duì)本地庫(kù)路徑的設(shè)置方式做得太死,這也是我自己的切身體會(huì),但令人感到欣慰的是我們的Eclipse平臺(tái)的提供了一套比較靈活的做法,通過(guò)eclipse提供的BundleClassLoader,你可以將dll封在plugin中,既不需要在使用時(shí)解壓縮,也不需要額外設(shè)置 java.library.path屬性,BundleClassLoader會(huì)自行到以相對(duì)plugin根目錄的指定目錄下去查找你的dll,這些目錄是:ws/win32/, os/win32/x86/, os/win32/, nl/zh/CN/, nl/zh/,見(jiàn)org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader和 org.eclipse.core.runtime.internal.adaptor.EclipseClassLoadingHook。
我的目錄設(shè)置是:
.classpath
.cvsignore
.project
build.properties
classes
CVS
lib
META-INF
os
plugin.xml
src
我把所有的dll都放到了os下面的win32目錄內(nèi),同樣可以建立ws/win32等目錄用于放置本地庫(kù)。如此處理之后,不用再修改任何系統(tǒng)變量就可以順利加載本地庫(kù)了。
另外,Eclipse還在MANIFEST文件中提供了Bundle-NativeCode的設(shè)置項(xiàng),也是用于加載本地庫(kù)的,有待進(jìn)一步研究
本文匆匆而就,希望對(duì)自己對(duì)大家都能有所幫助

相關(guān)文章

  • MyBatis映射關(guān)系詳解

    MyBatis映射關(guān)系詳解

    本文重點(diǎn)介紹MyBatis映射關(guān)系重點(diǎn)是映射關(guān)系一對(duì)一,一對(duì)一映射方式結(jié)合應(yīng)用實(shí)例給大家詳細(xì)講解,對(duì)MyBatis映射關(guān)系相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-11-11
  • Kafka 網(wǎng)絡(luò)中斷和網(wǎng)絡(luò)分區(qū)4種場(chǎng)景分析

    Kafka 網(wǎng)絡(luò)中斷和網(wǎng)絡(luò)分區(qū)4種場(chǎng)景分析

    這篇文章主要介紹了Kafka 網(wǎng)絡(luò)中斷和網(wǎng)絡(luò)分區(qū)4種場(chǎng)景分析
    2007-02-02
  • java獲取ip地址示例

    java獲取ip地址示例

    在JSP里,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過(guò)了Apache,Squid等反向代理軟件就不能獲取到客戶端的真實(shí)IP地址了
    2014-04-04
  • Spring Cloud Gateway入門解讀

    Spring Cloud Gateway入門解讀

    本篇文章主要介紹了Spring Cloud Gateway入門解讀,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式

    Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式

    這篇文章主要介紹了Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java 將一個(gè)字符重復(fù)n遍過(guò)程詳解

    Java 將一個(gè)字符重復(fù)n遍過(guò)程詳解

    這篇文章主要介紹了Java 將一個(gè)字符重復(fù)n遍過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 從log4j2到Disruptor詳解

    從log4j2到Disruptor詳解

    這篇文章主要介紹了從log4j2到Disruptor詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • springboot post接口接受json時(shí),轉(zhuǎn)換為對(duì)象時(shí),屬性都為null的解決

    springboot post接口接受json時(shí),轉(zhuǎn)換為對(duì)象時(shí),屬性都為null的解決

    這篇文章主要介紹了springboot post接口接受json時(shí),轉(zhuǎn)換為對(duì)象時(shí),屬性都為null的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Mybatis中攔截器的簡(jiǎn)單實(shí)現(xiàn)方法

    Mybatis中攔截器的簡(jiǎn)單實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Mybatis中攔截器的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • IDEA找不到database圖標(biāo)的簡(jiǎn)單圖文解決方法

    IDEA找不到database圖標(biāo)的簡(jiǎn)單圖文解決方法

    idea是一個(gè)功能十分強(qiáng)大的IDE,大家在使用他進(jìn)行開(kāi)發(fā)時(shí)候,必不可少的就是連接數(shù)據(jù)庫(kù)了,這篇文章主要給大家介紹了關(guān)于IDEA找不到database圖標(biāo)的解決方法,需要的朋友可以參考下
    2024-07-07

最新評(píng)論

新乡市| 哈尔滨市| 海城市| 黄陵县| 大兴区| 镇江市| 正镶白旗| 依兰县| 土默特左旗| 浑源县| 兰州市| 宜兰市| 湾仔区| 固原市| 正宁县| 永寿县| 旺苍县| 图们市| 临澧县| 永川市| 凌源市| 绵阳市| 辽宁省| 祁东县| 岳阳市| 南投市| 七台河市| 澄江县| 海阳市| 临夏市| 新昌县| 湛江市| 报价| 万安县| 泸定县| 英超| 临安市| 梧州市| 砚山县| 玛纳斯县| 马山县|