上一次把玩已經是 2011 年的事了 :P 這次再練一下。首先,我已經安裝好 Android Studio 1.5.1 版本。接著先下載 Android NDK:
Android Studio -> SDK Manager -> Android SDK -> SDK Tools -> 勾選 Android NDK (1.0.0) -> 進行下載。下載完後可以看到 Project -> local.properties 已經自動埋好 ndk.dir=/path/ndk 資訊啦,若一開始 local.properties 有 ndk.dir 資料,或許會造成問題。
接著,依照
http://tools.android.com/tech-docs/new-build-system/gradle-experimental#TOC-Ndk-Integration 簡介在 build.gradle (Module: app) 添加這一段:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
ndk {
moduleName "native"
}
}
}
Sync Now 後,立馬得到: Error:(23, 0) Plugin with id 'com.android.model.application' not found.
找了很久,最後參考 googlesample 範例(隨便挑一個,例如:
https://github.com/googlesamples/android-ndk/blob/master/MoreTeapots/app/build.gradle 和
https://github.com/googlesamples/android-ndk/blob/master/MoreTeapots/build.gradle),做了很多動作:
先到 build.gradle (Project) 更新:
dependencies {
//classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'com.android.tools.build:gradle-experimental:0.4.0'
}
再把 build.gradle (Module: app) 整段更新:
/*
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "YourAppPackageName"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
// */
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig.with {
applicationId = "YourAppPackageName"
minSdkVersion.apiLevel = 15
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-rules.pro'))
}
}
android.ndk {
moduleName = "native"
}
}
按下 Sync Now 後,終於沒問題了,離 JNI 又更進一步了!
再點擊 app 目錄 => 按右鍵 New -> Folder -> JNI Folder ,再到 jni 目錄添加一下檔案 -> New -> C/C++ Source file -> 此例用 main.cpp/main.h 為例。
如此一來,只要 Build APK 後,跑去 unzip app-debug-unaligned.apk 後,可以看到以下的目錄結構:
$ tree lib/
lib/
├── arm64-v8a
│ ├── gdb.setup
│ ├── gdbserver
│ └── libnative.so
├── armeabi
│ ├── gdb.setup
│ ├── gdbserver
│ └── libnative.so
├── armeabi-v7a
│ ├── gdb.setup
│ ├── gdbserver
│ └── libnative.so
├── mips
│ ├── gdb.setup
│ ├── gdbserver
│ └── libnative.so
├── mips64
│ ├── gdb.setup
│ ├── gdbserver
│ └── libnative.so
├── x86
│ ├── gdb.setup
│ ├── gdbserver
│ └── libnative.so
└── x86_64
├── gdb.setup
├── gdbserver
└── libnative.so
其中 libnative.so 則是跟 android.ndk 裡定義的名字。