A. 現在我有一個DLL文件,我想在java中調用DLL文件中的方法,請問如何實現
一般那種c#的dll是java不能直接調用的,但C\C++可以,你可以使用JNI。比如你要一個 public native void sengMsg(String msg); 來發送信息,先用native關鍵字聲明這個函數,然後再類裡面加一個靜態塊: static { System.loadLibrary("msg"); } 這里的msg是你的後來編譯的dll文件名,不是簡訊貓帶的。 然後寫其他的函數就可以調用這個方法了,寫完後用javac編譯,得到class文件,然後用 javah -jni 你的class文件 就會得到一個.h的頭文件,用visual studio新建一個dll,把那個.h文件包含進去,用C\C++調用你現有的dll,然後編譯得到你的msg.dll,把它復制到你的class文件目錄,然後就可以調試運行了。
B. java web怎麼調用dll
java調用dll要用到jni(java本地介面)
例如程序TestDll.java,內容為:
publicclassTestDll
{
static
{
System.loadLibrary("xxx.dll");
}
publicnativestaticintget();
publicnativestaticvoidset(inti);
publicstaticvoidmain(String[]args)
{
TestDlltest=newTestDll();
test.set(10);
System.out.println(test.get());
}
}
這個例子只是為了示意jni如何用,並不是實際的工程代碼。
你可以搜索一下jni的詳細信息,通常都有詳細的例子(如使用user32.dll的例子)
C. java 讀取DLL 咋弄
一、建立java文件
注意點:1.要對dll裡面的方法做本地聲明
2.載入dll
示例代碼:
public class testdll {
static{
System.loadLibrary("goodluck"); //注意:不寫擴展名,名字要與dll的文件名一致
}
public native int getValue();
public native void setValue(int i); /**
* @param args
*/
public static void main(String[] args) {
testdll test=new testdll();
test.setValue(10);
System.out.println(test.getValue());
}
}
二、編譯
javac testdll.java ------如果沒有錯,進行下一步
javah testdll ------生成testdll.h這個頭文件
三、實現步驟一中聲明的方法
打開VC++6.0,建立一個dll空工程,把testdll.h導入工程中,新建一個test.cpp源文件
打開testdll.h,發現裡面有兩個方法:
/*
* Class: testdll
* Method: getValue
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_getValue
(JNIEnv *, jobject);/*
* Class: testdll
* Method: setValue
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_setValue
(JNIEnv *, jobject, jint);
JNIEXPORT不用管,第二個單詞jint/void是返回值,jint相當於int類型,JNICALL不用管,每一個方法名前都有前綴Java_testll_,前兩個參數JNIEnv *和jobject不用管,第二個方法的第三個參數jint就是java文件里的int i。
上面有聲明了,現在就要實現這兩個方法,把代碼補充進來吧:)
示例代碼:
#include "testdll.h"
int i=0;
JNIEXPORT jint JNICALL Java_testdll_getValue
(JNIEnv *, jobject){
return i;
}
JNIEXPORT void JNICALL Java_testdll_setValue
(JNIEnv *, jobject, jint j){
i=j;
}
四、編譯
此時編譯會出現error,主要是提示找不到jni.h(這個包含在testdll.h)里,需要我們把jni.h、jni_md.h復制到C:\Program Files\Microsoft Visual Studio\VC98\Include這個目錄里(默認安裝目錄,如果安裝VC不是這個目錄,請自行找到Include目錄)。
jni.h------------------jdk安裝目錄\include
jni_md.h------------jdk安裝目錄\include\win32
然後再編譯,構建,就有了test.dll這個動態鏈接庫文件了,把它重命名成goodluck.dll,然後復制到testdll.java的目錄下,運行吧:)
java testdll
結果:
10
D. 怎麼在java中調用dll中的方法
使用jna或jni,但是最好先使用javah命令自己編譯頭文件,然後去調用
public class A{
static {
System.loadLibrary("ShowPWD");//DLL名稱
}
public static native String display(String in,int i);//這里是動態庫中的方法名字
}
要麼用jna也可以,我看你上面的方法格式,最好使用jna,要用jni的話比較麻煩呢,要用到dll套dll的做法
具體怎麼操作我就不啰嗦,額,網路上多得很,具體怎麼做自己查,需要的話,我給你做個例子,HI我
E. java 如何調用dll
JAVA以其跨平台的特性深受人們喜愛,而又正由於它的跨平台的目的,使得它和本地機器的各種內部聯系變得很少,約束了它的功能。解決JAVA對本地操作的一種方法就是JNI。
JAVA通過JNI調用本地方法,而本地方法是以庫文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX機器上是SO文件形式)。通過調用本地的庫文件的內部方法,使JAVA可以實現和本地機器的緊密聯系,調用系統級的各介面方法。
簡單介紹及應用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在類中聲明所調用的庫名稱,如下:
static {
System.loadLibrary(「goodluck」);
}
在這里,庫的擴展名字可以不用寫出來,究竟是DLL還是SO,由系統自己判斷。
還需要對將要調用的方法做本地聲明,關鍵字為native。並且只需要聲明,而不需要具 體實現。如下:
public native static void set(int i);
public native static int get();
然後編譯該JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就會生成C/C++的頭文件。
例如程序testdll.java,內容為:
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
用javac testdll.java編譯它,會生成testdll.class。
再用javah testdll,則會在當前目錄下生成testdll.h文件,這個文件需要被C/C++程序調用來生成所需的庫文件。
二、C/C++中所需要做的工作
對於已生成的.h頭文件,C/C++所需要做的,就是把它的各個方法具體的實現。然後編譯連接成庫文件即可。再把庫文件拷貝到JAVA程序的路徑下面,就可以用JAVA調用C/C++所實現的功能了。
接上例子。我們先看一下testdll.h文件的內容:
#i nclude <jni.h>
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
在具體實現的時候,我們只關心兩個函數原型
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
這里JNIEXPORT和JNICALL都是JNI的關鍵字,表示此函數是要被JNI調用的。而jint是以JNI為中介使JAVA的int類型與本地的int溝通的一種類型,我們可以視而不見,就當做int使用。函數的名稱是JAVA_再加上java程序的package路徑再加函數名組成的。參數中,我們也只需要關心在JAVA程序中存在的參數,至於JNIEnv*和jclass我們一般沒有必要去碰它。
好,下面我們用testdll.cpp文件具體實現這兩個函數:
#i nclude "testdll.h"
int i = 0;
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
{
i = j;
}
編譯連接成庫文件,本例是在WINDOWS下做的,生成的是DLL文件。並且名稱要與JAVA中需要調用的一致,這里就是goodluck.dll 。把goodluck.dll拷貝到testdll.class的目錄下,java testdll運行它,就可以觀察到結果了。