Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android studio 可調試、可查看源碼的jni開發環境搭建圖文講解

android studio 可調試、可查看源碼的jni開發環境搭建圖文講解

編輯:關於Android編程

1.環境配置

(溫馨提示,圖片看不清楚的,可以點擊鼠標右鍵,在新選項卡中查看圖片^^)

1)打開studio建立新的工程,打開如下位置,下載紅線所示的ndk及LLDB工具。\

 

2)如下所示對ndk進行設置

\

 

3)替換掉原來的gradle工具,如圖注釋掉上面的,加入下面的代碼。

\

 

4)修改app下面的gradle文件

\

給出完整代碼,仔細辨別

 

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

model { //這一行是新加的,對應上邊的修改,
    /**
     * 這裡要注意一下,如果使用gradle-experimental,參數賦值要使用 = 號,而不是空格,
     * 所以要把原來文件中的空格都用等號去替換;
     * 還有一部分參數使用的函數也與原來不一樣,
     * 實在不能確定的就找出ndk samples中的build.gradle文件對比一下。
     */
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"

        defaultConfig {
            applicationId = "com.ndk.zhang"
            minSdkVersion.apiLevel = 10         //這兩個參數和原來有點不一樣,多了apiLevel
            targetSdkVersion.apiLevel =  23
            versionCode = 1
            versionName = "1.0"

        }

        ndk {       //NDK設置
            moduleName = "test"    //動態庫的名稱
            toolchain = 'clang'     //編譯器,據說這個比gcc要快,沒有這個寫native代碼時沒有自動補全的功能
            CFlags.addAll(['-Wall', '-DHELLO_2'])    //對應gcc中的編譯選項 CFLAGS,方括號內是一個數組,可以有多個值
            CFlags.add("-DHELLO_3")
            //       CFlags += "-DHELLO"         //這種方式在這裡行不通,包括以下的ldFlags, ldLibs 也一樣.
            ldFlags.addAll(["-L../lib"])       //庫文件路徑
            ldLibs.addAll(['log'])             //庫文件名
            stl = "stlport_static"      //指示使用動態庫還是靜態庫
        }

        buildTypes {
            release {
                minifyEnabled = true
                proguardFiles.add(file('proguard-rules.pro'))  //這是把原來的改成這樣的
            }
            debug {
                ndk.debuggable = true  //有這個才會支持調試native 代碼,這個放到release裡一樣能用
            }
        }

        productFlavors { /**  copy過來的,根據不同的平台,會有不同的配置 */
            // for detailed abiFilter descriptions, refer to "Supported ABIs" @
            // https://developer.android.com/ndk/guides/abis.html#sa
            create("arm") {
                ndk.abiFilters.add("armeabi")
            }
            create("arm7") {
                ndk.abiFilters.add("armeabi-v7a")
            }
            create("arm8") {
                ndk.abiFilters.add("arm64-v8a")
            }
            create("x86") {
                ndk.abiFilters.add("x86")
            }
            create("x86-64") {
                ndk.abiFilters.add("x86_64")
            }
            create("mips") {
                ndk.abiFilters.add("mips")
            }
            create("mips-64") {
                ndk.abiFilters.add("mips64")
            }
            // To include all cpu architectures, leaves abiFilters empty
//            create("all")
        }
    }
}   //這個是對就 model{

//android {
//    compileSdkVersion 23
//    buildToolsVersion "23.0.2"
//
//    defaultConfig {
//        applicationId "com.ndk.zhang"
//        minSdkVersion 10
//        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.4.0'
}

5)好了,開發環境搞定了,下面開始寫jni。新建java文件,如圖:

 

\

完整代碼

 

public class Test {
    static {
        System.loadLibrary("test");
    }
    public native void test();
}

 

 

6)新建jni文件夾

\
 

7)這個時候Test.java文件是提示錯誤的,alt+enter出現如下效果

\

 

8)點擊這個Create function ...即可生成.c文件在jni文件夾。打開c文件輸入代碼,結果如圖

\

完整代碼

 

#include 
#include "android/log.h"
JNIEXPORT void JNICALL
Java_com_ndk_zhang_Test_test(JNIEnv *env, jobject instance) {
    __android_log_write(ANDROID_LOG_ERROR,"TAG","TEST");

}

 

 

9)Terminal進入到src/main/java下面
javah -d ../jni -jni com.ndk.zhang.Test即可生成.h文件,如圖

\
 

 

10)debug起來,如果出現如下log說明成功了 \   11)如果想進行調試,很簡單。選擇app-native,然後在c文件中打斷點就可以進行調試了。注意,如果出現手機卡在debug頁面不動的情況,可以點擊sudio的Run->attach debugger to android process就可以了。 \   其它問題慢慢補充,有問題可以留言。   補充 1.發現生成.so文件找不到,網上說到build->intermediates->ndk查找,但是死活找不到,後來發現在build->intermediates->binaries文件下面。 2.生成so文件方法,rebuild project是一種,其實只要跑完debug模式就會有debug版本的so生成,如果進行apk打包操作就會有release版本生成。 3.補充個app下面gradle文件的配置信息。注釋部分刪除掉無影響。而且很多語句也沒用上所以也注釋掉了。
apply plugin: 'com.android.model.application'

model { //這一行是新加的,對應上邊的修改,
    /**
     * 這裡要注意一下,如果使用gradle-experimental,參數賦值要使用 = 號,而不是空格,
     * 所以要把原來文件中的空格都用等號去替換;
     * 還有一部分參數使用的函數也與原來不一樣,
     * 實在不能確定的就找出ndk samples中的build.gradle文件對比一下。
     */
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"

        defaultConfig {
            applicationId = "com.ndk.zhang"
            minSdkVersion.apiLevel = 10         //這兩個參數和原來有點不一樣,多了apiLevel
            targetSdkVersion.apiLevel =  23
            versionCode = 1
            versionName = "1.0"

        }

        ndk {       //NDK設置
            moduleName = "test"    //動態庫的名稱
            toolchain = 'clang'     //編譯器,據說這個比gcc要快,沒有這個寫native代碼時沒有自動補全的功能
//            CFlags.addAll(['-Wall', '-DHELLO_2'])    //對應gcc中的編譯選項 CFLAGS,方括號內是一個數組,可以有多個值
//            CFlags.add("-DHELLO_3")
//            //       CFlags += "-DHELLO"         //這種方式在這裡行不通,包括以下的ldFlags, ldLibs 也一樣.
//            ldFlags.addAll(["-L../lib"])       //庫文件路徑
            ldLibs.addAll(['log'])             //庫文件名
//            stl = "stlport_static"      //指示使用動態庫還是靜態庫
        }

        buildTypes {
            release {
                minifyEnabled = true
                proguardFiles.add(file('proguard-rules.pro'))  //這是把原來的改成這樣的
            }
            debug {
                ndk.debuggable = true  //有這個才會支持調試native 代碼,這個放到release裡一樣能用
            }
        }

        productFlavors { /**  copy過來的,根據不同的平台,會有不同的配置 */
            create("all"){

            }
        }
    }
}
4.針對生成so文件的問題說一下,如果根據補充中2,3步都生成不成功,建議利用補充中第3步文件進行替換,因為我是再改成3中代碼後找到的so文件,目前也不清楚是gradle文件導致的,還是我開始沒仔細看所以沒找到,這裡不再測試,知道的同學麻煩留言告知一下。這裡主要補充一個proguard說明,針對那些對Proguard不熟悉的同學,請在你的Proguard文件中加上如下代碼,此代碼是為了防止你打包的時候被混淆,最後報錯。
-keepclasseswithmembers,allowshrinking class * {
    native ;
}
5.愛看英文的給個官方網址,搭建方式跟這個一樣http://tools.android.com/tech-docs/new-build-system/gradle-experimental。

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved