Android遊戲開發實踐(1)之NDK與JNI開發03

Android遊戲開發實踐(1)之NDK與JNI開發03

前面已經分享了兩篇有關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以上的版本。還得安裝NDKCMakeLLDB等工具。
在AndroidStudio中選擇Tools->Android->SDK Manager->SDK Tools。如圖:
數據結構

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

二、 建立一個支持C/C++的項目

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

2.1 新建項目

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

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


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


建立完項目,會比通常的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腳本中,添加了以下代碼,

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文件。

三、AndroidStudio與Gradle

上面提到,將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/

3.1 project/build.gradle

該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:執行相關的清理任務。

3.2 project/settings.gradle

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

include ':app'

若是,你的項目中有多個模塊時,能夠依次添加到該文件中。例如:

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

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

3.3 module/build.gradle

該文件位於當前模塊的根目錄下,一般狀況下,該文件只對當前模塊起做用。例如:

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)。上面的主要兩部分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

技術交流QQ羣:528655025
做者:AlphaGL
出處:http://www.cnblogs.com/alphagl/ 版權全部,歡迎保留原文連接進行轉載 :)

相關文章
相關標籤/搜索