欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析Java和Eclipse中加載本地庫(.dll文件)的詳細說明

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

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

相關(guān)文章

  • 針對Dubbo接口Mock的解決方案詳解

    針對Dubbo接口Mock的解決方案詳解

    這篇文章主要為大家介紹了針對Dubbo接口Mock的解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java中幾種常用數(shù)據(jù)庫連接池的使用

    Java中幾種常用數(shù)據(jù)庫連接池的使用

    數(shù)據(jù)庫連接池在編寫應(yīng)用服務(wù)是經(jīng)常需要用到的模塊,太過頻繁的連接數(shù)據(jù)庫對服務(wù)性能來講是一個瓶頸,使用緩沖池技術(shù)可以來消除這個瓶頸,本文就來介紹Java常見的幾種,感興趣的可以了解一下
    2021-05-05
  • Java深入淺出講解多線程的概念到使用

    Java深入淺出講解多線程的概念到使用

    哈哈!經(jīng)過一個階段的學(xué)習(xí),Java基礎(chǔ)知識學(xué)習(xí)終于到多線程了!Java多線程以及后面互斥鎖的概念都是Java基礎(chǔ)學(xué)習(xí)的難點,所以我做了一個總結(jié),希望對大家也有幫助
    2022-05-05
  • SpringBoot 實戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法

    SpringBoot 實戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法

    本篇文章主要介紹了SpringBoot 實戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 快速入門HarmonyOS的Java UI框架的教程

    快速入門HarmonyOS的Java UI框架的教程

    這篇文章主要介紹了快速入門HarmonyOS的Java UI框架,本文給大家介紹的非常詳細對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot?mybatis-plus使用json字段實戰(zhàn)指南

    SpringBoot?mybatis-plus使用json字段實戰(zhàn)指南

    在現(xiàn)代應(yīng)用開發(fā)中經(jīng)常會使用JSON格式存儲和傳輸數(shù)據(jù),為了便捷地處理數(shù)據(jù)庫中的JSON字段,MyBatis-Plus提供了強大的JSON處理器,這篇文章主要給大家介紹了關(guān)于SpringBoot?mybatis-plus使用json字段的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 深入剖析構(gòu)建JSON字符串的三種方式(推薦)

    深入剖析構(gòu)建JSON字符串的三種方式(推薦)

    下面小編就為大家?guī)硪黄钊肫饰鰳?gòu)建JSON字符串的三種方式(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 一文帶你初識java中的String類

    一文帶你初識java中的String類

    String代表字符串,Java 程序中的所有字符串字面值(如 "abc" )都作為此類的實例實現(xiàn),這篇文章主要給大家介紹了關(guān)于java中String類的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 編程入門:掌握Java運算符技巧

    編程入門:掌握Java運算符技巧

    掌握Java運算符技巧,能讓你的編程之旅輕松許多,本指南將帶你深入了解如何巧妙地使用這些強大的工具,讓代碼不僅高效,還充滿樂趣,跟著我們一起,讓你的Java代碼在運算符的魔法下煥發(fā)新生!
    2023-12-12
  • 關(guān)于SpringSecurity的基本使用示例

    關(guān)于SpringSecurity的基本使用示例

    這篇文章主要介紹了關(guān)于SpringSecurity的基本使用示例,SpringSecurity 本質(zhì)是一個過濾器鏈SpringSecurity 采用的是責(zé)任鏈的設(shè)計模式,它有一條很長的過濾器鏈,需要的朋友可以參考下
    2023-05-05

最新評論