Jni使用基礎(一)之簡單介紹說明
JNI(Java Native Interface,JAVA原生接口)
Jni 是一個協議,用來溝通java代碼和外部的本地代碼(c/c++)相互調用。
為什麼要進行交互?
首先,Java語言提供的類庫無法滿足要求,且在數學運算,實時渲染的遊戲上,音視頻處理等方麵上與C/C++相比效率稍低。
然後,Java語言無法直接操作硬件,C/C++代碼不僅能操作硬件而且還能發揮硬件最佳性能。
接著,使用Java調用本地的C/C++代碼所寫的庫,省去了重複開發的麻煩,並且可以利用很多開源的庫提高程序效率。
把源代碼---->可執行文件
1.編譯
2.鏈接 .exe
3.生成可執行文件
交叉編譯:在一個操作係統的平台下(cpu平台下)去編譯出來能夠在另一個操作係統(cpu平台下運行代碼)。
cygwin:是一個基於插件windows下的linux的模擬器。
在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端定義一些vative方法,並將這些方法以C語言頭文件的方式提供給C程序員。
然後,C程序員使用C語言,來實現Java程序員提供的頭文件中定義的函數。
接著,C程序員將函數打包成一個庫文件,並將庫文件交給Java程序員。
最後,Java程序員在Java程序中導入庫文件,然後調用native方法。
在Java程序執行的時候,若在某個類中調用了native方法,則虛擬機會通過JNI來轉調用庫文件中的C語言代碼。提示:C代碼最終是在Linux進程中執行的,而不是在虛擬機中。
注意:在c語言中調用java,都是使用jni定義好了的接口函數(在ndk的android-ndk-r8-windows\android-ndk-r8\platforms\android-8\arch-arm\usr\include下的jni.h文件);
最後更新:2017-04-02 17:09:25