2016年2月27日 星期六

Android 開發筆記 - 在 Android Studio 環境上使用 NDK (JNI) @ Mac OS X 10.11.3

上一次把玩已經是 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.gradlehttps://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 裡定義的名字。

沒有留言:

張貼留言