1. 程式人生 > >Java呼叫Dll 例子(一)

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"。不知為何。估計我的電腦的問題。

如果直接新增目錄,我的貌似不起作用。

請測試。。。。