前面已經分享了兩篇有關Android平臺NDK與JNI開發相關的內容。如下列舉前面兩篇的連接地址,感興趣的能夠再回顧下。那麼,這篇繼續這個小專題,主要分享下AndroidStudio下的NDK與JNI開發的相關操做以及簡述下CMake的使用。最後,會以一個實例來結束這個小專題的分享,那個,就放在最後一篇吧。html
做者:AlphaGL。版權全部,歡迎保留原文連接進行轉載 :)java
傳送門:
Android遊戲開發實踐(1)之NDK與JNI開發01
Android遊戲開發實踐(1)之NDK與JNI開發02android
本文的目錄以下:api
要讓AndroidStudio支持NDK開發,除了需安裝AndroidStudio2.2以上的版本。還得安裝NDK
、CMake
、LLDB
等工具。
在AndroidStudio中選擇Tools->Android->SDK Manager->SDK Tools。如圖:
數據結構
這裏簡單介紹下:
NDK
:是Android開發本地C/C++代碼的一套工具集。
CMake
:一套跨平臺的構建工具,能夠Gradle腳本配合使用來構建你的本地庫。在AndroidStudio中,Google默認和推薦使用CMake進行編譯,固然,你仍然能夠繼續使用ndk-build
來編譯你的本地代碼。注意:32位的操做系統可能會裝不上。
LLDB
: 一種調試器,Android Studio中可使用它來調試本地代碼。閉包
這裏所說的建立一個支持C/C++的項目,能夠理解爲建立一個NDK項目,但又包含兩種方式,分別是從零開始新建一個支持C/C++開發的項目和在原有項目的基礎上讓它支持C/C++開發。下面對這兩種方式分別進行說明下。app
若是安裝好了,上面介紹的幾個工具(主要是NDK),而且AndroidStudio2.2以上的版本,新建項目的時候,會看到這個選項。如圖:
建立項目時,勾選C++支持。dom
項目中所用的C++標準能夠選擇默認或者支持C++11,以及是否支持異常和rtti
特性。eclipse
建立完項目,會比通常的Android項目多出cpp目錄以及CMakeLists.txt的文件。工具
這裏指定NDK的路徑。即,上面環境搭建裏安裝的ndk,會下載到AndroidStudio根目錄下的ndk-bundle
文件夾中。
make一下當前新建立的工程,默認會在build/cmake/debug/obj/下生成相應的動態庫。
要讓現有的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腳本中,添加了以下代碼,
android { //指定使用CMake編譯---------------- externalNativeBuild { cmake { path 'CMakeLists.txt' } } //-------------------------------- }
打開新建的CMakeLists.txt
文件,輸入以下代碼:
cmake_minimum_required (VERSION 3.4.1) add_library (hellojni SHARED src/main/cpp/hellojni.cpp)
分別指定CMake要求的版本,add_library中參數分別是,指定生成庫的名稱,生成庫的類型,默認是靜態塊,即:·a
,源碼的路徑。這裏實例只簡單介紹下CMake的用法,後續會有專門一篇來介紹下CMake更多高級的用法。
以上完畢,在make一下當前工程,或者rebuild一下,不出意外會在build/intermediates/cmake/debug
路徑下生成各類libhellojni.so
文件。
上面提到,將CMakeLists.txt關聯到項目中,會在build.gradle腳本中,添加一段代碼便可。可能剛接觸AndroidStudio(特別是使用其它IDE開發的,例如:eclipse等)對Gradle不是很瞭解,這裏就拋磚引玉下,簡要講述下gradle腳本的使用。
首先,AndroidStudio是基於IntelliJ IDEA的IDE,在AndroidStudio中新建立的Android工程都形如以下結構:
MyApp ├── build.gradle ├── settings.gradle └── app ├── build.gradle ├── build ├── libs └── src └── main ├── java │ └── com.package.myapp └── res ├── drawable ├── layout └── 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/
該build.gradle位於項目的根目錄,該文件是定義在這個工程下的全部模塊的公共屬性。默認以下:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
如下只是從表象說明下,但實質是Groovy相應的數據結構(閉包,Map等)調用相應方法來動態控制整個構建過程。有關Groovy的討論能夠看看3.3 module/build.gradle。
buildscript
:定義了全局的相關屬性。
repositories
:定義了遠程倉庫的源,即表明你的依賴包的來源。這裏將jcenter()做爲倉庫。
dependencies
:定義了android gradle plugin的版本。
allprojects
:能夠用來定義各個模塊的默認屬性,你能夠不只僅侷限於默認的配置,將來你能夠本身創造tasks在allprojects方法體內,這些tasks將會在全部模塊中可見。
task clean
:執行相關的清理任務。
該文件位於項目根目錄下,也是項目的全局配置文件,該文件的內容以下:
include ':app'
若是,你的項目中有多個模塊時,能夠依次添加到該文件中。例如:
include ':app',':librarys:Mylibrary'
即在項目根目錄下的librarys目錄裏有個Mylibrary庫工程。
該文件位於當前模塊的根目錄下,一般狀況下,該文件只對當前模塊起做用。例如:
apply plugin: 'com.android.application' android { compileSdkVersion 24 buildToolsVersion "24.0.2" defaultConfig { applicationId "com.alphagl.test" minSdkVersion 19 targetSdkVersion 24 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } externalNativeBuild { cmake { path 'CMakeLists.txt' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:24.2.1' }
以上內容,要完全弄清楚,得深究下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)。上面的主要兩部分android和dependencies,分別對應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
技術交流QQ羣:528655025
做者:AlphaGL
出處:http://www.cnblogs.com/alphagl/ 版權全部,歡迎保留原文連接進行轉載 :)