Java中調用C/C++產生的DLL
一、 產生C的標頭檔
1. 編輯Main.java
- public class Main
- {
- public native static int getStrNum(byte str[], int strLen);
- }
2. 產生標頭檔
按win + r開啟“運行”視窗,輸入“cmd”,開啟DOS控制台視窗。進入上面Main.java所在的目錄中,輸入:
javac Main.java
javah Main
兩條命令完成後會產生Main.h檔案
二、 產生DLL
1. 建立空工程
在VS中建立工程:Win32 Console Application,取名“MakeDLL”,選擇空工程。建立後修改工程屬性:
(1) General中,將“Configuration Type”改為“Dynamic Library (.dll)”;
(2) C/C++的General中,將“Additional Include Directories”添加兩項:
“C:Program FilesJavajdk1.5.0_06include”
“C:Program FilesJavajdk1.5.0_06includewin32”
根據你安裝的JAVA路徑而設定,這是因為在C/C++編譯過程中要使用JAVA的jni.h等檔案
2. 將上面產生的Main.h添加入工程
3. 建立一個新的檔案main.cpp,代碼如下:
- #include "Main.h"
- #include <string.h>
- JNIEXPORT jint JNICALL Java_Main_getStrNum(JNIEnv *env, jclass cls, jbyteArray str, jint strLen)
- {
- jbyte *buffer = (*env).GetByteArrayElements(str, 0);
- buffer[strLen] = ’’; // 由於JAVA自動分配空間,需要傳進來字串長度參數
- jint len = strlen((char*)buffer);
- return len;
- }
4. 按F7編譯連結,產生MakeDLL.dll檔案
三、 JAVA調用DLL
在JAVA中使用上面產生的DLL檔案:
1. 將MakeDLL.dll複製到與使用DLL的JAVA檔案相同的目錄下。
2. JAVA檔案的原始碼:
- public class Main
- {
- static
- {
- System.loadLibrary(’MakeDLL’);
- }
- public native static int getStrNum(byte str[], int strLen);
- public static void main(String[] args)
- {
- Main instance = new Main();
- String str = new String(’haha’);
- int num = instance.getStrNum(str.getBytes(), str.length());
- System.out.println(num);
- }
- }
總結:
另外,JAVA與DLL函數的參數傳遞過程,考試,大提示像int類型的,可以直接從JNI函數參數列表中擷取;而數組元素則要通過JNIEnv來擷取:
jbyte *buffer = (*env).GetByteArrayElements(str, 0); // str是參數列表中jbyteArray變數
同理可以擷取char[]的元素。
函數返回時,可以直接用return語句返回。也可以設定參數列表中的變數指標來返回:
(*env).SetByteArrayRegion(byteArray, 0, 128, byteArr);
byteArray是參數列表中的jbyteArray變數,作為指標用來返回需要返回的資訊;byteArr是jbyte*類型,裡面存放的值是要返回的內容。
圖1 C++與Java互調圖
其它的資訊可以從Google或Baidu中通過尋找“jni”或“java調用DLL”來查閱