您好,登錄后才能下訂單哦!
JNI(Java Native Interface,JAVA原生接口)
使用JNI可以使Java代碼和其他語言寫的代碼(如C/C++代碼)進行交互。
問:為什么要進行交互?
|- 首先,Java語言提供的類庫無法滿足要求,且在數學運算,實時渲染的游戲上,音視頻處理等方面上與C/C++相比效率稍低。
|- 然后,Java語言無法直接操作硬件,C/C++代碼不僅能操作硬件而且還能發揮硬件最佳性能。
|- 接著,使用Java調用本地的C/C++代碼所寫的庫,省去了重復開發的麻煩,并且可以利用很多開源的庫提高程序效率。
C語言常見術語:
庫函數:printf scanf malloc free
|- 為了代碼重用,在C語言中提供了一些常用的、用于執行一些標準任務(如輸入/出)的函數,這些函數事先被編譯,并生成目標代碼,然后將生成的目標代碼打包成一個庫文件,以供再次使用。庫文件中的函數被稱為庫函數,庫文件被稱為函數庫。
|- 在Windows中C語言庫函數中的中間代碼都是以.obj為后綴的,Linux中是以 .o為后綴。
提示:單個目標代碼是無法直接執行的,目標代碼在運行之前需要使用連接程序將目標代碼和其他庫函數連接在一起后生成可執行的文件。 Windows下.dll的文件 , linux下 .so .a的文件.
頭文件:xxx.h
|- 頭文件中存放的是對某個庫中所定義的函數、宏、類型、全局變量等進行聲明,它類似于一份倉庫清單。若用戶程序中需要使用某個庫中的函數,則只需要將該庫所對應的頭文件include到程序中即可。
|- 頭文件中定義的是庫中所有函數的函數原型。而函數的具體實現則是在庫文件中。
|- 簡單的說:頭文件是給編譯器用的,庫文件是給連接器用的。
|- 在鏈接器連接程序時,會依據用戶程序中導入的頭文件,將對應的庫函數導入到程序中。頭文件以.h為后綴名。
函數庫:
|- 動態庫:在編譯用戶程序時不會將用戶程序內使用的庫函數連接到用戶程序的目標代碼中,只有在運行時,且用戶程序執行到相關函數時才會調用該函數庫里的相應函數,因此動態函數庫所產生的可執行文件比較小。
|- 靜態庫:在編譯用戶程序時會將其內使用的庫函數連接到目標代碼中,程序運行時不再需要靜態庫。使用靜態庫生成可執行文件比較大。
在Linux中:
|- 靜態庫命名一般為:lib+庫名+.a 。
|- 如:libcxy.a 其中lib說明此文件是一個庫文件,cxy是庫的名稱,.a說明是靜態的。
|- 動態庫命名一般為:lib+庫名+.so 。.so說明是動態的。
交叉編譯:
|- 將中間代碼連接成當前計算機可執行的二進制程序時,連接程序會根據當前計算機的CPU、操作系統的類型來轉換。
根據運行的設備的不同,可以將cpu分為:
|- arm結構 :主要在移動手持、嵌入式設備上。
|- x86結構 : 主要在臺式機、筆記本上使用。如Intel和AMD的CPU 。
若想在使用了基于x86結構CPU的操作系統中編譯出可以在基于arm結構CPU的操作系統上運行的代碼,就必須使用交叉編譯。
交叉編譯:在一個平臺下編譯出在另一個平臺中可以執行的二進制代碼。Google提供的NDK就可以完成交叉編譯的工作。
NDK全稱:Native Development Kit 。
|- NDK是一系列工具的集合,它有很多作用。
|- 首先,NDK可以幫助開發者快速開發C(或C++)的動態庫。
|- 其次,NDK集成了交叉編譯器。使用NDK,我們可以將要求高性能的應用邏輯使用C開發,從而提高應用程序的執行效率。
NDK工具必須在Linux下運行,它可以在linux環境下編譯出可以在arm平臺下運行的二進制庫文件。
使用JNI技術,其實就是在Java程序中,調用C語言的函數庫中提供的函數,來完成一些Java語言無法完成的任務。由于Java語言和C語言結構完全不相同,因此若想讓它們二者交互,則需要制定一系列的規范。JNI就是這組規范,此時 Java只和JNI交互,而由JNI去和C語言交互。
JNI技術分為兩部分:Java端和C語言端。且以Java端為主導。
|- 首先,Java程序員在Java端定義一些native方法,并將這些方法以C語言頭文件的方式提供給C程序員。
|- 然后,C程序員使用C語言,來實現Java程序員提供的頭文件中定義的函數。
|- 接著,C程序員將函數打包成一個庫文件,并將庫文件交給Java程序員。
|- 最后,Java程序員在Java程序中導入庫文件,然后調用native方法。
在Java程序執行的時候,若在某個類中調用了native方法,則虛擬機會通過JNI來轉調用庫文件中的C語言代碼。提示:C代碼最終是在Linux進程中執行的,而不是在虛擬機中。
問題:在Android中可執行的文件,在Linux中一定可以執行嗎?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。