Can you summarize the following document?
        
  有些事情Java無法處理時,JNI允許程式設計師用其他程式語言來解決,例如,Java標準庫不支援的平臺相關功能或者程式庫。也用於改造已存在的用其它語言寫的程式,供Java程式呼叫。許多基於JNI的標準庫提供了很多功能給程式設計師使用,例如檔案I/O、音訊相關的功能。當然,也有各種高效能的程式,以及平臺相關的API實現,允許所有Java應用程式安全並且平臺獨立地使用這些功能。  JNI框架允許Native方法呼叫Java物件,就像Java程式訪問Native物件一樣方便。Native方法可以建立Java物件,讀取這些物件,並呼叫Java物件執行某些方法。當然Native方法也可以讀取由Java程式自身建立的物件,並呼叫這些物件的方法。

  在JNI框架,native方法一般在單獨的.c或.cpp檔案中實現。當JVM呼叫這些函式,就傳遞一個codice_1指標,一個codice_2的指標,任何在Java方法中宣告的Java引數。一個JNI函式看起來類似這樣:  "codice_3"指向一個結構包含了到JVM的介面,包含了所有必須的函式與JVM互動、訪問Java物件。例如,把本地陣列轉換為Java陣列的JNI函式,把本地字串轉換為Java字串的JNI函式,例項化物件,丟擲異常等。基本上,Java程式可以做的任何事情都可以用codice_1做到,雖然相當不容易。  例如,下面程式碼把Java字串轉化為本地字串:  本地資料型別與Java資料型別可以互相對映。對於複合資料型別,如物件,陣列,字串,就必須用codice_1中的方法來顯示地轉換。  第2個引數"obj"引用到一個Java物件,在其中宣告瞭本地方法。

  下表是Java (JNI)與原生代碼之間的資料型別對映:  簽名codice_6是由該名字指明的類。例如,簽名codice_7是類codice_8。帶字首codice_9的簽名表示該型別的陣列,如codice_10表示整型陣列。codice_11簽名使用codice_12程式碼。  這些型別是可以互換的,如codice_13也可使用 codice_14,不需任何型別轉換。  但是,Java字串、陣列與本地字串、陣列是不同的。如果在使用codice_15代替了codice_16,程式可能會導致JVM崩潰。 這種情況也適用於Java陣列。下例對陣列元素求和。

  JNI環境指標(JNIEnv*)作為每個對映為Java方法的本地函式的第一個引數,使得本地函式可以與JNI環境互動。這個JNI介面指標可以儲存,但僅在當前執行緒中有效。其它執行緒必須首先呼叫AttachCurrentThread()把自身附加到虛擬機器以獲得JNI介面指標。一旦附加,本地執行緒執行就類似執行本地函式的正常Java執行緒。本地執行緒直到執行DetachCurrentThread()把自身脫離虛擬機器。  把當前執行緒附加到虛擬機器並獲取JNI介面指標:  當前執行緒脫離虛擬機器:

  

  原生代碼不僅可以與Java互動,也可以在Java 繪圖,使用Java AWT Native Interface。

  JNI允許直接訪問彙編程式碼。 也可以從彙編程式碼訪問Java。

  Microsoft實現的Java虛擬機器——Visual J++的類似的訪問本地Windows程式碼的機制Raw Native Interface(RNI)。

  

  make.sh  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. javac HelloWorld.java javah HelloWorld gcc -shared libHelloWorld.c -o libHelloWorld.so java HelloWorld build.bat  SET VC="C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC" SET MSDK="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A" SET JAVA_HOME="C:\Program Files (x86)\Java\jdk1.7.0_21"  call %VC%\vcvarsall.bat  javac HelloWorld.java javah HelloWorld %VC%\bin\cl /I%JAVA_HOME%\include /I%JAVA_HOME%\include\win32 /I%VC%\include /I%VC%\lib /I%MSDK%\Lib libHelloWorld.c /FelibHelloWorld.dll /LD java HelloWorld HelloWorld.java class HelloWorld  HelloWorld.h /* DO NOT EDIT THIS FILE - it is machine generated */ /* Header for class HelloWorld */  extern "C" { * Class: HelloWorld JNIEXPORT void JNICALL Java_HelloWorld_print  libHelloWorld.c  Invocation:  $ chmod +x make.sh $./make.sh
JNI (Java Native Interface,Java本地介面)是一種程式設計框架,使得Java虛擬機器中的Java程式可以呼叫本地應用/或庫,也可以被其他程式呼叫。 本地程式一般是用其它語言(C、C++或組合語言等)編寫的,並且被編譯為基於本機硬體和作業系統的程式。