日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

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

 

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

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

目錄(?)[+]

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

前言

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

工具安裝

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

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

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吧。

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

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

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

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)注冊的方式,動態(tài)注冊的方式代碼同傳統(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文件中我們需要注意的是下面這三個地方。兩個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。
還記得傳統(tǒng)JNI方式中嗎?我們使用了ndk -build來編譯C/C++文件為so文件,對于使用過第三方庫的開發(fā)者來說,對so肯定不陌生。我們只能使用別人給的so文件,而無法看到C/C++源碼,更別說去修改了。但是在這里我們好像一直沒看到so文件的影子,那么,我們安裝運(yùn)行的apk中,有對應(yīng)的so文件嗎?如果想驗(yàn)證一下apk是否有so文件,我們可以使用 APK Analyzer:

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

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

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

CMake編譯so文件

在Android Studio的Terminal中輸入cmake,會提示:

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

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

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


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

  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兩種開發(fā)NDK的方法,它們在目錄結(jié)構(gòu)和Gradle上有所區(qū)別,下面我們將分別介紹目錄區(qū)別和Gradle配置的區(qū)別。
一、目錄結(jié)構(gòu)
傳統(tǒng)JNI
這里寫圖片描述
CMake
這里寫圖片描述

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

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

CMake
這里寫圖片描述

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

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

  1. android.useDeprecatedNdk=true  

否則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)目呢?

Tips: 在配置好NDK的前提下。且各種地方的配置均不再贅述。如Android.mk中如何配置、CMakeLists.txt文件中的配置、各個地方的統(tǒ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)錯。

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多