native關鍵字初識--java調用非java代碼的接口

 Java基礎知識——JNI入門介紹(上)html

Java™ 本機接口(Java Native Interface,JNI)是一個標準的 Java API,它支持將 Java 代碼與使用其餘編程語言編寫的代碼相集成。若是您但願利用已有的代碼資源,那麼可使用 JNI 做爲您工具包中的關鍵組件 —— 好比在面向服務架構(SOA)和基於雲的系統中。可是,若是在使用時未注意某些事項,則 JNI 會迅速致使應用程序性能低下且不穩定。java

JNI 的發展
JNI 自從 JDK 1.1 發行版以來一直是 Java 平臺的一部分,而且在 JDK 1.2 發行版中獲得了擴展。JDK 1.0 發行版包含一個早期的本機方法接口,可是未明確分隔本機代碼和 Java 代碼。在這個接口中,本機代碼能夠直接進入 JVM 結構,所以沒法跨 JVM 實現、平臺或者甚至各類 JDK 版本進行移植。使用 JDK 1.0 模型升級含有大量本機代碼的應用程序,以及開發能支持多個 JVM 實現的本機代碼的開銷是極高的。
JDK 1.1 中引入的 JNI 支持:
版本獨立性
平臺獨立性
VM 獨立性
開發第三方類庫
有一個有趣的地方值得注意,一些較年輕的語言(如 PHP)在它們的本機代碼支持方面仍然在努力克服這些問題。
與舊有代碼集成,避免從新編寫。編程

Java 環境和語言對於應用程序開發來講是很是安全和高效的。可是,一些應用程序卻須要執行純 Java 程序沒法完成的一些任務,好比:安全

a.與舊有代碼繼承,避免從新編寫架構

b.實現可用類庫中所缺乏的功能。舉例來講,在 Java 語言中實現 ping 時,您可能須要 Internet Control Message Protocol (ICMP) 功能,但基本類庫並未提供它。
c.最好與使用 C/C++ 編寫的代碼集成,以充分發掘性能或其餘與環境相關的系統特性。

d.解決須要非 Java 代碼的特殊狀況.
app

e.與操做系統交互JVM支持着java語言自己和運行時庫,它是java程序賴以生存的平臺,它由一個解釋器(解釋字節碼)和一些鏈接到本地代碼的庫組成。然而無論怎樣,它畢竟不是一個完整的系統,它常常依賴於一些底層(underneath在下面的)系統的支持。這些底層系統經常是強大的操做系統。經過使用本地方法,咱們得以用java實現了jre的與底層系統的交互,甚至JVM的一些部分就是用C寫的,還有,若是咱們要使用一些java語言自己沒有提供封裝的操做系統的特性時,咱們也須要使用本地方法。
 f.Sun's Java
    Sun的解釋器是用C實現的,這使得它能像一些普通的C同樣與外部交互。jre大部分是用java實現的,它也經過一些本地方法與外界交互。例如:類java.lang.Thread 的 setPriority()方法是用java實現的,可是它實現調用的是該類裏的本地方法setPriority0()。這個本地方法是用C實現的,並被植入JVM內部,在Windows 95的平臺上,這個本地方法最終將調用Win32 SetPriority() API。這是一個本地方法的具體實現由JVM直接提供,更多的狀況是本地方法由外部的動態連接庫(external dynamic link library)提供,而後被JVM調用。
編程語言

舉例來講,核心類庫的實現可能須要跨包調用或者須要繞過其餘 Java 安全性檢查。
JNI 容許您完成這些任務。它明確分開了 Java 代碼與本機代碼(C/C++)的執行,定義了一個清晰的 API 在這二者之間進行通訊。從很大程度上說,它避免了本機代碼對 JVM 的直接內存引用,從而確保本機代碼只需編寫一次,而且能夠跨不一樣的 JVM 實現或版本運行。
藉助 JNI,本機代碼能夠隨意與 Java 對象交互,獲取和設計字段值,以及調用方法,而不會像 Java 代碼中的相同功能那樣受到諸多限制。這種自由是一把雙刃劍:它犧牲 Java 代碼的安全性,換取了完成上述所列任務的能力。在您的應用程序中使用 JNI 提供了強大的、對機器資源(內存、I/O 等)的低級訪問,所以您不會像普通 Java 開發人員那樣受到安全網的保護。JNI 的靈活性和強大性帶來了一些編程實踐上的風險,好比致使性能較差、出現 bug 甚至程序崩潰。您必須格外留意應用程序中的代碼,並使用良好的實踐來保障應用程序的整體完整性。對 Java 外部的調用一般不能移植到其餘平臺上,在 applet 中還可能引起安全異常。實現本地代碼將使您的 Java 應用程序沒法經過 100% 純 Java 測試。ide

若是必須執行本地調用,則要考慮幾個準則:
1.將您的全部本地方法都封裝在單個類中,這個類調用單個 DLL。對於每種目標操做系統,均可以用特定於適當平臺的版本替換這個 DLL。這樣就能夠將本地代碼的影響減至最小,並有助於將之後所需的移植問題包含在內。
2.本地方法要簡單。儘可能將您的 DLL 對任何第三方(包括 Microsoft)運行時 DLL 的依賴減到最小。使您的本地方法儘可能獨立,以將加載您的 DLL 和應用程序所需的開銷減到最小。若是須要運行時 DLL,必須隨應用程序一塊兒提供它們。函數

JNI的書寫步驟
        1.編寫帶有native聲明的方法的Java類
        2.使用javac命令編譯編寫的Java類
        3.使用java -jni ****來生成後綴名爲.h的頭文件
        4.使用其餘語言(C、C++)實現本地方法
        5.將本地方法編寫的文件生成動態連接庫工具

在使用JNI時候最常遇到的10大編碼和設計錯誤,詳見 避免最多見的 10 大 JNI 編程錯誤的技巧和工具 

一些教程能夠看ibm的博客:提供調用本地 C 代碼的 Java 代碼示例   在 Windows 中實現 Java 本地方法

 JNI的初級教程能夠看 Java基礎知識——JNI入門介紹(上) 、Java基礎知識——JNI入門介紹(下)

java native關鍵字

 一. 什麼是Native Method
   簡單地講,一個Native Method就是一個java調用非java代碼的接口。一個Native Method是這樣一個java的方法:該方法的實現由非java語言實現,好比C。這個特徵並不是java所特有,不少其它的編程語言都有這一機制,好比在C++中,你能夠用extern "C"告知C++編譯器去調用一個C的函數。
   "A native method is a Java method whose implementation is provided by non-java code."
   在定義一個native method時,並不提供實現體(有些像定義一個java interface),由於其實現體是由非java語言在外面實現的。

    標識符native能夠與全部其它的java標識符連用,可是abstract除外。這是合理的,由於native暗示這些方法是有實現體的,只不過這些實現體是非java的,可是abstract卻顯然的指明這些方法無實現體。native與其它java標識符連用時,其意義同非Native Method並沒有差異。

     一個native method方法能夠返回任何java類型,包括非基本類型,並且一樣能夠進行異常控制。這些方法的實現體能夠自制一個異常而且將其拋出,這一點與java的方法很是類似。
    native method的存在並不會對其餘類調用這些本地方法產生任何影響,實際上調用這些方法的其餘類甚至不知道它所調用的是一個本地方法。JVM將控制調用本地方法的全部細節。

native介紹摘錄於 Java的native關鍵字

因爲這個native關鍵字暫時沒有用到,時間有限,如今僅僅在此記錄。之後再完善。

相關文章
相關標籤/搜索