Android Studio NDK開發入門


從Android Studio 1.3 Beta1開始,就支持了NDK,我目前使用的版本是1.5.首先強調幾點。

1.必須安裝NDK並配置好環境變量(和配置JDK環境變量如出一轍:新建NDK_HOME我的變量值為D:\android-sdk-windows\ndk-bundle

在Path變量最后加上;%NDK_HOME%)

2.目前的NDK只支持gradle2.5,版本高了或低了都不行(后面還會說到)

接下來我通過實際建立一個工程賴演示NDK在Android Studio中的用法。我會一步一步的來,方便大家學習。

我們首先向平時一樣建立一個空的項目模板,修改設置,設置Gradle版本為2.5


接下來我們需要將根目錄下的gradle修改為實驗性的gradle如下所示:

// 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-experimental:0.2.0'

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

因為需要gradle2.5的支持,我們需要需要將gradle/gradle-wrapper.properties中的版本修改為2.5,如下所示:

#Wed Oct 21 11:34:03 PDT 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip
然后到了最容易出錯的地方: 修改原來的app/build.gradle,如下所示:

apply plugin: 'com.android.model.application'//這里加上.model
//在android{......}外面加上一層model{},
// 將android{......}中的buildTypes移動到android{}外面,但在model{}里面。
//對buildTypes做一些修改
//在android{}里面添加一個task.withType(JavaCompile){......}
//在model{}里面添加一個android.ndk{......}
//刪除dependencies{......}中的testCompile 'junit:junit:4.12'
//最后要注意等於號要一一對應,不要漏寫
model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.3"

        defaultConfig.with {
            applicationId = "com.ndkexample"
            minSdkVersion.apiLevel = 14
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
        task.withType(JavaCompile) {
            //指定編譯JDK版本
            sourceCompatibility = JavaVersion.VERSION_1_7  targetCompatibility = JavaVersion.VERSION_1_7  }
    }
    android.ndk {
        moduleName = "ndkexample"//這個是將來生成的so文件的名稱,可任意取
        ldLibs += "log"//引入打印日志信息的包
        //支持armeabi,armeabi-v7a,x86三個平台
        abiFilters += "armeabi"
        abiFilters += "armeabi-v7a"
        abiFilters += "x86"
    }
    android.buildTypes {
        release {
            minifyEnabled false
            proguardFiles += file('proguard-rules.pro')
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    /*testCompile 'junit:junit:4.12'*///這一行刪去
    compile 'com.android.support:appcompat-v7:23.4.0'
}

此處可以編譯一下,看看是否出錯,如果出錯請仔細核對是否字符錯誤或包名沒有改成你自己的。

據Google官網上說 在官網上說,因為 NDK 還是實驗版,不得已才讓用戶自己改代碼,他們會逐漸讓這些東西自動化。

在app/src/main文件夾上點右鍵,在彈出菜單中選擇“New”、“Folder”、“JNI Folder”,按提示進行。
有一個“Change Folder Location”選項,不需要勾選,因為jni文件夾采用默認的位置(在main文件夾中)就行。然后main目錄下會出現jni文件夾。


新建一個MyExample的類(與MainActivity在同一目錄下),加載jni庫,聲明native方法

package com.ndkexample;

public class MyExample {
    static {
        System.loadLibrary("ndkexample");
    }
    public native void myLog();//打印日志信息的函數
}
此時你的myLog方法還是紅色的, 在上面按alt+enter生成c層的方法。
添加一個打印日志的方法_android_log_write(......);

#include <jni.h>
#include "android/log.h"
JNIEXPORT void JNICALL
Java_com_ndkexample_MyExample_myLog(JNIEnv *env, jobject instance) {
    // TODO  __android_log_write(ANDROID_LOG_ERROR,"MainActivity","This is my first ndkexample!");

}
尤其不要忘記引入頭文件log.h

之后clean project會在jni目錄生成對應的頭文件


然后在java層進行調用

package com.ndkexample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyExample myExample=new MyExample();
        myExample.myLog();
    }
}

編譯運行可以看到日志信息被打印出來

06-22 20:36:25.984 31550-31550/? I/art: Late-enabling -Xcheck:jni
06-22 20:36:26.029 31550-31558/? I/art: Debugger is no longer active
06-22 20:36:26.057 31550-31550/? I/HwCust: Constructor found for class android.app.HwCustHwWallpaperManagerImpl
06-22 20:36:26.104 31550-31550/? I/HwCust: Constructor found for class android.widget.HwCustTextViewImpl
06-22 20:36:26.109 31550-31550/? I/HwCust: Constructor found for class android.widget.HwCustTextViewImpl
06-22 20:36:26.114 31550-31550/? E/MainActivity: This is my first ndkexample!
06-22 20:36:26.175 31550-31630/? I/OpenGLRenderer: Initialized EGL, version 1.4

至此成功。
如果遇到問題無法解決可以咨詢我的QQ:1925554595




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM