Java呼叫Dll 例子(一)
第一步,編寫Java類:
注意,這個類有兩個作用,一個是用來做標頭檔案,另外一個作用就是通過它來呼叫dll
1,Java類
public class TestDll { static { System.loadLibrary("DLLSample");//載入dll } //用native關鍵字修飾將被其它語言實現的方法 public native static int DoubleValue(int i);//函式宣告 public native static String pirntStr(String msg);//函式宣告 public static void main(String[] args){ //本地方法的呼叫 int rs=DoubleValue(2); String str=pirntStr("Hello chen!"); System.out.println(str); System.out.println(rs); } }
2.編譯: javac TestDll
3.生成標頭檔案: javah TestDll。生成TestDll.h
在此注意,要是TestDll類帶有包名,比如dcec包,此時的javah改為 javah dcec.TestDll 進行編譯。生成的.h檔案也會帶有包名 : dcec_TestDll.h
第二步:VC製作dll
1,新建win32 Dll專案,一個簡單的dll專案即可,DLLSample工程名
2,引入第一步生成的TestDll.h。將此.h檔案拷貝到DLLSample目錄下。
在FileView標籤中,選擇Header Files右擊,新增Add Files to Folders。
並在StdAfx.h中引入
#include "jni.h"
#include "jni_md.h"
#include "TestDll.h"
其中,jni.h(這個檔案在JDK/include下),jni_md.h(這個檔案在jdk/include/win32下)。
此處,有兩種方式新增這個兩個標頭檔案:
一種是拷貝這兩個檔案到工程目錄下,類似於將TestDll.h的方法。
另一種,在VC中 Tools->Options->Directions新增這個兩個檔案所在的目錄,必須是直接目錄,如
C:\PROGRAM FILES\JAVA\JDK1.6.0_33\INCLUDE\WIN32
C:\PROGRAM FILES\JAVA\JDK1.6.0_33\INCLUDE。
3. 實現函式。在DLLSample.cpp中新增如下程式碼
JNIEXPORT jint JNICALL Java_TestDll_DoubleValue (JNIEnv *, jclass, jint p)
{
int j = p*2;
return j;
}
JNIEXPORT jstring JNICALL Java_TestDll_pirntStr(JNIEnv *, jclass, jstring msg)
{
return msg;
}
注意,JNIEXPORT, JNIEnv * ,jclass不要改動。在jint後新增一個自定義的形參p或其他任何變數都可以。
然後實現功能即可。
最後,編譯此工程,生成DLLsample.dll檔案。
第三步,執行測試
將上述生成的Dllsample.dll檔案拷貝包java專案目錄下(並非TestDll.class目錄下,特別是帶有包名的類是,應該放在包的外面),或者到C:\WINDOWS\system32目錄下。
結果。。。
===========================================================
說明,以上是在vc++6.0環境下操作。
在VS2008中,採用MFC Dll工程時,注意把jni.h 和jni_md.h拷貝到工程目錄下,並將#include "jni.h" #include "jni_md.h"新增到標頭檔案中,
而非 #include <jni.h> #include <jni_md.h>,在這裡是尖括號和雙引號的區別。
而且,在用javah生成的TestDll.h中的include <jni.h>,改為#include "jni.h"。不知為何。估計我的電腦的問題。
如果直接新增目錄,我的貌似不起作用。
請測試。。。。