本文目錄一覽:
- 1、java調用DLL動態庫
- 2、java如何載入多個C動態庫的dll
- 3、java載入dll文件
- 4、eclipse中的java工程項目如何引用外部jar包和dll動態鏈接庫
- 5、java 讀取DLL 咋弄?
java調用DLL動態庫
1、總體說明:實現一個函數,傳入整形數i,返回值i*i,這個函數做在DLL中,java將通過JNI調用這個函數,傳入一個參數,得到返回值。
確定DLL的名稱為calldll.dll,函數shanfei(int i)。2、編寫java程序javacall.java,如下:public class javacall
{
static
{
System.loadLibrary(“calldll”);
}
public native static int shanfei(int i);
public static void main(String[] args)
{
javacall jc = new javacall();
int j;
j = jc.shanfei(4);
System.out.println(j);
}
}3、編譯javac javacall.java4、生成頭文件javah -jni javacall
生成javacall.h文件5、製作VC++動態庫建立新DLL工程,程序中添加:#include “javacall.h”
JNIEXPORT jint JNICALL Java_javacall_shanfei (JNIEnv *, jclass, jint p)
{
int j = p*p;
return j;
}別忘了將javacall.h複製到VC工程目錄中,然後編譯,如果編譯說找不到jni.h文件,可以將jni.h複製到工程目錄中,還可將javacall.h文件中的#include jni.h改為#include “jni.h”,再編譯。
編譯生成DLL文件如「test.dll」,名稱與System.loadLibrary(“test”)中的名稱一致
vc的編譯辦法:cl -I%java_home%include -I%java_home%includewin32 -LD com_hode_hodeframework_modelupdate_CheckFile.c -Fetest.dll
最後在運行時加參數-Djava.library.path=[dll寄存的路徑]
相關的主題文章: 6、java調用將生成的calldll.dll文件複製到javacall.java所在的目錄中,運行java javacall,應該可以看到運行結果。
java如何載入多個C動態庫的dll
啟動函數里設置 -Djava.library.path=”路徑”
Widndows下多個路徑請用;隔開,這個dll必須使用JNI技術編譯的。
假設DLl.dll
你只需要在程序里寫上System.loadLibrary(“DLL”);
java載入dll文件
java沒法直接讀,只能先用C++寫一個讀取該dll內容的過程,按JNI規範封裝成dll,然後java載入這個dll執行其中的函數。
eclipse中的java工程項目如何引用外部jar包和dll動態鏈接庫
1、引用jar包
絕對路徑引用:右鍵工程–properties–Java Build Path–Libraries–Add external JARs… ,在彈出的對話框中選擇要引入的jar包,OK即可。
相對路徑引用:首先在工程目錄下,新建一個libs文件夾,將要導入的jar包放入其中,然後右鍵工程–properties–Java Build Path–Libraries–Add JARs… ,在彈出的對話框中選擇libs文件夾下的jar包即可。
2、引用dll動態鏈接庫
絕對路徑引用:右鍵工程–properties–java Build Path–Source,點開工程,選擇Native libraries location….,點擊右側的edit..–external Folder…,選擇要引入的dll文件所在文件夾即可。
相對路徑引用:首先在工程目錄下,新建一個libs文件夾,將要導入的dll文件包放入其中,右鍵工程–properties–java Build Path–Source,點開工程,選擇Native libraries location….,點擊右側的edit..–Workspace..,選擇libs文件夾即可。
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
原創文章,作者:QLTO,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/149181.html