本文的目錄如下:

1、 環境搭建

要讓AndroidStudio支持NDK開發,除了需安裝AndroidStudio2.2以上的版本。還得安裝NDKCMakeLLDB等工具。
在AndroidStudio中選擇Tools->Android->SDK Manager->SDK Tools。如圖:

這里簡單介紹下:
NDK:是Android開發本地C/C++代碼的一套工具集。
CMake:一套跨平臺的構建工具,可以Gradle腳本配合使用來構建你的本地庫。在AndroidStudio中,Google默認和推薦使用CMake進行編譯,當然,你仍然可以繼續使用ndk-build來編譯你的本地代碼。注意:32位的操作系統可能會裝不上。
LLDB: 一種調試器,Android Studio中可以使用它來調試本地代碼。

2、 創建一個支持C/C++的項目

這里所說的創建一個支持C/C++的項目,可以理解為創建一個NDK項目,但又包含兩種方式,分別是從零開始新建一個支持C/C++開發的項目和在原有項目的基礎上讓它支持C/C++開發。下面對這兩種方式分別進行說明下。

2.1 新建項目

如果安裝好了,上面介紹的幾個工具(主要是NDK),并且AndroidStudio2.2以上的版本,新建項目的時候,會看到這個選項。如圖:

創建項目時,勾選C++支持。


項目中所用的C++標準可以選擇默認或者支持C++11,以及是否支持異常和rtti特性。


創建完項目,會比一般的Android項目多出cpp目錄以及CMakeLists.txt的文件。


這里指定NDK的路徑。即,上面環境搭建里安裝的ndk,會下載到AndroidStudio根目錄下的ndk-bundle文件夾中。


make一下當前新創建的工程,默認會在build/cmake/debug/obj/下生成相應的動態庫。

2.2 擴展現有項目

要讓現有的Android項目能調用本地C/C++代碼或者支持C/C++開發,只需要在原來項目的基礎稍加修改即可。步驟如下:

切換到project視圖,打開module即上圖的app模塊,在src/main下右鍵New->Directory,填寫一個文件名,例如:cpp


在剛建的cpp路徑下,右鍵New->C/C++ Source File,輸入文件名,若要一并生成相應的.h文件,勾選Create an associated header選項即可。注意,后面可以指定源文件的后綴,例如:.cxx,.hxx


在module的根目錄即上圖的app根目錄,右鍵New->File,輸入CMakeLists.txt。注意:文件名必須為CMakeLists.txt


在module的根目錄即上圖的app根目錄,選擇Link C++ Project with Gradle,然后,找到剛創建的CMakeLists.txt文件。將CMakeLists.txt關聯到項目中。注意,Build System仍可以選擇ndk-build方式進行編譯。

當然,這步操作也可以手動完成,相當于在當前module下的build.gradle腳本中,添加了如下代碼,

XML/HTML代碼
  1. android {  
  2.     //指定使用CMake編譯----------------  
  3.     externalNativeBuild {  
  4.         cmake {  
  5.             path 'CMakeLists.txt'  
  6.         }  
  7.     }  
  8.     //--------------------------------  
  9. }   
打開新建的CMakeLists.txt文件,輸入如下代碼:
XML/HTML代碼
  1. cmake_minimum_required (VERSION 3.4.1)  
  2.   
  3. add_library (hellojni SHARED src/main/cpp/hellojni.cpp)  
分別指定CMake要求的版本,add_library中參數分別是,指定生成庫的名稱,生成庫的類型,默認是靜態塊,即:·a,源碼的路徑。這里實例只簡單介紹下CMake的用法,后續會有專門一篇來介紹下CMake更多高級的用法。

以上完畢,在make一下當前工程,或者rebuild一下,不出意外會在build/intermediates/cmake/debug路徑下生成各種libhellojni.so文件。

3、AndroidStudio與Gradle

上面提到,將CMakeLists.txt關聯到項目中,會在build.gradle腳本中,添加一段代碼即可。可能剛接觸AndroidStudio(特別是使用其它IDE開發的,例如:eclipse等)對Gradle不是很了解,這里就拋磚引玉下,簡要講述下gradle腳本的使用。

首先,AndroidStudio是基于IntelliJ IDEA的IDE,在AndroidStudio中新創建的Android工程都形如如下結構:

XML/HTML代碼
  1. MyApp    
  2. ├── build.gradle    
  3. ├── settings.gradle    
  4. └── app    
  5.     ├── build.gradle    
  6.     ├── build    
  7.     ├── libs    
  8.     └── src    
  9.         └── main    
  10.             ├── java    
  11.             │   └── com.package.myapp    
  12.             └── res    
  13.                 ├── drawable    
  14.                 ├── layout    
  15.                 └── etc.    
MyApp是項目名,app是模塊名,一個項目下可以包含若干個模塊。這與eclipse的結構不同,對應到eclipse中,app就相當于項目名,MyApp相當于工作空間。或者類似于VS中解決方案與項目的關系。以上目錄結構關系,并不與實際磁盤上的目錄結構對應。可以看到,在項目根目錄下以及模塊目錄下,分別有三個.gradle文件。下面,就分別介紹這三個gradle腳本的用途,當然這里主要說的是在AndroidStudio下的gradle的相關使用。

在AndroidStudio中android項目是基于gradle進行構建的(eclipse中可以使用ant來做類似的工作),而gradle是一種基于Groovy語言的DSL(domain-specific language,領域專用語言),而Groovy又是一種基于JVM的動態語言。所以,有java基礎的話,理解Groovy會更容易。有關Gradle文檔可以看看這個:https://docs.gradle.org/current/dsl/

3.1 project/build.gradle

該build.gradle位于項目的根目錄,該文件是定義在這個工程下的所有模塊的公共屬性。默認如下:

XML/HTML代碼
  1. // Top-level build file where you can add configuration options common to all sub-projects/modules.  
  2.   
  3. buildscript {  
  4.     repositories {  
  5.         jcenter()  
  6.     }  
  7.     dependencies {  
  8.         classpath 'com.android.tools.build:gradle:2.2.3'  
  9.   
  10.         // NOTE: Do not place your application dependencies here; they belong  
  11.         // in the individual module build.gradle files  
  12.     }  
  13. }  
  14.   
  15. allprojects {  
  16.     repositories {  
  17.         jcenter()  
  18.     }  
  19. }  
  20.   
  21. task clean(type: Delete) {  
  22.     delete rootProject.buildDir  
  23. }  
以下只是從表象說明下,但實質是Groovy相應的數據結構(閉包,Map等)調用相應方法來動態控制整個構建過程。有關Groovy的討論可以看看3.3 module/build.gradle
buildscript:定義了全局的相關屬性。
repositories:定義了遠程倉庫的源,即代表你的依賴包的來源。這里將jcenter()作為倉庫。
dependencies:定義了android gradle plugin的版本。
allprojects:可以用來定義各個模塊的默認屬性,你可以不僅僅局限于默認的配置,未來你可以自己創造tasks在allprojects方法體內,這些tasks將會在所有模塊中可見。
task clean:執行相關的清理任務。
3.2 project/settings.gradle

該文件位于項目根目錄下,也是項目的全局配置文件,該文件的內容如下:

include ':app'

如果,你的項目中有多個模塊時,可以依次添加到該文件中。例如:

include ':app',':librarys:Mylibrary'

即在項目根目錄下的librarys目錄里有個Mylibrary庫工程。

3.3 module/build.gradle

該文件位于當前模塊的根目錄下,通常情況下,該文件只對當前模塊起作用。例如:

XML/HTML代碼
  1. apply plugin: 'com.android.application'  
  2.   
  3. android {  
  4.     compileSdkVersion 24  
  5.     buildToolsVersion "24.0.2"  
  6.     defaultConfig {  
  7.         applicationId "com.alphagl.test"  
  8.         minSdkVersion 19  
  9.         targetSdkVersion 24  
  10.         versionCode 1  
  11.         versionName "1.0"  
  12.     }  
  13.     buildTypes {  
  14.         release {  
  15.             minifyEnabled false  
  16.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  17.         }  
  18.     }  
  19.   
  20.     externalNativeBuild {  
  21.         cmake {  
  22.             path 'CMakeLists.txt'  
  23.         }  
  24.     }  
  25. }  
  26.   
  27. dependencies {  
  28.     compile fileTree(dir: 'libs', include: ['*.jar'])  
  29.     compile 'com.android.support:appcompat-v7:24.2.1'  
  30. }  
以上內容,要徹底弄清楚,得深究下Groovy語法。這里,只淺析下。
apply plugin: 'com.android.application':在Groovy中的調用為project.apply([plugin: 'com.android.application']),plugin: 'com.android.application會被作為一個Map參數傳遞給apply的方法。這里是要將該模塊構建為一個應用,若要將模塊構建庫形式,可以傳參為plugin: 'com.android.library

在Groovy中花括號包含的部分稱為一個閉包(Closure)。上面的主要兩部分androiddependencies,分別對應project中的方法,而參數是相應的閉包結構。通過上面的結構,可以知道該閉包結構還有閉包嵌套和相應的方法。
android:該方法包含了所有的Android屬性,而唯一必須包含屬性為compileSdkVersion和buildToolsVersion。
compileSdkVersion:該方法包含編譯該app時候,使用到的api版本。
buildToolsVersion:該方法包含構建工具的版本號。
defaultConfig:該方法包含app的核心屬性,該屬性會覆蓋在AndroidManifest.xml中的對應屬性。
applicationId:該方法定義的屬性會覆蓋AndroidManifest文件中的包名package name屬性。
minSdkVersion:該方法定義的屬性表示最小支持api版本。同AndroidManifest中對應的屬性。
targetSdkVersion:該方法定義的屬性表示目標平臺api版本。同AndroidManifest中對應的屬性。
buildTypes:該方法定義了構建不同版本的app相關的屬性。
release:配置release版本相關的屬性。
minifyEnabled:是否進行混淆。
proguardFiles:定義混淆文件的位置。通過getDefaultProguardFile方法獲取。
externalNativeBuild:native使用cmake編譯。
dependencies:gradle默認的屬性之一,定義了所有的依賴包。
compile:編譯相應依賴的jar包。組織名,包名,版本號的結構。

以上只簡單的列舉了下部分屬性,對gradle腳本有初步的了解。當然,Groovy在java領域還是有很多應用的。感興趣的,可以深入了解下。

Groovy文檔:
Groovy-Documentation


作者:AlphaGL
出處:http://www.cnblogs.com/alphagl/

本文發布:Android開發網
本文地址:http://www.cpbsu.com/android/game/708.html
2017年8月30日
發布:雞啄米 分類:Android游戲開發 瀏覽: 評論:0