前言
目前的Android開發(fā),在很多公司不再是純粹的Java層開發(fā)署穗,更多的會與C++結合芯义,把一些重要的方和行為以及一些私密性質(zhì)的東西放在C++中,一般遇到多人開發(fā)的時候早龟,通常的做法是在Android項目中放入C++的動態(tài)庫(.so文件)惫霸。不過呢,有些時候葱弟,當我們Java開發(fā)人員也想在AS中調(diào)用C++代碼怎么辦壹店?
正文
概念
什么是NDK?
定義:Native Development Kit芝加,是Android的一種開發(fā)工具包
作用:快速開發(fā)C
茫打、 C++
的動態(tài)庫,并自動將so
和應用一起打包成 APK
即可通過 NDK
在 Android
中 使用 JNI
與本地代碼(如C妖混、C++)交互
優(yōu)點:
- 運行效率高
- 代碼安全性高
- 跨平臺
什么是JNI老赤?
定義:Java Native Interface,
作用:通過JNI能使java調(diào)用c++
什么是CMake制市?
定義:允許開發(fā)者編寫一種平臺無關的 CMakeList.txt 文件來定制整個編譯流程抬旺,然后再根據(jù)目標用戶的平臺進一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程祥楣。從而做到“Write once, run everywhere”开财。
實踐
創(chuàng)建NDK項目
? 前提:確認當前的NDK環(huán)境是否正常汉柒,AS版本是否支持創(chuàng)建NDK項目(我的AS版本是3.2.1)
-
新建項目工程
如上圖所示,當創(chuàng)建項目時责鳍,會出現(xiàn)<1><2>兩個選項碾褂,因為要做NDK開發(fā),所以<1>需要進行勾選處理历葛,然后點擊Next
按鈕
單擊完Next
按鈕之后就會出現(xiàn)如上界面正塌,勾選相應選項,并單擊Finish
按鈕
C++ Standard
指定編譯庫的環(huán)境恤溶,其中Toolchain Default使用的是默認的CMake環(huán)境乓诽;C++ 11也就是C++環(huán)境。兩種環(huán)境都可以編庫
Exceptions Support
如果選中復選框咒程,則表示當前項目支持C++異常處理鸠天,如果支持,在項目Module級別的build.gradle
文件中會增加一個標識 -fexceptions
到cppFlags
屬性中帐姻,并且在so庫構建時稠集,gradle會把該屬性值傳遞給CMake進行構建。
Runtime Type Information Support
同理饥瓷,選中復選框巍杈,項目支持RTTI,屬性cppFlags
增加標識-frtti
進入項目工程中扛伍,我們進入build.gradle
查看一下筷畦,因為在上一步Exceptions Support選項進行了勾選,所以會出現(xiàn)如上圖所示的<1>中的內(nèi)容刺洒,同時鳖宾,項目工程中會自動幫我們創(chuàng)建CMakeLists.txt
文件,并會在gradle文件中出現(xiàn)如上圖<2>所示內(nèi)容逆航,點擊CMakeList.txt
文件
AS在我們創(chuàng)建C++支持的項目時鼎文,會自動幫我們創(chuàng)建一個案例,生成一個叫native-lib
動態(tài)庫因俐,關于CMake的命令行以及CMakelists文件的編輯拇惋,可以查看網(wǎng)上的教程
如上面兩張圖所示,這是系統(tǒng)自帶的一個案例抹剩,可以先運行一下撑帖,看看是不是能夠正常使用,當能正常使用后澳眷,那就可以把這個案例刪除了胡嘿,開始我們新的旅程
-
修改項目
修改native庫的名稱,并修改CMakeLists文件配置
創(chuàng)建loadLibrary的調(diào)用類
創(chuàng)建JNI的接口實現(xiàn)文件
Java調(diào)用C++方法
-
如下圖所示,在JNITest類中新建init的native方法
-
在對應的cpp文件中實現(xiàn)init方法钳踊,并對其做實現(xiàn)衷敌,如下圖所示
Java注冊C++回調(diào)接口
-
注冊接口
實現(xiàn)接口,如下圖所示勿侯,使用showLog的方法