成都校區*精品*JAVA中JNI調用C動態聯接庫

前言 
java是一個翻譯型的編程語言,雖然比起C語言這種靠近底層的語言運行要慢點,但是覆蓋面積和用途是十分的廣。

它們都有自己的特點和好處,這兩個編程語言不單單是兩個獨立的個體,其實還有緊密的聯繫。什麼樣子的聯繫,它們是可以互相之間進行代碼上的調用。

使用Java的JNI調用C/C++的動態聯結庫有個固定的步驟,下面將以一個最簡單的HelloWorld例子程序來說明調用過程。 這個HelloWorld的例子只是簡單的顯示HelloWorld消息。
第一步 編寫Java類
首先,我們創建一個名為jnitest的Eclipse工程,並新建一個src源代碼目錄。
這裡我們編寫兩個Java類,一個命名為HelloWorld,一個命名為TestDLL。 HelloWorld類包含一個本地方法displayHelloWorld(), TestDLL用於測試這個本地方法。
HelloWorld的源碼清單如下:
[Java]
List1. HelloWorld.java源碼

public class HelloWorld {
public native void displayHelloWorld();①
static{
System.loadLibrary("HelloWorld"); ②
}
}
說明:①是java本地方法申明;②裝入動態鏈接庫,"HelloWorld"是要裝入的動態鏈接庫名稱。
[Java]
TestDLL源碼如下:

List2. TestDLL.java源碼

public class TestDLL {

public static void main(String[] args){
HelloWorld helloWorld = new HelloWorld();

helloWorld.displayHelloWorld();
}
}
第二步 編譯Java類在Eclipse工具中編譯Java類。編譯後的class文件會自動放入工程目錄下的bin目錄中。第三步 生成C/C++頭文件在windows中打開一個命令窗口,進入jnitest工程所在目錄下的bin目錄如:D:\workspace\jnitest\bin。鍵入javah -classpath D:\workspace\jnitest\bin HelloWorld命令生成頭文件HelloWorld.h。內容如下:
注意,不要修改這個頭文件。
[Java]
List3. HelloWorld.h源碼

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class HelloWorld */

#ifndef _Included_HelloWorld

#define _Included_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: HelloWorld

* Method: displayHelloWorld

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif
第四步 編寫本地方法實現
用VC6創建HelloWorld Win32動態鏈接庫工程。將上述生成的頭文件HelloWorld.h拷貝到
D:\Program Files\Microsoft Visual Studio\MyProjects\HelloWorld目錄下面。
將D:\j2sdk1.4.2\include目錄下的jni.h和D:\j2sdk1.4.2\include\win32\jni_md.h兩個頭文件拷貝到VC安裝目錄下的D:\Program Files\Microsoft Visual Studio\VC98\Include目錄下面。在VC IDE中新建HelloWorld.cpp文件,實現頭文件中聲明的方法並編譯生成DLL。
List4. HelloWorld.cpp源碼
#include "HelloWorld.h"

#include

/*

* Class: HelloWorld

* Method: displayHelloWorld

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld

(JNIEnv *, jobject)

{

printf("Hello World!\n");

return;

}
第五部 運行測試程序
先將生成的DLL拷貝到jnitest工程的D:\workspace\jnitest\bin下面,然後設置DLL搜索路徑(環境變量PATH)為D:\workspace\jnitest \bin(JNI並沒有規定必須將dll放在與class文件相同的目錄,只要確保JVM能搜索到DLL即可)

③重新啟動Elipse後,運行測試程序,將看到控制檯輸出“Hello World!”
注意,③必須設置好DLL搜索路徑,或者將dll拷貝到C:\WINDOWS\system32下面
總結
使用JNI的好處:
a、可以使用JNI來實現“本地方法”(native methods),並在JAVA程序中調用它們,一般是在java中調用C的函數;
相反的也可以用C來調用Java中的方法,這樣可以複用很多以前寫過的代碼。
b、JNI支持一個“調用接口”(invocation interface),它允許你把一個JVM嵌入到本地程序中。
本地程序可以鏈接一個實現了JVM的本地庫,然後使用“調用接口”執行JAVA語言編寫的軟件模塊。
成都校區*精品*JAVA中JNI調用C動態聯接庫


分享到:


相關文章: