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是,在這裡,看圖把:
效果圖: