Android Studio 快速啟動 Android NDK 項目開發(fā)


概述

通過本篇教程曲初,您將學(xué)習(xí)如何使用 Android Studio 輕松啟動 Android NDK 項目開發(fā)。

開發(fā)環(huán)境

創(chuàng)建一個 HelloJni 項目

  • 創(chuàng)建完成如下
  • 配置 Studio 下載安裝 NDK喻喳,如果你之前已經(jīng)單獨(dú)下載過 NDK 也可以在 Project Structure -- SDK Location -- Android NDK location 下去引用校仑,我更推薦如下方式通過 Android SDK Manager 自動安裝,它會將 NDK 放入 /android-sdk/ndk-bundle/
  • 運(yùn)行項目

將JNI構(gòu)建功能添加到HelloJni項目中

Android Studio 通過 Google 開發(fā)的 experimental plugin 支持 native 開發(fā)袱贮,通過這個插件我們可以不用考慮配置麻煩的 Android.mk 等構(gòu)建文件就可以進(jìn)行開發(fā)仿便,我們來將其添加到我們的項目中。
下面是 experimental 插件與 gradle 的版本對應(yīng)表攒巍,詳細(xì)查看官方文檔嗽仪,本教程我們將以 experimental plugin 0.7.3 為例

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.7.3 2.14.1
  • 對應(yīng)的我們先配置項目的 gradle 版本為 gradle2.14.1,下載相應(yīng)版本 gradle 并配置
  • 引用對應(yīng)版本的 experimental 插件柒莉,此處以 0.7.3 版本為例闻坚,打開項目的 build.gradle

替換

classpath 'com.android.tools.build:gradle:2.2.0'

classpath 'com.android.tools.build:gradle-experimental:0.7.3'
  • 打開模塊 的 build.gradle 文件,修改讓它支持 experimental 插件的語法

替換

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.skyrin.hellojni"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
...

apply plugin: 'com.android.model.application'  //<<<

model {  //<<<
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"
        defaultConfig {
            applicationId "com.skyrin.hellojni"
            minSdkVersion.apiLevel 15  //<<<
            targetSdkVersion.apiLevel 25  //<<<
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles.add(file('proguard-android.txt'))  //<<<
            }
        }
    }
}  //<<<
...
  • 點(diǎn)擊 Sync Now 同步項目

現(xiàn)在可以添加 Jni 代碼了

  • 配置模塊的 build.gradle 文件讓它可以創(chuàng)建 hello-jni 動態(tài)鏈接庫也就是 .os 等文件兢孝,然后 Sync 項目
        buildTypes {
            ...
        }
        //添加
        ndk{
            moduleName "hello-jni"
        }
  • 在 MainActivity 中(當(dāng)然你也可以新建一個 JniUtils.class 進(jìn)行封裝)創(chuàng)建 native 方法
    ...
    static {
        System.loadLibrary("hello-jni");
    }

    public native String getStrFromJni();
    ...
  • 點(diǎn)擊上面提示之后 Studio 會自動為我們創(chuàng)建 cpp 目錄以及 .c 文件窿凤,c 文件生成代碼如下
#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_skyrin_hellojni_MainActivity_getStrFromJni(JNIEnv *env, jobject instance) {

    // TODO


    return (*env)->NewStringUTF(env, returnValue);
}

替換其返回值如下

return (*env)->NewStringUTF(env, "Hello Jni!");
  • 調(diào)用 native 函數(shù)
public class MainActivity extends AppCompatActivity {

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

        //調(diào)用jni代碼
        ((TextView)findViewById(R.id.tv_jni)).setText(getStrFromJni());
    }

    static {
        System.loadLibrary("hello-jni");
    }

    public native String getStrFromJni();
}
  • 我們來 Run 一下
  • 用 c 寫個加法函數(shù)試試

java

public native int add(int a,int b);

Jni

JNIEXPORT jint JNICALL
Java_com_skyrin_hellojni_MainActivity_add(JNIEnv *env, jobject instance, jint a, jint b) {

    // TODO
    return a+b;
}

調(diào)用

((TextView)findViewById(R.id.tv_jni)).setText(add(2,3)+"");
  • Run 一下

Congratulations! 你學(xué)會用 NDK 開發(fā)了???(?)??*?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市跨蟹,隨后出現(xiàn)的幾起案子雳殊,更是在濱河造成了極大的恐慌,老刑警劉巖窗轩,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夯秃,死亡現(xiàn)場離奇詭異,居然都是意外死亡痢艺,警方通過查閱死者的電腦和手機(jī)寝并,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腹备,“玉大人衬潦,你說我怎么就攤上這事≈菜郑” “怎么了镀岛?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵弦牡,是天一觀的道長。 經(jīng)常有香客問我漂羊,道長驾锰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任走越,我火速辦了婚禮椭豫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旨指。我一直安慰自己赏酥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布谆构。 她就那樣靜靜地躺著裸扶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搬素。 梳的紋絲不亂的頭發(fā)上呵晨,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音熬尺,去河邊找鬼摸屠。 笑死,一個胖子當(dāng)著我的面吹牛粱哼,可吹牛的內(nèi)容都是我干的餐塘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼皂吮,長吁一口氣:“原來是場噩夢啊……” “哼戒傻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜂筹,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤需纳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后艺挪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體不翩,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年麻裳,在試婚紗的時候發(fā)現(xiàn)自己被綠了口蝠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡津坑,死狀恐怖妙蔗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疆瑰,我是刑警寧澤眉反,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布昙啄,位于F島的核電站,受9級特大地震影響寸五,放射性物質(zhì)發(fā)生泄漏梳凛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一梳杏、第九天 我趴在偏房一處隱蔽的房頂上張望韧拒。 院中可真熱鬧,春花似錦十性、人聲如沸叛溢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拢肆,卻和暖如春减响,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背郭怪。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工支示, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鄙才。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓颂鸿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親攒庵。 傳聞我的和親對象是個殘疾皇子嘴纺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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