android studio 配置ndk環(huán)境 利用jni創(chuàng)建demo

本篇文章用來介紹最新的android studio使用ndk工程的轉(zhuǎn)換
所有操作設(shè)置來自官方文檔约巷,如有更新請參考官方文檔
http://tools.android.com/tech-docs/new-build-system/gradle-experimental

環(huán)境說明

  • mac os 10.11.2

  • android studio 2.0 Beta5

  • ndk r9d

  • gradle-2.10-all.zip

  • gradle-experimental:0.6.0-beta5

  • android studio(以后簡稱as) 在1.3 Beta1版本引入NDK支持独郎,
    請確保你的as已有安裝ndk support,驗(yàn)證方法 Preference...-> 搜索ndk
    結(jié)果如下圖所示

Step 1

創(chuàng)建一個(gè)empty工程備用氓癌,用來加入ndk支持, 并將項(xiàng)目視圖Android切換為Project.
如果已經(jīng)下載ndk贫橙,直接指定目錄,否則下載ndk環(huán)境

  • 下載設(shè)置ndk環(huán)境
    //圖片

  • 指定ndk目錄
    //圖片

Step 2

  • 修改gradle版本
    修改在項(xiàng)目文件夾下的gradle/wrapper/gradle-wrapper.properties
#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip

我這里用的是目前最新版的 https://services.gradle.org/distributions/gradle-2.10-all.zip

  • 修改gradle編譯工具的版本
    在項(xiàng)目下的build.gradle文件中更改gradle版本疲迂,注意是項(xiàng)目下的build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle-experimental:0.6.0-beta5'

        // 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
}

這里的build工具使用gradle-experimental尤蒿,因?yàn)槟壳皀dk加入還是只有實(shí)驗(yàn)版本才支持
我這里用的是最新的gradle-experimental:0.6.0-beta5
更新gradle設(shè)置可能需要下載新的文件腰池,天朝網(wǎng)絡(luò)可能被墻忙芒,請確保可以科學(xué)上網(wǎng)

<blockquote>
** gradle 和 gradle編譯工具 版本依賴的問題 **
注意 gradle編譯工具的版本對 gradle版本有兼容依賴的關(guān)系, 反則沒有奏属。
也就是說 比如最新的gradle-experimental:0.6.0-beta5 只有g(shù)radle-2.10-all.zip才能適用甘桑。
但我用最新的gradle-2.10-all.zip歹叮,使用低版本的gradle-experimental:0.2.0沒有影響咆耿,所以這點(diǎn)需要注意爹橱。
</blockquote>

Step 3

  • 修改app的build.gradle 或者 library的build.gradle

目前工程中只有app,修改它的build.gradle文件DSL寫法
不同版本gradle編譯工具的DSL寫法不同慰技,這里用的是最新版本的0.6.0-beta5

如果是以前版本寫法可以參考官方 https://sites.google.com/a/android.com/tools/tech-docs/new-build-system/gradle-experimental/0-4-0

修改之前的代碼:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.example.android.tang.androidstudiojnidemoforndk10"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
}

修改后的代碼:

apply plugin: "com.android.model.application"

model {
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"

        defaultConfig {
            applicationId "com.example.android.tang.androidstudiojnidemoforndk10"
            minSdkVersion.apiLevel 15
            targetSdkVersion.apiLevel 23
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles.add(file("proguard-rules.pro"))
            }
        }

        sources {
            main {
                java {
                    source {
                        srcDir "src"
                    }
                }
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
}
  • DSL和上一個(gè)版本相比的改變:
  1. 用com.android.model.application代替com.android.application
  2. 如果創(chuàng)建aarlibrary用com.android.model.library代替com.android.library
  3. 配置用model { } 塊包裝起來
  4. 添加元素用add方法

Step 4 引入NDK

  • 加入ndk編譯module
    在app目錄下的build.gradle 加入
ndk {                       
    moduleName "native"         //指定生成的lib,比如此時(shí)生成native.so
}

之后為:

model {
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"
        ndk {                       
            moduleName "native"         
        }
    }
}
  • 加入JNI目錄

在目錄app/src/main下創(chuàng)建jni目錄艾帐,然后修改build.gradle 新增Source Set:

sources {
    main {
        jni {
            source {
                srcDir "src"
            }
        }
    }
}

Step 5 代碼中生成JNI代碼

在activity中加載module native盆偿,加入本地方法test()

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    static {
        System.loadLibrary("native");
    }

    public native String test();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Log.i("####",test());
    }
}

代碼提示test()方法,自動生成jni代碼

//圖片

編譯運(yùn)行捎稚,搞定求橄!

代碼在: https://github.com/tangfuhao/AndroidStudioJNIDemoForNDK10

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谈撒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛆楞,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裆悄,死亡現(xiàn)場離奇詭異光稼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)艾君,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門冰垄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逝薪,你說我怎么就攤上這事蝴罪。” “怎么了感局?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵暂衡,是天一觀的道長。 經(jīng)常有香客問我撑毛,道長唧领,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任胯杭,我火速辦了婚禮做个,結(jié)果婚禮上滚局,老公的妹妹穿的比我還像新娘。我一直安慰自己藤肢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布省骂。 她就那樣靜靜地躺著,像睡著了一般怠惶。 火紅的嫁衣襯著肌膚如雪略贮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天览妖,我揣著相機(jī)與錄音揽祥,去河邊找鬼。 笑死府树,一個(gè)胖子當(dāng)著我的面吹牛料按,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播载矿,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼闷盔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牡整?” 一聲冷哼從身側(cè)響起溺拱,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤盟迟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后攒菠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辖众,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年戏阅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啤它。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡离赫,死狀恐怖塌碌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翎猛,我是刑警寧澤接剩,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站疫稿,受9級特大地震影響桐汤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怔毛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一拣度、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抗果,春花似錦、人聲如沸日麸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗡综。三九已至,卻和暖如春察净,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氢卡。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工异吻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诀浪。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓雷猪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親求摇。 傳聞我的和親對象是個(gè)殘疾皇子殊者,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容