Java Native Interface(JNI,Java本地接口)是Java語言的本地編程接口。在java程序中,咱們能夠經過JNI實現一些用java語言不便實現的功能,以下:java
1)標準的java類庫沒有提供你的應用程序所須要的功能,一般這些功能是平臺相關的(只能由其餘語言編寫)。linux
2)你但願使用一些已經有的類庫或者應用程序,而他們並不是用java語言編寫的。c++
3)程序的某些部分對速度要求比較苛刻,你選擇用匯編或者c語言來實現並在java語言中調用他們。算法
4)爲了應用的安全性,會將一些複雜的邏輯和算法經過本地代碼(C或C++)來實現,本地代碼比字節碼難以破解。編程
建議不到萬不得已不要使用JNI技術,一方面它須要你掌握更多的知識才能夠駕馭,一方面使用了JNI你的程序就會喪失可移植性(C/C++是非跨平臺的)。windows
http://blog.csdn.net/xyang81/article/details/41777471安全
1)編寫java代碼函數
咱們在硬盤上創建一個hello目錄做爲咱們的工做目錄,首先咱們須要編寫本身的java代碼,在java代碼中咱們會聲明native方法,代碼很是簡單(稱爲JNI程序,它實現的JNI規範,是JVM規範的一部分,因此能夠運行於JVM)。以下所示:spa
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。 .net
System.loadLibrary("HelloWorld");
只須要指定動態庫的名字便可,不須要加lib前綴,也不要加.so、.dll和.jnilib後綴,java會去java.library.path系統屬性指定的目錄下查找動態庫文件,若是沒有找到會拋出java.lang.UnsatisfiedLinkError異常。
System.load("/Users/yangxin/Desktop/libHelloWorld.jnilib");
指定動態庫的絕對路徑名,須要加上前綴和後綴
2)建立.h文件
javac HelloWorld.java,生成HelloWorld.class文件。
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
3)編寫本地實現代碼
在這部分咱們要用C/C++語言實現java中定義的方法,咱們在VC++中新建一個Project,而後建立一個HelloWorldImpl.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文件。
4)運行java程序
把上面生成的hello.dll文件複製到咱們的工做目錄,這時候咱們的目錄中包括HelloWorld.java,HelloWorld.class和hello.dll文件。運行java HelloWorld命令,則可在控制檯看到Hello world!的輸出了。
JNI開發流程主要分爲如下6步:
1、編寫聲明瞭native方法的Java類
2、將Java源代碼編譯成class字節碼文件
3、用javah -jni命令生成.h頭文件(javah是jdk自帶的一個命令,-jni參數表示將class中用native聲明的函數生成jni規則的函數)
4、用本地代碼實現.h頭文件中的函數
5、將本地代碼編譯成動態庫(windows:*.dll,linux/unix:*.so,mac os x:*.jnilib)
6、拷貝動態庫至 java.library.path 本地庫搜索目錄下,並運行Java程序