Java學習之通過JNI呼叫C/C++編寫的dll連結庫(圖文教程)
看了網上幾個主要的教程,都會導致出現各種錯誤,對於初學者來說會造成一些困擾。在這裡詳細記錄一下JNI呼叫過程。本案例的基本配置:Eclipse+VS2015,Win10 64位
(1)編寫Java Project
開啟Eclipse,新建一個Java Project,如:LearnJNI。新建包名,如:com.cogito。新建一個類TestNative。
編寫程式碼,如下:
(2)生成本地方法的標頭檔案package com.cogito; public class TestNative { <span style="color:#ff0000;">public native void sayHello();</span> public static void main(String[] args) { <span style="color:#ff0000;">System.loadLibrary("NativeProject"); //載入dll庫 TestNative test = new TestNative(); test.sayHello(); //呼叫本地方法</span> } }
開啟cmd命令提示符,切換到Java Project的bin目錄:(projectpath為LearnJNI的目錄)
cd projectpath\bin
輸入:javah com.cogito.TestNative,回車,可在LearnJNI的bin目錄下發現增加了一個H檔案com_cogito_TestNative.h。
(3)建立本地方法的C/C++的dll實現
開啟VS2015,新建一個Win32控制檯應用程式如NativeProject,Win32應用程式嚮導中依次如圖設定:
將剛剛得到的bin目錄下的com_cogito_TestNative.h標頭檔案,以及jni.h、jni_md.h共三個標頭檔案,複製到VS2015建立的工程目錄../NativeProject/NativeProject/下。
jni.h檔案在jdk安裝路徑下的include資料夾,如:D:\Program Files\Java\jdk1.7.0_79\include
jni_md.h檔案在jdk安裝路徑下的include/win32資料夾,如:D:\Program Files\Java\jdk1.7.0_79\include\win32
使得三個.h檔案如圖:
右鍵VS2015中建立的工程NativeProject,新增->現有項,選擇com_cogito_TestNative.h檔案。匯入標頭檔案後,雙擊開啟,更改#include <jni.h>為#include
"jni.h",儲存(Ctrl+S)。如圖:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class com_cogito_TestNative */
#ifndef _Included_com_cogito_TestNative
#define _Included_com_cogito_TestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_cogito_TestNative
* Method: sayHello
* Signature: ()V
*/
<span style="color:#ff0000;">JNIEXPORT void JNICALL Java_com_cogito_TestNative_sayHello
(JNIEnv *, jobject);</span>
#ifdef __cplusplus
}
#endif
#endif
然後新建一個cpp檔案,即右鍵NativeProject,新增->新建項,命名如:source.cpp,新增上述標頭檔案的紅色部分函式的實現程式碼:(注意#include標頭檔案為剛匯入的com_cogito_TestNative.h)
# include "com_cogito_TestNative.h"
# include <iostream>
using namespace std;
JNIEXPORT void JNICALL Java_com_cogito_TestNative_sayHello(JNIEnv *, jobject)
{
cout << "Hello World!" << endl;
}
接下來,設定編譯版本和平臺,根據需要設定,如release版x64平臺
F7進行編譯,編譯成功後將在工程的x64/release/下生成dll檔案。
(4)測試Java呼叫dll
首先設定本地庫目錄位置,即在Eclipse中右鍵(1)中的LearnJNI工程->propertise,選擇source標籤,展開LearnJNI/src,選中Native library location:(None),右側點選Edit,複製上述NativeProject.dll的路徑填入,如圖
然後執行(1)中建立的TestNative類,得到結果輸出,大功告成。