Java中Java Native Interface的使用方法介紹

來源:互聯網
上載者:User
Java中Java Native Interface的使用方法介紹

   JNI是Java Native Interface的縮寫,中文為JAVA本地調用。從Java 1.1 開始,Java Native Interface (JNI)標準成為java平台的一部分,它允許Java代碼和其他語言寫的代碼進行互動。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它並不妨礙你使用其他語言,只要呼叫慣例受支援就可以了。

JNI是Java Native Interface的縮寫,中文為JAVA本地調用。從Java 1.1 開始,Java Native Interface (JNI)標準成為java平台的一部分,它允許Java代碼和其他語言寫的代碼進行互動。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它並不妨礙你使用其他語言,只要呼叫慣例受支援就可以了。

使用java與本地已編譯的代碼互動,通常會喪失平台可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的,比如,使用一些舊的庫,與硬體、作業系統進行互動,或者為了提高程式的效能。JNI標準至少保證本地代碼能工作在任何JAVA 虛擬機器實現下。

 

編寫帶有native聲明的方法的java類

·使用javac命令編譯所編寫的java類

·使用javah -jni java類名產生副檔名為h的標頭檔

·使用C/C++實現本地方法

·將C/C++編寫的檔案產生動態串連庫

·ok

1) 編寫java程式:這裡以HelloWorld為例。

代碼1:

class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}

聲明native方法:如果你想將一個方法做為一個本地方法的話,那麼你就必須聲明改方法為 native的,並且不能實現。其中方法的參數和傳回值在後面講述。 Load動態庫:System.loadLibrary("hello");載入動態庫(我們可以這樣理解:我們的方法 displayHelloWorld()沒有實現,但是我們在下面就直接使用了,所以必須在使用之前對它進行初始化)這裡一般是以static塊進行載入的。同時需要注意的是System.loadLibrary();的參數“hello”是動態庫的名字。

2)編譯

沒有什麼好說的了 javac HelloWorld.java

3)產生副檔名為h的標頭檔

javah -jni HelloWorld

標頭檔的內容:

     /* DO NOT EDIT THIS FILE - it is machine generated */
1. include
/* Header for class HelloWorld */
1. ifndef _Included_HelloWorld 2. define _Included_HelloWorld 3. ifdef __cplusplus
extern "C" {
1. endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
* /
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);
1. ifdef __cplusplus
}

1. endif 2. endif(這裡我們可以這樣理解:這個h檔案相當於我們在java裡面的介面,這裡聲明了一個 Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然後在我們的本地方法裡面實現這個方法,也就是說我們在編寫C/C++程式的時候所使用的方法名必須和這裡的一致)。

4) 編寫本地方法實現和由javah命令產生的標頭檔裡面聲明的方法名相同的方法。

代碼2:

1 #include "jni.h" 2 #include "HelloWorld.h"
3 //#include other headers
4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!/n");
return;
}

注意代碼2中的第1行,需要將jni.h(該檔案可以在%JAVA_HOME%/include檔案夾下面找到)檔案引入,因為在程式中的JNIEnv、 jobject等類型都是在該標頭檔中定義的;另外在第2行需要將HelloWorld.h標頭檔引入(我是這麼理解的:相當於我們在編寫java程式的時候,實現一個介面的話需要聲明才可以,這裡就是將HelloWorld.h標頭檔裡面聲明的方法加以實現。當然不一定是這樣)。然後儲存為 HelloWorldImp.c就ok了。

5)產生動態庫

這裡以在Windows中為例,需要產生dll檔案。在儲存HelloWorldImpl.c 檔案夾下面,使用VC的編譯器cl成。 cl(字母L的小寫表示) -I(字母i的大寫表示,與後面的路徑之間沒有空格)%java_home%/include -I%java_home%/include/win32 -LD HelloWorldImp.c -Fehello.dll 注意:產生的dll檔案名稱在選項-Fe後面配置,這裡是hello,因為在HelloWorld.java檔案中我們loadLibary的時候使用的名字是hello。當然這裡修改之後那裡也需要修改。另外需要將-I%java_home%/include -I%java_home%/include/win32參數加上,因為在第四步裡面編寫本地方法的時候引入了jni.h檔案。

6) 運行程式 java HelloWorld就ok.、

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.