1. 程式人生 > >Java學習之通過JNI呼叫C/C++編寫的dll連結庫(圖文教程)

Java學習之通過JNI呼叫C/C++編寫的dll連結庫(圖文教程)

    看了網上幾個主要的教程,都會導致出現各種錯誤,對於初學者來說會造成一些困擾。在這裡詳細記錄一下JNI呼叫過程。本案例的基本配置:Eclipse+VS2015,Win10  64位

(1)編寫Java Project

開啟Eclipse,新建一個Java Project,如:LearnJNI。新建包名,如:com.cogito。新建一個類TestNative。

編寫程式碼,如下:

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>
	}
}
(2)生成本地方法的標頭檔案

開啟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類,得到結果輸出,大功告成。