JNI入門教程之HelloWorld篇
阿新 • • 發佈:2019-02-03
本文講述如何使用JNI技術實現HelloWorld,目的是讓讀者熟悉JNI的機制並編寫第一個HelloWorld程式。
Java Native Interface(JNI)是Java語言的本地程式設計介面,是J2SDK的一部分。在java程式中,我們可以通過JNI實現一些用java語言不便實現的功能。通常有以下幾種情況我們需要使用JNI來實現。
- 標準的java類庫沒有提供你的應用程式所需要的功能,通常這些功能是平臺相關的
- 你希望使用一些已經有的類庫或者應用程式,而他們並非用java語言編寫的
- 程式的某些部分對速度要求比較苛刻,你選擇用匯編或者c語言來實現並在java語言中呼叫他們
在《java核心技術》中,作者提到JNI的時候,建議不到萬不得已不要使用JNI技術,一方面它需要你掌握更多的知識才可以駕馭,一方面使用了JNI你的程式就會喪失可移植性。在本文我們跳過JNI的底層機制,讀者最好先把它想象為原生代碼和java程式碼的粘合劑。關係如下圖所示:
下面我們開始編寫HelloWorld程式,由於涉及到要編寫c/c++程式碼因此我們會在開發中使用Microsoft VC++工具。
- 編寫java程式碼
我們在硬碟上建立一個hello目錄作為我們的工作目錄,首先我們需要編寫自己的java程式碼,在java程式碼中我們會宣告native方法,程式碼非常簡單。如下所示
class HelloWorld
{
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
注意我們的displayHelloWorld()方法的宣告,它有一個關鍵字native,表明這個方法使用java以外的語言實現。方法不包括實現,因為我們要用c/c++語言實現它。注意System.loadLibrary("hello")這句程式碼,它是在靜態初始化塊中定義的,系統用來裝載hello共享庫,這就是我們在後面生成的hello.dll(如果在其他的作業系統可能是其他的形式,比如hello.so) - 編譯java程式碼
javac HelloWorld.java 生成HelloWorld.class檔案 - 建立.h檔案
這一步中我們要使用javah命令生成.h檔案,這個檔案要在後面的c/c++程式碼中用到,我們執行
javah HelloWorld。這樣我們可以看到在相同目錄下生成了一個HelloWorld.h檔案,檔案內容如下
在此我們不對他進行太多的解釋。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* 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 - 編寫本地實現程式碼
在這部分我們要用C/C++語言實現java中定義的方法,我們在VC++中新建一個Project,然後建立一個HelloWorldImp.cpp檔案,內容如下
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!/n");
return;
}
注意我們這裡include了 jni.h和剛才得到的HelloWorld.h檔案。因此你要在VC++裡面設定好,jni.h在JAVA_HOME/include裡面。編譯通過後再生成hello.dll檔案。 - 執行java程式
把上面生成的hello.dll檔案複製到我們的工作目錄,這時候我們的目錄中包括HelloWorld.java,HelloWorld.class和hello.dll檔案。執行java HelloWorld命令,則可在控制檯看到Hello world|
的輸出了。
JNI是一門複雜,有趣且富有挑戰性的技術,我們在後面的幾篇文章中將說明如何在java語言和Native語言之間進行互動。