




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第12章AndroidNDK編程12.1JNI與NDK簡介12.2NDK開發環境12.3NDK簡單示例本章總結
12.1JNI與NDK簡介
2.1.1JNI簡介JNI(JavaNativeInterface),即Java原生接口,通過JNI可以在Java代碼中調用C/C++等語言的代碼,也可以在C/C++代碼中調用Java代碼。Java與C/C++通信框架如圖12.1所示。此處需要注意的是:JNI是Java調用Native語言的一種特性,是屬于Java的,與Android無直接關系。
圖12.1Java與C/C++通信框架
Java具備跨平臺的特點,導致了Java與本地代碼交互的能力非常弱,而采用JNI之后,Java與本地代碼交互的能力就會大大增強。除此之外,許多基于JNI的標準庫以及相關的API可以供Java程序員使用,提高開發的效率。JNI框架允許Native層語言與Java層語言雙向交互,給開發帶來了極大的優勢。
接下來了解一下JNI的實現步驟,具體如下所示。
(1)編寫帶有Native方法的Java類(即需要調用的本地方法);
(2)使用javac命令編譯所編寫的Java類(得到.class文件);
(3)使用javah+Java類名生成擴展名為h的頭文件(.h文件);
(4)用C/C++實現Java中聲明的Native方法;
(5)將C/C++編寫的文件生成動態鏈接庫(.so文件);
(6)通過Java命令執行Java程序,最終實現Java調用本地代碼。
12.1.2NDK簡介
NDK(NativeDevelopmentKit)是Android的一個開發工具包,與Java并無直接關系。它主要是用來快速開發C、C++的動態庫,并自動將.so庫文件和應用一起打包成APK。主要在Android的場景下使用JNI時會用到NDK。
NDK具有如下的特點:
1.性能方面
(1)運行效率高。在開發要求高性能的需求中,采用C/C++更加有效率,如使用本地代碼(C/C++)執行算法,能大大提高算法的執行效率。
(2)代碼安全性高。Java是半解釋型語言,容易被反匯編后得到源代碼,而本地有些代碼類型(如C/C++)則不會,能提高系統的安全性。
2.功能方面
功能拓展性好,可方便地使用其他開發語言的開源庫,除了Java的開源庫,還可以使用開發語言(C/C++)的開源庫。
3.使用方面
易于代碼復用和移植,用本地代碼(如C/C++)開發的代碼不僅可在Android中使用,還可以嵌入其他類型平臺上使用。
除上述特點之外,讀者還需注意NDK提供的庫比較有限,僅用于處理算法效率和敏感的問題,另外NDK還提供了交叉編譯器,用于生成特定的CPU平臺動態庫。
接下來了解一下NDK的基本使用步驟,具體如下:
(1)配置好AndroidNDK開發環境;
(2)創建Android項目,并關聯NDK;
(3)在項目中聲明所需要調用的Native方法;
(4)使用C/C++實現在Android項目中聲明的Native方法;
(5)通過ndk–bulid命令編譯產生.so庫文件;
(6)編譯AndroidStudio工程,從而實現Android和本地代碼的交互。
12.1.3JNI與NDK的關系
12.1.1節和12.1.2節講述了JNI和NDK的概念、特點及使用步驟,讀者對二者有了基本的認識,但是可能還是有許多讀者學完之后仍不清楚兩者之間的關系,下面通過表格的形式讓讀者對JNI與NDK之間的關系有一個比較直觀的認識,如表12.1所示。
12.2NDK開發環境
首先下載并安裝CMake和NDK,在AndroidStudio主界面點擊File→Settings…→SystemSettings→AndroidSDK→SDKTools,選中NDK和CMake(如果有LLDB的話也可以一并選中安裝),點擊Apply進行下載安裝,下載安裝完成后,最右側的Status欄中的內容會由Notinstalled變為Installed,如圖12.2所示。
圖12.2NDK及CMake下載安裝
NDK是Android原生開發套件,主要是為了在Android應用中使用C和C++代碼,前面已經詳細介紹過NDK。讀者在此處需要注意的是CMake,它是一款外部編譯工具,可與Gradle搭配使用來編譯原生庫(如果讀者只計劃使用ndk-build,則可以不需要該組件)。另外上面提到的LLDB是AndroidStudio用于調試原生代碼的調試程序,默認情況下,LLDB將與AndroidStudio一起安裝。
下載安裝完NDK和CMake后,需要配置一下NDK環境,在AndroidStudio主界面上點擊File→ProjectStructure…→SDKLocation,在AndroidNDKlocation部分,選擇NDK默認的安裝路徑,點擊OK按鈕即可,如圖12.3所示。
圖12.3AndroidNDKlocation
讀者也可以在下載完成時通過perties文件查看SDK和NDK在電腦上的保存路徑,如圖12.4所示。并在電腦上找到NDK對應的路徑,將其復制到上述AndroidNDKlocation部分也可。
圖12.4perties文件內容
如果沒有環境變量,那么再設置系統環境變量,右鍵點擊計算機→屬性→高級系統設置→環境變量→系統變量,新建一個系統變量,變量名為NDK_ROOT,變量值為NDK的路徑,然后點擊確定按鈕即可,如圖12.5所示。
圖12.5新建系統變量
然后再在Path變量路徑下添加NDK_ROOT變量,直接輸入%NDK_ROOT%即可(注意%NDK_ROOT%后邊需要加上分號),如圖12.6所示。
圖12.6編輯Path系統變量
最后,測試一下環境變量是否配置成功,進入cmd命令行,輸入ndk-build回車,如果出現如圖12.7所示的結果,則說明環境變量配置成功。
圖12.7測試環境變量
接下來測試一下NDK開發環境是否配置成功。首先新建一個AndroidStudio工程,然后在SelectProjectTemplate界面中選擇NativeC++,如圖12.8所示。
圖12.8選擇工程模板
點擊Next按鈕進入工程配置界面,將Name修改為NDKTest,如圖12.9所示。
圖12.9configureproject
點擊Next按鈕,進入到如圖12.10所示的界面,在C++Standard部分選擇默認CMake設置的ToolchainDefault選項。
圖12.10CustomizeC++Support界面
點擊Finish按鈕,完成新項目的創建。打開Project面板,選擇Android視圖。大家可以發現,NDKTest工程比之前的Android工程多了一個cpp文件夾,如圖12.11所示。圖12.11NDKTest工程目錄結構
至此,大家對一個最簡單的NDK工程有了初步的認識。接下來運行程序,運行結果如圖12.12所示。大家可以看到App主界面中顯示一段文字“HellofromC++”,表明在工程的Java程序中成功獲取到C++程序中的數據,實現了二者的交互。圖12.12NDKTest運行結果
最后總結一下從編譯到運行示例的流程。
(1)?Gradle:調用外部構建腳本,也就是CMakeLists.txt。
(2)?CMake:根據構建腳本的指令去編譯一個C++源文件,也就是native-lib.cpp,將編譯后的文件放進共享對象庫中,并將其命名為libnative-lib.so,然后Gradle將其打包到APK中。
(3)在運行期間,Android中的MainActivity會調用System.loadLibrary()方法,加載nativelibrary。而這個庫的原生函數:stringFromJNI(),就可以為App所用了。
(4)?Android中的MainActivity通過publicnativeStringstringFromJNI()的JNI接口調用stringFromJNI()函數,然后返回“HellofromC++”,并在主界面中更新TextView的顯示。
如果讀者想驗證一下Gradle是否將nativelibrary打包進了APK文件,可以借助AndroidStudio上的APKAnalyzer。依次選擇Build→AnalyzeAPK→app/build/outputs/apk/debug→app-debug.apk→ok,在AnalyzeAPK窗口中,選擇lib/x86(筆者的ABI為x86,Android目前支持七種ABI,所以讀者的ABI可能是armeabi、armeabi-v7a等剩余的六種,讀者根據自己平臺的情況進行選擇),就可以看見libnative-lib.so文件,結果如圖12.13所示。
圖12.13APKAnalyzer
12.3NDK簡單示例
首先創建一個不引進C++庫的demo,選擇EmptyActivity,然后點擊Next按鈕,修改工程名為NDKDemo,點擊Finish按鈕。工程結構如圖12.14所示。這是一個大家最熟悉、最簡單的Android工程,沒有與NDK相關的文件。
圖12.14NDKDemo工程結構
接下來要在該工程的基礎上進行NDK開發。首先需要為該程序部署C/C++環境以及Cmake編譯環境。將Android工程切換到Project結構視圖下,依次點擊app→src→main,在main文件夾下新建cpp文件夾,并在cpp文件夾下新建CMakeLists.txt,如圖12.15所示。
圖12.15cpp及CMakeLists.txt
然后點擊File→linkC++ProjectwithGradle,在彈出來的對話框中,BuildSystem選擇CMake,ProjectPath選擇CMakeLists.txt的路徑,點擊OK,如圖12.16所示。此處需要注意:CMakeLists.txt文件一定要放在cpp文件夾下面,否則編譯會報錯。
圖12.16CMakeLists.txt文件路徑
配置完CMakeLists.txt后,發現工程報錯:Causedby:org.gradle.api.InvalidUserDataException:NDKnotconfigured.DownloaditwithSDKmanager.PreferredNDKversionis'20.0.5594570'.Log:E:\ASProject\NDKDemo\app\.cxx\ndk_locator_record.json。可以看到錯誤是由于沒有配置NDK引起的,此時要為工程配置NDK環境。在12.2節講過NDK環境的配置方法,即在AndroidStudio主界面點擊File→ProjectStructure…→SDKLocation,在AndroidNDKlocation部分,選擇NDK默認的安裝路徑,點擊OK按鈕即可。配置完成后,工程便不再報錯,此時app文件夾下又多了個.cxx文件夾,且文件夾下的ndk_locator_record.json文件中包含NDK配置路徑,具體如圖12.17所示。
圖12.17app文件夾
然后可以查看一下app文件夾下的build.gradle文件,里邊已經自動生成CMakeLists.txt文件路徑,如圖12.18所示。圖12.18gradle文件中CMakeLists.txt文件路徑
配置完后,運行程序,結果如圖12.19所示。
在主界面的文本框中隨機輸入5個數,比如:25、12、66、52、11,然后點擊冒泡排序按鈕,結果如圖12.20所示。圖12.19程序主界面圖12.20冒泡排序結果
NDK還有許多高級的用法,本書只是講了最基本的用法,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025租賃合同的承租人負有些義務
- 2025大學生村官聘用合同書模板
- 2025廣告設計制作合同協議書范本
- 2025企業勞動合同范本模板
- 2025混凝土澆筑工程承包合同
- 《2025合同終止協議 管理資料》
- 金融投資的風險評估計劃
- 高危區域的保安工作挑戰與應對計劃
- 財務策略與公司整體戰略結合計劃
- 財務業務工作目標設定計劃
- 預防便秘的健康宣教內容
- 2024年蜀道集團招聘筆試參考題庫含答案解析
- 初中語文九年級下冊第四單元作業設計單元質量檢測作業
- 2022輔警考試《道路交通安全法》基礎知識題庫(帶答案)
- 液壓仿真技術的現狀及發展趨勢
- nrf2and通路在藥物治療中的作用
- 高考語文復習:詩歌語言鑒賞
- 泌尿外科常見疾病診療指南
- 學校開展“躺平式”教師專項整治工作實施方案心得體會2篇
- 急救物品藥品管理制度-課件
- 蘇教版三年級下冊口算題大全(全冊完整14份)
評論
0/150
提交評論