Java如何調用dll
Java調用動態庫方法說明 :比較好
JAVA以其跨平台的特性深受人們喜愛,而又正由於它的跨平台的目的,使得它和本地機器的各種內部聯系變得很少,約束了它的功能。解決JAVA對本地操作的一種方法就是JNI。
JAVA通過JNI調用本地方法,而本地方法是以庫文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX機器上是SO文件形式)。通過調用本地的庫文件的內部方法,使JAVA可以實現和本地機器的緊密聯系,調用系統級的各接口方法。
注意:只能用JNI讀取Dll文件JNI是Java Native Interface,也就是Java本地接口.可以通過JNI調用Window的DLL文件.但要遵循一定的規則.比如方法的命名要按照package_class_method名
Jni接口
JAVA基礎之理解JNI原理
目前java與dll交互的技術主要有3種:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java與系統中的原生方法交互的技術(在windows\linux系統中,實現java與native method互調)。目前只能由c/c++實現。后兩個都是sourceforge上的開源項目,同時也都是基於jni技術的windows系統上的一個應用庫。Jacob(Java-Com Bridge)提供了java程序調用microsoft的com對象中的方法的能力。而除了com對象外,jawin(Java/Win32 integration project)還可以win32-dll動態鏈接庫中的方法。就功能而言:jni >> jawin>jacob
就易用性而言,正好相反:jacob>jawin>>jni。
java調用dll的幾種方法(JNI,Jawin,Jacob)
二 Jawin
官方網站:http://jawinproject.sourceforge.net/
Jawin的應用方案是基於函數調用時采用原始字節流傳遞數據的。就是在Java中指明一個DLL中的某個函
數后,通過原始字節流(需要考慮參數數據類型所占的存儲字節數及系統使用的字節序列)傳遞給該DLL
函數需要的參數,其返回值也是通過原始字節流解析的方式獲得正確的值。
Jawin有一個Jawin.dll和Jawin.jar,根據開發環境不同,需要不同的配置.
使用Jawin的缺點:不方便調試,幾乎所有的錯誤都拋出同樣的異常COMException;需要對數據類型的
轉換比較了解;不能跨平台,對Windows的依賴性比較強。
三、Jacob
官方文檔:http://danadler.com/jacob/
Jacob是Java-Com Bridge的縮寫,也可以用來調用DLL。其底層也是使用JNI實現,也具有Windows 的平
台依賴性。
該控件調用相當方便,可以調用com和active, 幾分鍾就可以搞定,它下載后有一個dll和一個jar包,
把dll放到WIN_HOME/system32/下既可,把jar包放到工程的classpath下。
下面是我調用單點dll的事例:
使用Jawin的優點:方便使用,不用進行C/C++開發,不用對原始DLL進行封裝就可以方便使用。
本人體會:我在用 Jawin 調用單點的dll時,多次出現錯誤,最終調試失敗,后來查看它的官方文檔,
發現它對某些com調用不支持。
三、Jacob
官方文檔:http://danadler.com/jacob/
Jacob是Java-Com Bridge的縮寫,也可以用來調用DLL。其底層也是使用JNI實現,也具有Windows 的平
台依賴性。
該控件調用相當方便,可以調用com和active, 幾分鍾就可以搞定,它下載后有一個dll和一個jar包,
把dll放到WIN_HOME/system32/下既可,把jar包放到工程的classpath下。
COM DLL區別
COM和DLL的區別:
1) dll是以函數集合的方式來調用的,是編程語言相關的,如:VC必須加上extern "C"。
而COM是以interface的方式提供給用戶使用的是一種二進制的調用規范,是與編程語言無關的。
2) DLL只有DLL一種形勢, 里面可任意定義函數無限制, 只能運行在本機上 ,而COM
有DLL和EXE兩種存在形勢。
3) COM所在的DLL中必須導出四個函數:1. dllgetobjectclass, 2. dllregisterserver, 3. dllunregisterserver, 4. dllunloadnow.
Com補充:
COM解決了版本、模塊化開發,所有語言使用,當然只能在WINDOWS平台上。
COM載體:DLL、EXE(不常用),OCX(用於activex控件),activex實際上是COM的一種變體,但本質上沒變,當然ACTIVEX控件也能以DLL作載體。
DLL,ACTIVEX,COM,插件區別:
DLL(基於名字導入的,名字就是符號,DLL有符號表的。根據約定好的名字調用函數)
接口是按照規划定義的規則集合
簡單說來呢,這好比一棵樹,
COM(組件是基於接口的,根據約定好的接口對COM對象進行控制)是樹根,
組件(軟件的組成部分.)是樹干,
控件(具有用戶界面的組件)和ActiveX都是樹枝,
插件(網頁中用到的,flash插件,沒有它瀏覽器不能播放flash.)就是樹上引來的一只鳥。
ACTIVEX和COM的區別:
兩者沒有質的區別,前者主要用於客戶端,后者用於服務器端。
前者可以有界面而后者決沒有界面
ActiveX的作用:可輕松方便的在 Web頁中插入多媒體效果、 交互式對象、以及復雜程序, ActiveX插件安裝的一個前提是必須經過用戶的同意及確認。
插件:指會隨着IE瀏覽器的啟動自動執行的程序
