Android Studio2.2 CMAKE高效NDK開發(fā)
![]() 轉(zhuǎn)自:http://www./pro/html/201611/76734.html前言
之前,每次需要邊寫C++代碼的時候,我的內(nèi)心都是拒絕的。 工具安裝
Android Studio升級到2.2之后,我們可以先配置好NDK開發(fā)的一些所需工具,如圖,在SDK Tools中勾選安裝CMake、LLDB、NDK。
Android Studio自帶DEMO了解CMAKE
Android Studio升級到2.2版本之后,在創(chuàng)建新的project時,界面上多了一個Include C++ Support的選項(xiàng)。勾選它之后將會創(chuàng)建一個默認(rèn)的C++與JAVA混編的Demo程序。就讓我們先來看看這個官方標(biāo)準(zhǔn)Demo吧。
File -> New -> New Project,在如下界面中勾選Include C++ Support,然后一路 Next,直到 Finish 為止即可。 Gradle中也有兩處不同: java代碼:
從native-lib.cpp的代碼中我們能看到它使用的是靜態(tài)注冊的方式,動態(tài)注冊的方式代碼同傳統(tǒng)JNI。
CMakeLists.txt文件中我們需要注意的是下面這三個地方。兩個library的名字(需一致)以及一個cpp文件的路徑,彼此需要對應(yīng)一致,當(dāng)我們自己定義library以及自己創(chuàng)建cpp文件時需要對應(yīng)修改。 運(yùn)行代碼,就能看到效果,調(diào)用了C++方法在界面上顯示了Hello from C++字符串。這就是CMake方式進(jìn)行NDK開發(fā)的Demo。 ![]()
但是我個人目前更關(guān)注的問題是C++代碼自動補(bǔ)全提示的功能,當(dāng)在cpp文件中寫代碼時,里面不再是一大片的紅色,輸入若干個字母的時候,也能給出提示了,簡直叼渣天,至于原因…我就不清楚了,為什么在這里就有這個強(qiáng)大的功能了呢?哪位大神能解釋下… CMake編譯so文件
在Android Studio的Terminal中輸入cmake,會提示:
需要在下載配置好CMake的環(huán)境變量,若沒這個問題可跳過這個步驟。在如下網(wǎng)址中下載好對應(yīng)的文件: 下載zip包后,解壓縮。然后將cmake.exe所在的路徑,添加到path環(huán)境變量中。cmake就成為有效命令了。 在CMakeLists.txt文件上級目錄下執(zhí)行cmake .命令,報(bào)錯,暫未解決:
待完成 CMake和傳統(tǒng) JNI在目錄結(jié)構(gòu)和配置文件上的區(qū)別
現(xiàn)在我們有了CMake和傳統(tǒng)JNI兩種開發(fā)NDK的方法,它們在目錄結(jié)構(gòu)和Gradle上有所區(qū)別,下面我們將分別介紹目錄區(qū)別和Gradle配置的區(qū)別。 這兩種方式在目錄上的區(qū)別就是兩點(diǎn): 二、Gradle CMake 事實(shí)上,我們在使用傳統(tǒng)JNI方式的時候,上面的兩處地方我們都省略了,也不會造成什么異常(若Android.mk存放位置在其他地方則需要配置)。CMake方式中第一處也可省略,但是第二處不能省略(同樣,位置路徑要寫對),因?yàn)闆]有它將無法Build生成.externalNativeBuild文件夾。 另外,傳統(tǒng)JNI開發(fā)還需要在項(xiàng)目根目錄下的gradle.properties文件中配置
否則Build項(xiàng)目的時候會報(bào)錯。 CMake的優(yōu)勢
可以直接的在C/C++代碼中加入斷點(diǎn),進(jìn)行調(diào)試 java引用的C/C++中的方法,可以直接ctrl+左鍵進(jìn)入 對于include的頭文件或者庫,也可以直接進(jìn)入 不需要配置命令行操作,手動的生成頭文件,不需要配置android.useDeprecatedNdk=true屬性 普通Android項(xiàng)目轉(zhuǎn)NDK開發(fā)項(xiàng)目
我們之前說了,在創(chuàng)建新project時若勾選了Include C++ Support選項(xiàng)(需Android Studio版本不低于2.2),則該項(xiàng)目就已經(jīng)是一個NDK開發(fā)項(xiàng)目了。那么,若項(xiàng)目已經(jīng)存在,該如何再轉(zhuǎn)為NDK開發(fā)項(xiàng)目呢?
傳統(tǒng)JNI方式,在NDK開發(fā) 從入門到放棄(一:基本流程入門了解)中我們了解過: 新建jni目錄,寫好C/C++代碼。靜態(tài)注冊JNI時我們使用了javah -jni對JAVA類進(jìn)行操作自動生成了jni目錄以及對應(yīng)的頭文件(事實(shí)上,當(dāng)我們有一定經(jīng)驗(yàn)后可以自己寫,而不再需要使用該輔助命令來保證不寫錯,另外動態(tài)注冊也是一個很值得提倡的方式),然后根據(jù)頭文件寫了C/C++代碼。但在動態(tài)注冊JNI時我們可以自己先創(chuàng)建好jni目錄且寫好C/C++代碼。 在jni目錄下創(chuàng)建且配置好Android.mk和Application.mk兩個文件。 build.gradle文件中根據(jù)情況進(jìn)行配置,可不進(jìn)行配置使用默認(rèn)值。 通過ndk-build操作,我們能得到對應(yīng)的so文件,放置在相應(yīng)位置,java代碼中即可調(diào)用C/C++代碼,運(yùn)行程序。回顧前面提到的CMake方式的NDK開發(fā),我們得到如下步驟: 新建cpp目錄,寫好C/C++代碼。 創(chuàng)建且配置CMakeLists.txt文件。 build.gradle文件中根據(jù)情況進(jìn)行配置,CMakeLists.txt文件的路徑必須配置。 java代碼中即可調(diào)用C/C++代碼,運(yùn)行程序。 project的build.gradle文件中,gradle版本不能低于2.2,否則會報(bào)錯。
|
|