Java Native Interface(JNI) 簡介

博客中提到的JNI均指Java Native Interface,Java本地接口。本地代碼均指C/C++代碼。

JNI簡介

JNI是Java平臺中的一個非常強大的特性,通過JNI相關的接口,我們不僅可以在Java中調用本地代碼,也可以在本地代碼使用Java完成相關的操作,并且不需要考慮操作系統之間的差異。那么JNI是如何消除操作系統之間的差異的呢?首先,我們要理解兩個概念:Java平臺和主機環境。Java平臺是包含了Java虛擬機和Java API接口的編程環境,Java應用程序會被編譯成與機器無關的二進制格式的類文件,這些類文件能夠被Java虛擬機解析執行。主機環境表示主機操作系統,本地庫和計算機指令集。使用C/C++編寫的本地代碼會被編譯成與機器相關的二進制代碼并與本地庫鏈接起來。JRE(Java Runtime Environment)就是這樣的一個主機環境。Java應用程序、Java虛擬機、JNI、本地應用程序或者本地代碼庫與主機環境之間的關系如下圖所示:

Java應用程序在Java虛擬機里解析執行,Java虛擬機在主機環境里運行,并通過JNI接口與本地應用程序或者代碼庫進行通信。

JNI啟示

需要強調的一點是,一旦使用JNI去編寫應用程序就意味著你將失去Java平臺的兩個特性:

  1. Java應用程序不再跨平臺運行。即便Java語言編寫的部分是跨平臺的,但是你仍然需要將本地代碼部分重新編譯成與平臺相關的代碼;
  2. 本地代碼并不是類型安全的語言,然而Java卻是。因此,如果本地代碼稍有差錯都回導致Java虛擬機崩潰?;谶@一點,在執行JNI之前進行安全檢查是非常重要的一個步驟。

什么情況下使用JNI

在《JNI啟示》小節中介紹了使用JNI的兩個劣勢,使用JNI之前通常需要考慮是否還有其它方式來完成Java與不同語言之間的交互,下面是三種常見的不使用JNI的方式:

  1. TCP連接或者其它IPC機制;
  2. JDBC;
  3. Java IDL接口。

以上三種方式的共同特點是Java應用程序與本地代碼是在不同進程中運行的,因此,本地代碼的錯誤并不會引起Java虛擬機的崩潰。如果你需要Java應用程序與在同一進程內的本地代碼進行交互,那么JNI就派上用場了,比如以下幾種情況:

  1. Java API不支持與特定操作系統相關的特性;
  2. Java應用程序想要訪問本地代碼庫,但是想減少進程間通信的開銷;
  3. 使用本地代碼實現對性能要求非常高的功能。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,948評論 18 139
  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,367評論 11 349
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,373評論 25 708
  • 讀書分享: D3 金鳳 第三章(16-21頁) 摘抄 1,每個人都把自己眼界的極限,當作是世界的極限。(叔本華)...
    輕風style閱讀 674評論 0 1
  • “枯藤老樹昏鴉,小橋流水人家”,詩中的風景安詳而又溫馨,清水村就是這樣一個有著詩中般風景的歷史古村落。風景多姿多彩...
    綠里是我閱讀 1,029評論 0 0