我知道的有兩種方法,一種是直接用JNI,另一種是則是用Jacob(實(shí)質(zhì)上也用的是JNI)
先講講第一種方法
1.編寫java程序TestDll,注意,這個(gè)類有兩個(gè)作用,一個(gè)是用來(lái)做頭文件,另外一個(gè)作用就是通過(guò)它來(lái)調(diào)用dll
public class TestDll {
static
{
System.loadLibrary("DLLSample");//載入dll
}
public native static int DoubleValue(int i);//函數(shù)聲明
}
2.編譯: javac TestDll
3.生成頭文件: javah TestDll
生成TestDll.h文件,這里面只對(duì)函數(shù)DoubleValue作了聲明
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestDll */
#ifndef _Included_TestDll
#define _Included_TestDll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: TestDll
* Method: DoubleValue
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_TestDll_DoubleValue
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
4.用vc制作DLL
修改DLLSample工程,程序中添加函數(shù)DoubleValue的實(shí)現(xiàn),函數(shù)名必須用jni規(guī)定格式,可以照到.h文件里的聲
明來(lái)寫:
#include "jni_md.h"
#include "TestDll.h"
JNIEXPORT jint JNICALL Java_TestDll_DoubleValue (JNIEnv *, jclass, jint p)
{
int j = p*2;
return j;
}
JNIEXPORT,JNICALL,JNIEnv *, jclass請(qǐng)都不要?jiǎng)?,jint對(duì)應(yīng)是java里的int
別忘了把TestDll.h,jni.h(這個(gè)文件在jdk/include下),jni_md.h(這個(gè)文件在jdk/include/win32下)復(fù)制到VC
工程目錄中,然后編譯生成dll
5.把生成的DLLSample.dll復(fù)制到j(luò)dk/bin下(確保PATH指向了這個(gè)目錄)
6.應(yīng)用
我看到他們舉的例子都是把調(diào)用寫在了main里, 在這里我把應(yīng)用取出來(lái)放在一個(gè)servlet類中的測(cè)試的,同樣可
以得到正確結(jié)果,這里體現(xiàn)國(guó)TestDll的第二個(gè)作用,它是調(diào)用dll的一個(gè)紐帶
......
TestDll td = new TestDll();
System.out.println("result= "+td.DoubleValue(25));
.....
注意:
如果更改了TestDll的內(nèi)容或重使命名了這個(gè)文件,必須重新用它生成頭文件,在dll里也要做相應(yīng)修改,
因?yàn)楸仨氁蚸ava里面的聲明一致才行
----------------------------------------
本文隨寫,若有什么錯(cuò)誤,請(qǐng)多多指出,謝謝
聯(lián)系客服