一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android Studio2.2 CMAKE高效NDK開(kāi)發(fā)

 點(diǎn)點(diǎn)滴滴 2017-01-23

 

Android Studio2.2 CMAKE高效NDK開(kāi)發(fā)

標(biāo)簽: ndkandroid studiojnicmake
 92人閱讀 評(píng)論(0) 收藏 舉報(bào)
 分類(lèi):

目錄(?)[+]

轉(zhuǎn)自:http://www./pro/html/201611/76734.html

前言

之前,每次需要邊寫(xiě)C++代碼的時(shí)候,我的內(nèi)心都是拒絕的。
1. 它沒(méi)有代碼提示?。?!這意味著我們必須自己手動(dòng)敲出所有的代碼,對(duì)于一個(gè)新手來(lái)說(shuō),要一個(gè)字母都不錯(cuò)且大小寫(xiě)也要正確,甚至要記得住所有的jni函數(shù)等,真是太折磨人了…平時(shí)寫(xiě)Java代碼的時(shí)候都是寫(xiě)幾個(gè)字母會(huì)出來(lái)一大堆提示然后選擇的,這樣還有一個(gè)好處就是很多時(shí)候我們不知道有那些函數(shù),但是我們可以通過(guò)obj.,然后就可以看到它有哪些方法函數(shù)了。
2. 很多地方會(huì)顯示為紅色,就像是錯(cuò)誤提示的那種,當(dāng)然,如果沒(méi)錯(cuò)的話還是能編譯運(yùn)行的,但是如果像編寫(xiě)java代碼一樣,寫(xiě)錯(cuò)的地方才給我紅色顯示不是更好嗎?
這兩個(gè)問(wèn)題可折磨死我這個(gè)強(qiáng)迫癥了…在網(wǎng)上百度了很久如何能夠使用Android Studio編寫(xiě)C++代碼時(shí)有代碼提示自動(dòng)補(bǔ)全功能,但是一直沒(méi)有找到有效的(不使用CMake的情況下,若有人知道,麻煩告知)。好在一次偶然的機(jī)會(huì),在網(wǎng)上看到在 Android Studio 2.2 中愉快地使用 C/C++這篇文章,看到上面說(shuō)Android Studio2.2版本完善了對(duì)C/C++的支持,還提及到CMAKE,趕緊把Android Studio從2.0版本升級(jí)到了2.2版本,按照介紹新建了一個(gè)NDK工程,發(fā)現(xiàn)里面居然有我夢(mèng)寐以求的C++代碼自動(dòng)補(bǔ)全提示?。?!喜大普奔?。?!
趕緊了解學(xué)習(xí)下Android Studio2.2版本提供的CMAKE方式。打算以后都使用這種方式了,別的不說(shuō),就沖可以有C++代碼自動(dòng)補(bǔ)全提示這個(gè)功能我就愛(ài)上它了。

工具安裝

Android Studio升級(jí)到2.2之后,我們可以先配置好NDK開(kāi)發(fā)的一些所需工具,如圖,在SDK Tools中勾選安裝CMake、LLDB、NDK。
這里寫(xiě)圖片描述

CMake: 外部構(gòu)建工具。如果你準(zhǔn)備只使用 ndk-build 的話,可以不使用它。
LLDB: Android Studio上面調(diào)試本地代碼的工具。

Android Studio自帶DEMO了解CMAKE

Android Studio升級(jí)到2.2版本之后,在創(chuàng)建新的project時(shí),界面上多了一個(gè)Include C++ Support的選項(xiàng)。勾選它之后將會(huì)創(chuàng)建一個(gè)默認(rèn)的C++與JAVA混編的Demo程序。就讓我們先來(lái)看看這個(gè)官方標(biāo)準(zhǔn)Demo吧。

開(kāi)始之前最好先下載好NDK,見(jiàn)NDK開(kāi)發(fā) 從入門(mén)到放棄(一:基本流程入門(mén)了解),即在Project Structure界面Android NDK location處下載或選擇正確的路徑?;蛘呤褂蒙戏教峁┑墓ぞ甙惭b方法來(lái)進(jìn)行下載。否則,創(chuàng)建的新project也會(huì)報(bào)錯(cuò),需要配置好后clean。

File -> New -> New Project,在如下界面中勾選Include C++ Support,然后一路 Next,直到 Finish 為止即可。
這里寫(xiě)圖片描述
項(xiàng)目打開(kāi)后我們查看目錄結(jié)構(gòu),與常規(guī)項(xiàng)目不同的是多了.externalNativeBuild文件夾、cpp文件夾、CMakeLists.txt文件,如下圖:
這里寫(xiě)圖片描述
這三個(gè)東西都是NDK部分:
1. .externalNativeBuild文件夾:cmake編譯好的文件, 顯示支持的各種硬件等信息。系統(tǒng)生成。
2. cpp文件夾:存放C/C++代碼文件,native-lib.cpp文件是該Demo中自帶的,可更改。需要自己編寫(xiě)。
3. CMakeLists.txt文件:CMake腳本配置的文件。需要自己配置編寫(xiě)。

Gradle中也有兩處不同:
這里寫(xiě)圖片描述

java代碼:

  1. public class MainActivity extends AppCompatActivity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.   
  8.     // Example of a call to a native method  
  9.     TextView tv = (TextView) findViewById(R.id.sample_text);  
  10.     tv.setText(stringFromJNI());  
  11.     }  
  12.   
  13.     /** 
  14.      * A native method that is implemented by the 'native-lib' native library, 
  15.      * which is packaged with this application. 
  16.      */  
  17.     public native String stringFromJNI();  
  18.   
  19.     // Used to load the 'native-lib' library on application startup.  
  20.     static {  
  21.         System.loadLibrary('native-lib');  
  22.     }  
  23. }  

從native-lib.cpp的代碼中我們能看到它使用的是靜態(tài)注冊(cè)的方式,動(dòng)態(tài)注冊(cè)的方式代碼同傳統(tǒng)JNI。

  1. #include <jni.h>  
  2. #include <string>  
  3.   
  4. extern 'C'  
  5. jstring  
  6. Java_com_example_person_myapplication_MainActivity_stringFromJNI(  
  7.         JNIEnv* env,  
  8.         jobject /* this */) {  
  9.     std::string hello = 'Hello from C++';  
  10.     return env->NewStringUTF(hello.c_str());  
  11. }  

CMakeLists.txt文件中我們需要注意的是下面這三個(gè)地方。兩個(gè)library的名字(需一致)以及一個(gè)cpp文件的路徑,彼此需要對(duì)應(yīng)一致,當(dāng)我們自己定義library以及自己創(chuàng)建cpp文件時(shí)需要對(duì)應(yīng)修改。
這里寫(xiě)圖片描述

運(yùn)行代碼,就能看到效果,調(diào)用了C++方法在界面上顯示了Hello from C++字符串。這就是CMake方式進(jìn)行NDK開(kāi)發(fā)的Demo。
還記得傳統(tǒng)JNI方式中嗎?我們使用了ndk -build來(lái)編譯C/C++文件為so文件,對(duì)于使用過(guò)第三方庫(kù)的開(kāi)發(fā)者來(lái)說(shuō),對(duì)so肯定不陌生。我們只能使用別人給的so文件,而無(wú)法看到C/C++源碼,更別說(shuō)去修改了。但是在這里我們好像一直沒(méi)看到so文件的影子,那么,我們安裝運(yùn)行的apk中,有對(duì)應(yīng)的so文件嗎?如果想驗(yàn)證一下apk是否有so文件,我們可以使用 APK Analyzer:

選擇 Build > Analyze APK。 選擇 apk,并點(diǎn)擊 OK。 如下圖,在 APK Analyzer 窗口中,選擇 lib/x86/,可以看見(jiàn) libnative-lib.so 。
這里寫(xiě)圖片描述

Tips:Instant Run 并不兼容使用了 native code 的項(xiàng)目。Android Studio 會(huì)自動(dòng)禁止 Instant Run 功能。

但是我個(gè)人目前更關(guān)注的問(wèn)題是C++代碼自動(dòng)補(bǔ)全提示的功能,當(dāng)在cpp文件中寫(xiě)代碼時(shí),里面不再是一大片的紅色,輸入若干個(gè)字母的時(shí)候,也能給出提示了,簡(jiǎn)直叼渣天,至于原因…我就不清楚了,為什么在這里就有這個(gè)強(qiáng)大的功能了呢?哪位大神能解釋下…
這里寫(xiě)圖片描述

CMake編譯so文件

在Android Studio的Terminal中輸入cmake,會(huì)提示:

  1. 'cmake' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件。       

需要在下載配置好CMake的環(huán)境變量,若沒(méi)這個(gè)問(wèn)題可跳過(guò)這個(gè)步驟。在如下網(wǎng)址中下載好對(duì)應(yīng)的文件:
https:///download/
這里寫(xiě)圖片描述

下載zip包后,解壓縮。然后將cmake.exe所在的路徑,添加到path環(huán)境變量中。cmake就成為有效命令了。


在CMakeLists.txt文件上級(jí)目錄下執(zhí)行cmake .命令,報(bào)錯(cuò),暫未解決:

  1. -- Building for: NMake Makefiles  
  2. -- The C compiler identification is unknown  
  3. -- The CXX compiler identification is unknown  
  4. CMake Error in CMakeLists.txt:  
  5.   The CMAKE_C_COMPILER:  
  6.   
  7.     cl  
  8.   
  9.   is not a full path and was not found in the PATH.  
  10.   
  11.   To use the NMake generator with Visual C++, cmake must be run from a shell  
  12.   that can use the compiler cl from the command line.  This environment is  
  13.   unable to invoke the cl compiler.  To fix this problem, run cmake from the  
  14.   Visual Studio Command Prompt (vcvarsall.bat).  
  15.   
  16.   Tell CMake where to find the compiler by setting either the environment  
  17.   variable 'CC' or the CMake cache entry CMAKE_C_COMPILER to the full path to  
  18.   the compiler, or to the compiler name if it is in the PATH.  
  19.   
  20.   
  21. CMake Error in CMakeLists.txt:  
  22.   The CMAKE_CXX_COMPILER:  
  23.   
  24.     cl  
  25.   
  26.   is not a full path and was not found in the PATH.  
  27.   
  28.   To use the NMake generator with Visual C++, cmake must be run from a shell  
  29.   that can use the compiler cl from the command line.  This environment is  
  30.   unable to invoke the cl compiler.  To fix this problem, run cmake from the  
  31.   Visual Studio Command Prompt (vcvarsall.bat).  
  32.   
  33.   Tell CMake where to find the compiler by setting either the environment  
  34.   variable 'CXX' or the CMake cache entry CMAKE_CXX_COMPILER to the full path  
  35.   to the compiler, or to the compiler name if it is in the PATH.  
  36.   
  37.   
  38. -- Configuring incomplete, errors occurred!  
  39. See also 'E:/AndroidDemo_XY/app/CMakeFiles/CMakeOutput.log'.  
  40. See also 'E:/AndroidDemo_XY/app/CMakeFiles/CMakeError.log'.  

待完成


CMake和傳統(tǒng) JNI在目錄結(jié)構(gòu)和配置文件上的區(qū)別

現(xiàn)在我們有了CMake和傳統(tǒng)JNI兩種開(kāi)發(fā)NDK的方法,它們?cè)谀夸浗Y(jié)構(gòu)和Gradle上有所區(qū)別,下面我們將分別介紹目錄區(qū)別和Gradle配置的區(qū)別。
一、目錄結(jié)構(gòu)
傳統(tǒng)JNI
這里寫(xiě)圖片描述
CMake
這里寫(xiě)圖片描述

這兩種方式在目錄上的區(qū)別就是兩點(diǎn):
1. 以前的jni目錄改成cpp,名字更換了,下面還是存放C/C++文件。
2. 之前對(duì)C/C++文件的編譯配置Android.mk、Application.mk文件放在jni目錄下,現(xiàn)在改成CMakeLists.txt文件。(事實(shí)上這些文件的位置是可任意存放的,只需要配置好就行。但最好還是按照默認(rèn)習(xí)慣放置。)

二、Gradle
傳統(tǒng)JNI
這里寫(xiě)圖片描述

CMake
這里寫(xiě)圖片描述

事實(shí)上,我們?cè)谑褂脗鹘y(tǒng)JNI方式的時(shí)候,上面的兩處地方我們都省略了,也不會(huì)造成什么異常(若Android.mk存放位置在其他地方則需要配置)。CMake方式中第一處也可省略,但是第二處不能省略(同樣,位置路徑要寫(xiě)對(duì)),因?yàn)闆](méi)有它將無(wú)法Build生成.externalNativeBuild文件夾。

另外,傳統(tǒng)JNI開(kāi)發(fā)還需要在項(xiàng)目根目錄下的gradle.properties文件中配置

  1. android.useDeprecatedNdk=true  

否則Build項(xiàng)目的時(shí)候會(huì)報(bào)錯(cuò)。

CMake的優(yōu)勢(shì)

可以直接的在C/C++代碼中加入斷點(diǎn),進(jìn)行調(diào)試 java引用的C/C++中的方法,可以直接ctrl+左鍵進(jìn)入 對(duì)于include的頭文件或者庫(kù),也可以直接進(jìn)入 不需要配置命令行操作,手動(dòng)的生成頭文件,不需要配置android.useDeprecatedNdk=true屬性

普通Android項(xiàng)目轉(zhuǎn)NDK開(kāi)發(fā)項(xiàng)目

我們之前說(shuō)了,在創(chuàng)建新project時(shí)若勾選了Include C++ Support選項(xiàng)(需Android Studio版本不低于2.2),則該項(xiàng)目就已經(jīng)是一個(gè)NDK開(kāi)發(fā)項(xiàng)目了。那么,若項(xiàng)目已經(jīng)存在,該如何再轉(zhuǎn)為NDK開(kāi)發(fā)項(xiàng)目呢?

Tips: 在配置好NDK的前提下。且各種地方的配置均不再贅述。如Android.mk中如何配置、CMakeLists.txt文件中的配置、各個(gè)地方的統(tǒng)一等。

傳統(tǒng)JNI方式,在NDK開(kāi)發(fā) 從入門(mén)到放棄(一:基本流程入門(mén)了解)中我們了解過(guò):

新建jni目錄,寫(xiě)好C/C++代碼。靜態(tài)注冊(cè)JNI時(shí)我們使用了javah -jni對(duì)JAVA類(lèi)進(jìn)行操作自動(dòng)生成了jni目錄以及對(duì)應(yīng)的頭文件(事實(shí)上,當(dāng)我們有一定經(jīng)驗(yàn)后可以自己寫(xiě),而不再需要使用該輔助命令來(lái)保證不寫(xiě)錯(cuò),另外動(dòng)態(tài)注冊(cè)也是一個(gè)很值得提倡的方式),然后根據(jù)頭文件寫(xiě)了C/C++代碼。但在動(dòng)態(tài)注冊(cè)JNI時(shí)我們可以自己先創(chuàng)建好jni目錄且寫(xiě)好C/C++代碼。 在jni目錄下創(chuàng)建且配置好Android.mk和Application.mk兩個(gè)文件。 build.gradle文件中根據(jù)情況進(jìn)行配置,可不進(jìn)行配置使用默認(rèn)值。 通過(guò)ndk-build操作,我們能得到對(duì)應(yīng)的so文件,放置在相應(yīng)位置,java代碼中即可調(diào)用C/C++代碼,運(yùn)行程序。

回顧前面提到的CMake方式的NDK開(kāi)發(fā),我們得到如下步驟:

新建cpp目錄,寫(xiě)好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,否則會(huì)報(bào)錯(cuò)。

Error: Could not find method externalNativeBuild() for arguments
[build_e8k5d0w74qu1ajxjrrcr9snog$_run_closure1$_closure6@1398219d] on
project ‘:app’ of type org.gradle.api.Project.。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    国产目拍亚洲精品区一区| 国产一级内片内射免费看 | 日本不卡在线视频中文国产| 福利专区 久久精品午夜| 九九热这里只有免费精品| 中文文精品字幕一区二区 | 久久国产人妻一区二区免费| 夜夜嗨激情五月天精品| 日本在线 一区 二区| 国产精品免费自拍视频| 五月激情综合在线视频| 国产日韩在线一二三区| 久久中文字人妻熟女小妇| 夫妻性生活一级黄色录像| 国内胖女人做爰视频有没有| 国产精品白丝久久av| 国产韩国日本精品视频| 视频一区日韩经典中文字幕| 精品国自产拍天天青青草原| 一区二区不卡免费观看免费| 日韩美成人免费在线视频| 国产伦精品一区二区三区精品视频| 中文字幕亚洲精品乱码加勒比| 欧美日韩少妇精品专区性色| 粉嫩内射av一区二区| 好吊色免费在线观看视频| 自拍偷拍一区二区三区| 中国美女偷拍福利视频| 国产午夜福利不卡片在线观看| 色鬼综合久久鬼色88| 91亚洲熟女少妇在线观看| 欧美日韩国产午夜福利| 国产日韩欧美专区一区| 亚洲一区二区精品免费视频| 成人精品视频一区二区在线观看| 中文字幕91在线观看| 日本人妻丰满熟妇久久| 99一级特黄色性生活片| 亚洲午夜精品视频观看| 亚洲精品国男人在线视频| 国产免费黄片一区二区|