1. 程式人生 > >Android Studio新增NDK開發能力的兩種方法

Android Studio新增NDK開發能力的兩種方法

第一種方法:新建的專案(new project)的時候使用Include C++ Support選項

第二種方法:使用外掛(Plugin)-- Experimental Plugin

這裡我演示一下,瞭解具體內容請科學上網,去檢視詳情

試驗環境:

java jdk1.8

Android Stduio 2.2.1

gradle 2.14.1

1、新建的專案(new project)的時候使用Include C++ Support選項

新建一個專案,注意是專案(project),不是模組(module)


點多次next,到達這裡


在Android檢視下,能明顯看到多了一個External Build Files,project檢視在app模組(module)的build.gradle的同一目錄


如果你沒選擇空Activity,那麼直接執行即可看到效果,具體程式碼自己找,位置在Activity裡呼叫了native方法,並且有宣告的。

從Project新建的自動幫你生成了一個含c++的app模組(module),再新建專案你會發現新建的module是普通的,並沒有ndk的能力,這裡只是指出能用這種方法而已,並沒有深究過,算是“師傅領進門,修行看個人”吧。其他等待你挖掘啊。

在這個專案內新建的module都可以新增NDK的能力,如圖:


這個需要新增一個CMakeLists.txt這個文字檔案,這個這個具體的定義只有三個東西我寫了好久這個部落格,具體自己去看吧,就是第一個方法的那個連線裡面有了,注意科學上網

2、使用外掛(Plugin)-- Experimental Plugin

這個方法實質就是替換了android studio的gradle的自動構建外掛 (1)目錄結構(Android Studio Project的)和外掛對應的gradle版本

├──APP/

│├──app.iml

│├──build.gradle(二級目錄)

└──SRC /│

├──build.gradle(一級目錄)

├──Gradle /

│└──wrapper /

├──gradle-wrapper.jar│

│└──gradle-wrapper.properties

├──gradle.properties

├──gradlew *

├──gradlew.bat

├──local.properties

├──myapplication.iml

└──settings.gradle


Plugin Version Gradle Version
0.1.0 2.5
0.2.0 2.5
0.3.0-alpha3 2.6
0.4.0 2.8
0.6.0-alpha1 2.8
0.6.0-alpha5 2.10
0.7.0-alpha1 2.10
0.7.0 2.10
0.8.1 2.14.1

這個與你版本不匹配,會自動下載對應的gradle-wrapper

在最新的gradel,會提示你要不要更換為最新的外掛版本(比如上面的2.14.1,原網頁0.7.3,更新之後會替換為0.8.1)

(2)替換android studio自帶的gradel構建工具

這是一級build.gradel修改後的情況,這裡的一級的具體位置請看上面的目錄結構(切換到project檢視就能看出來啦)

// 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.1'//這是android studio的自帶的版本構建工具,雙斜槓註釋掉
        classpath 'com.android.tools.build:gradle-experimental:0.8.1'//這是新新增的
        // 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
}
(3)二級build.gradel的修改比較多。這裡慢慢說

【1】將第一行的應用外掛(apply plugin)修改為替換的外掛應用(apply plugin)

【2】在android節點外層加一個model (這裡不要看錯成module了),與dependencies同級

【3】android節點的defaultConfig的minSdkVersion和targetSdkVersion要追加.apiLevel 

model{android{ defaultConfig{ minSdkVersion..apiLevel ..........}}}

【4】android節點buildTypes節點release

的proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'註釋掉,更改為proguardFiles.add(file("proguard-rules.pro"))

model{android{ buildTypes { release{.......proguardFiles.add(file("proguard-rules.pro"))}}}}

【5】新增ndk節點

ndk {
            moduleName = "native"//名字可以自己起的,成的so名字為libXXX.so  XXX為這個節點裡面的moduleName
        }

apply plugin: 'com.android.model.application'
model {
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.0"
        ndk {
            moduleName = "native"
        }
        defaultConfig {
            applicationId "space.xxhui.dnkjni"
            minSdkVersion.apiLevel 15
            targetSdkVersion.apiLevel 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                proguardFiles.add(file("proguard-rules.pro"))
            }
        }

    }
    android.productFlavors {
        create("arm") {
            ndk.abiFilters.add("armeabi")
        }
//        create("arm7") {
//            ndk.abiFilters.add("armeabi-v7a")
//        }
//        create("arm8") {
//            ndk.abiFilters.add("arm64-v8a")
//        }
//        create("x86") {
//            ndk.abiFilters.add("x86")
//        }
//        create("x86-64") {
//            ndk.abiFilters.add("x86_64")
//        }
//        create("mips") {
//            ndk.abiFilters.add("mips")
//        }
//        create("mips-64") {
//            ndk.abiFilters.add("mips64")
//        }
//        // To include all cpu architectures, leaves abiFilters empty
//        create("all")
    }
//以上的android.productFlavors節點為控制生成什麼平臺的so,畢竟全部生成你的包會很大
}//這是model的結束

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.0'
    testCompile 'junit:junit:4.12'
}
這裡的改動還是很大的,所以慢慢體會吧。配置完成點sync讓gradel重新構建你的project吧

(4)測試NDK是否支援

寫一個類,裡面宣告native方法:

public class NDK {
    static {
        System.loadLibrary("native");//這裡的字串為要生成的.c檔名,要與上面宣告的ndk節點的moduleName名字一樣
    }
    public native String get();
}

在get上面使用快捷鍵alt+enter,然後回車,下圖:



下面是自動生成的native.c的內容:


本來是一個未定義的字元,改為你要返回的字元吧。

native.c是與static初始化塊native名字相同的,不與build.gradle的有關係,但是確保他們都一樣吧

ps:如果你alt+enter不會出現提示,那絕對不是你操作錯了,而是android studio有點傻才不會提示,我是搞了兩天,突然好了,我就呵呵了

程式碼簡潔點吧,直接蓋標題比較快


生成的so的位置並不在lib是,在這裡,看圖把:


效果圖: