android studio 可调试、可查看源码的jni开发环境搭建图文讲解

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 <jni.h>
#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 <methods>;
}
5.爱看英文的给个官方网址,搭建方式跟这个一样http://tools.android.com/tech-docs/new-build-system/gradle-experimental。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值