JAVA调用第三方DLL的方法
举例:Windows平台的部署。
首先将将动态连接库(AA.dll)拷贝到PATH环境变量指定的目录下, 即动态连接库的搜索路径是由PATH环境变量指定。然后把AAbean.jar加入环境变量classpath中。需要注意的是加载的dll和jar文件是你所需要的正确版本, 避免交叉引用。
Linux/Unix平台AA Javabeans的部署也类似,所不同的是:
Linux/Solaris平台动态连接库的搜索路径是由LD_LIBRARY_PATH环境变量指定;Aix平台动态连接库的搜索路径是由LIBPATH环境变量指定;HP-UX平台动态连接库的搜索路径是由SHLIB_PATH环境变量指定。
开发环境下临时部署:
在JAVA类中调用System.getProperty(“java.library.path”),根据输出的路径将AA.dll拷贝到该目录下。然后把AAbean.jar加入环境变量classpath中
附件:
System.getProperty()参数大全
java.version Java Runtime Environment version
java.vendor Java Runtime Environment vendor
java.vendor.url Java vendor URL
java.home Java installation directory
java.vm.specification.version Java Virtual Machine specification version java.vm.specification.vendor Java Virtual Machine specification vendor java.vm.specification.name Java Virtual Machine specification name java.vm.version Java Virtual Machine implementation version java.vm.vendor Java Virtual Machine implementation vendor java.vm.name Java Virtual Machine implementation name
java.specification.version Java Runtime Environment specification version java.specification.vendor Java Runtime Environment specification vendor java.specification.name Java Runtime Environment specification name java.class.version Java class format version number
java.class.path Java class path
java.library.path List of paths to search when loading libraries java.io.tmpdir Default temp file path
java.compiler Name of JIT compiler to use
java.ext.dirs Path of extension directory or directories os.name Operating system name
os.arch Operating system architecture
os.version Operating system version
file.separator File separator ("/" on UNIX)
path.separator Path separator (":" on UNIX)
line.separator Line separator ("\n" on UNIX)
user.name User''s account name
user.home User''s home directory
user.dir -
第二篇:JAVA调用DLL(例子二)
JAVA调用DLL(例子二)
2008-08-19 13:01
JNI的研究
以下是我個人的經驗
雖然JAVA的程式都必須在JAVA的虛擬機器上執行,但是我們可以在這部機器中打一個洞,讓JAVA程式可以直接溝通實際的機器
JNI是一種讓JAVA程式可以外接外部程式的一種機制,讓JAVA程式更具有擴充性,下面將示範一個簡單的範例,這個範例中說明JAVA程式如何與C語言接軌,事實上昨天所談的Prolog就是利用這種方式使Java程式可以使用prolog,透過dll和native的方式來達成這項任務,經過這樣的測試與實驗之後讓我不得不佩服java這個程式語言
你不需要擔心程式方面的問題,因為底下的程式架構都相當簡單,主要只是讓我們體驗一下
工具介紹:我將使用visual c++ 6.0來製作dll,使用java sdk 1.4來編譯我的java
java部分的實作
程式碼如下(HelloWorld.java): 1 class HelloWorld {
2 public native void displayHelloWorld();←左方的native型態是通知3 Java這個函數會使用到外部函數
4
5 static {
6 System.loadLibrary("hello"); ←左方的程式碼代表我要載入hello.dll7 的動態連結,hello.dll的製作我在稍後會做介紹
8 }
9
10 public static void main(String[] args) {
11 new HelloWorld().displayHelloWorld();
}
當你完成上述的程式之後,將這個程式存檔為'HelloWorld.java'先用'javac HelloWorld.java'這個指令將它組譯成HelloWorld.class,然後使用'javah HelloWorld'產生HelloWorld.h,在HelloWorld.h中我們知道我們要實作一個函數Java_HelloWorld_displayHelloWorld(JNIEnv *, jobject); 接下來我將介紹如何完成這個函數
實作生平的第一個dll,在之前知道在windows和linux下有一種叫dll,動態連結的機制,但是一直不曉得到底它是怎麼做的,今天將要實作第一個這樣的東西
我會盡量將東西描述清楚,因為這是我第一次的經驗
首先啟動visual c++ 6.0,在檔案中選擇新增,然後在project中選擇Win32 Dynamic-Link Library這個選項,然後填寫你專案的名稱'hello',按下'Ok',請選擇An empty Dll project這一選項,然後按'Finish'再按下'Ok',我們要從頭開始。
經過上述動作之後我們就會得到一個空的專案資料,然後我們需要增加一些程式到我們的專案中,在這之前我們先處理好我們的.h檔,首先先到你安裝java JDK的目錄下找到include的資料夾,為了以後撰寫程式方便,將這個目錄下的所有檔案複製一份到你安裝visual c++ 6.0目錄下VC98\Include裡面,預設路徑為C:\Program Files\Microsoft Visual Studio\VC98\Include,將資料複製到此資料夾中,並將原本放在win32中的jawt_md.h和jni_md.h複製一份至C:\Program Files\Microsoft Visual Studio\VC98\Include
完成這些前置動作之後,再來將我們剛剛產生的HelloWorld.h加入我們的Header Files中,並新增一個.c的檔案HelloWorldImp.c,然後到上方的功能表中Build選則'Build hello.dll',然後你將會得到一個hello.dll在專案目錄下的Debug\hello.dll,到此為止,如果順利你應該的到dll檔
程式碼如下(HelloWorldImp.c): 1 #include
2 #include "HelloWorld.h"
3 #include
4
5 JNIEXPORT void JNICALL
6 Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 7 {
8 printf("HelloWorld");
9 return;
10 }
程式碼如下(HelloWorld.h) 1 /* DO NOT EDIT THIS FILE - it is machine generated */ #include 2 /* Header for class HelloWorld */ #ifndef _Included_HelloWorld 3 #define _Included_HelloWorld
4 #ifdef __cplusplus extern "C" { #endif
5 /*
6 * Class: HelloWorld
7 * Method: displayHelloWorld
8 * Signature: ()V
9 */
10 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld 11 (JNIEnv *, jobject);
12 #ifdef __cplusplus } #endif
#endif
然後將hello.dll和HelloWorld.class放在同一個目錄下,執行java HelloWorld,出現列印HelloWorld在畫面上的結果
以上這是一個小小的範例,目的只是在做一個小小的實驗,因為沒有一個人會因為要列印一串自救去呼叫C語言來幫你做事,而會直接使用System.out.print("HelloWorld"),比較快一點
透過以上這個小實驗讓我們知道java和c之間是有辦法互通的,因此或許java可以透過這個方式與作業系統之間有更密切的互動
[註]以上資料出自於
http://140.129.25.117:8000/swpweb/mycalendar.py?who_calendar=mycalendar,這是我個人的研究心得報告,剛好我有研究到這個所以就將文章放到這邊與大家分享(檔案位置20xx年12月26所撰寫的心得)