JNI心得 - (一) 什麼是JNI

    近些日子想整理一下知識脈絡,索性就從JNI開始,開發android開發程序員或多或少會接觸jni這一概念,剛剛接觸這個東西只知道通過他可以讓android程序調用c代碼,其他的就不知道了,後來經過長時間的摸爬滾打,終於大概知道JNI到底是個什麼東西了。

 

  1. 學習JNI時需要了解的一些基本知識
  • JNI

JNI全稱Java Native Interface,他是接口也是協議,他的出現時爲了滿足Java與其他語言通信,JNI是java特有的產物,所以他是屬於Java的而不是屬於android的,只不過大多數人是通過android知道了JNI。衆所周知java是一種跨平臺語言,這種跨平臺的是實現方式是讓java運行在虛擬機上,但是這種機制無法進行一些平臺相關的操作,比如與平臺特有的驅動交互。而JNI的出現就有效的解決了這一問題,通過JNI可以運行本地代碼(大多數是C/C++)。同時JNI也會提升程序的運行效率(Java代碼運行效率比本地代碼低)。但是大自然的規律告訴我們這世上沒有完全十全十美的事物,JNI的出現會影響Java的跨平臺性,因爲用到了本地代碼,所以當需要做代碼移植的時候可能就需要在修改一下本地代碼。但是總體來說還是利大於弊的。

 

  • NDK

之前一直以爲NDK就是JNI,這兩個是一個東西。其實不然,從官網摘下這樣一段描述

The Android NDK is a toolset that lets you implement parts of your app in native code, using languages such as C and C++. For certain types of apps, this can help you reuse code libraries written in those languages.

原來NDK是Android提供的工具集,他可以幫助應用程序使用本地程序部分,也就是通過他可以編譯C/C++代碼部分。當然NDK不會專門針對Android程序中的本地代碼部分進行編譯。他也可編譯一個完全脫離AndroidApp的本地代碼,只要你想做沒什麼是不可能的。

 

  • Java代碼中的native 關鍵字

這個關鍵字代表着他所修飾的方法是一個用本地語言編寫的,有了這個關鍵詞java編譯器不會去檢查該方法在java層是否有實現。但是他也不會去檢查他在本地方法層是否有實現,所以當用該關鍵詞修飾了一個方法時如果在沒有本地方法實現的情況下調用該方法,編譯是可以通過的,但是運行時就會報錯。

 

  • JNIeEnv

閱讀jni.h的時候可以發現JNIEnv 是對JNINativeInterface 的封裝,而JNINativeInterface 正是JNI對外開放的接口的集合,也就是說JNIEnv代表的是虛擬機的運行環境,可以通過他操作虛擬機,調用虛擬機提供的函數。這裏需要提的是JNIEnv的特別之處在於他只在當前線程有效,不可以把它緩存起來再通過另一個線程操作他,那樣是無效的,也是不合法的。

瞭解以上幾個概念之後接下來就可以搬JNI牌實心磚了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章