美文网首页Android开发感悟AndroidAS
AndroidStudio NDK开发最佳入门实践

AndroidStudio NDK开发最佳入门实践

作者: lavor | 来源:发表于2016-05-19 10:42 被阅读2513次

    AndroidStudio NDK开发最佳入门实践


    网上一些介绍AndroidStudio NDK入门的教程,感觉都不是很完整和全面,也没有告诉初学AndroidStudio NDK的同学们一些需要注意的地方。网上的方法大多需要使用javah命令,使用本文的方法将不再使用该命令了,是不是方便了很多。
    本文所介绍的是在AndroidStudio上搭建最佳的NDK开发环境,给使用NDK的开发人员最大的方便。
    本人AndroidStudio版本2.0。
    本人Gradle版本2.10。

    1. Android NDK开发工具准备


    要进行Android NDK开发,首先要下载Android NDK开发工具。可以在AndroidStudio上面的下载,也可以自己下载好了,然后将NDK的路径设置为自己下载的Android NDK开发工具的路径。Android NDK开发工具下载地址:http://wear.techbrood.com/tools/sdk/ndk/

    2. Gradle的相关配置


    gradle插件不支持NDK(当然用它也可以进行NDK开发,就是非常不方便),我们需要使用gradle-experimental插件。gradle-experimental插件使用的时候与gradle插件稍微有点区别。

    1. 我们来配置Project的build.gradle


    配置Project的build.gradle很简单就是将dependenciesclasspath的值改为对应的gradle-experimental插件。

        dependencies {
            classpath 'com.android.tools.build:gradle-experimental:0.7.0'
        }  
    

    2. 我们来配置Module的build.gradle


    先给出一个我配置的范例,然后说明那些需要注意的。

    apply plugin: 'com.android.model.application'
    
    model {
        android {
            compileSdkVersion = 23
            buildToolsVersion = "23.0.2"
            defaultConfig {
                applicationId "com.lavor.ndklearning"
                minSdkVersion.apiLevel 15
                targetSdkVersion.apiLevel 23
                versionCode 4
                versionName "1.0.1"
            }
        }
        android.ndk {
            moduleName "lavor"
            ldLibs.addAll(['log'])
            cppFlags.add("-std=c++11")
            cppFlags.add("-fexceptions")
            platformVersion 15
            stl 'gnustl_shared'
        }
        android.buildTypes {
            release {
                minifyEnabled = false
                proguardFiles.add(file("proguard-rules.txt"))
            }
        }
    }
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:23.1.1'
        compile 'com.android.support:recyclerview-v7:23.1.1'
        compile 'com.android.support:design:23.1.1'
    }  
    
    • 首先在apply的时候我们引入的插件名称由'com.android.application'变成了'com.android.model.application'
    • 其次,在原来android的外层加入了一个model层次。
    • 再次,原来在android的里面的块,除了defaultConfig外,全部移除android块放入model块中与android并列,并且前面的名字加上android.
    • defaultConfig中还要稍作改动,将minSdkVersion与targetSdkVersion的后面都加上.apiLevel
    • 然后,compileSdkVersion 23buildToolsVersion "23.0.2"改成 compileSdkVersion = 23buildToolsVersion = "23.0.2",中间加上了=
    • 其次,添加上android.ndk块,块中的moduleName表示C/C++代码打包成so文件的名字。
    • 再次,android.buildTypes块中的proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'改成proguardFiles.add(file("proguard-rules.txt"))
    • 最后,注意dependencies块依然在最外层,它不在model块中。

    3. 开始NDK之旅


    • 首先,在Android程序中添加一个native方法:public native String getString();
    • 其次,我们注意到添加的native方法的方法名是红色的,将鼠标移动到方法名上(注意不能是括号里面或者后面),然后按下Alt+Enter快捷键,弹出一些解决的方法建议,点击第一个Create Function...
    • 再次,此时会自动建立一个与java目录同级的jni目录,在jni目录自动建立一个c文件,在c文件中实现刚才的native方法。


    • 然后,稍稍修改一下c文件中实现的native方法。
    JNIEXPORT jstring JNICALL
    Java_com_lavor_ndklearning_MainActivity_getString(JNIEnv *env, jobject instance) {
        // TODO
        return (*env)->NewStringUTF(env, "AndroidStudio NDK开发最佳入门实践");
    }  
    
    • 最后在Android程序中添加上加载so库文件的代码。
           static {
            System.loadLibrary("lavor");
           }  
    

    运行程序后界面如下:

    AndroidStudio NDK开发入门介绍完毕。程序源代码下载地址:https://github.com/lavor-zl/NDKLearning

    注意:gradle的版本不能太低,不然会出错,AndroidStudio版本也不能太低不然可能没有集成C/C++编译器,某些1.7的JDK可能会出错,重新下载一个JDK就好了,并设置JDK的路径。

    相关文章

      网友评论

      • suym:好
      • 875bf4c04935:好久没来了
      • ChangQin:为什么我写的时候alt + enter 没有那个智能提示啊
      • 8a74237892c7:Error:Gradle version 2.10 is required. Current version is 2.14.1. If using the gradle wrapper, try editing the distributionUrl in D:\androidWorkSpace\NdkDemo\gradle\wrapper\gradle-wrapper.properties to gradle-2.10-all.zip.

        Please fix the project's Gradle settings.
        <a href="fixGradleVersionInWrapper">Fix Gradle wrapper and re-import project</a><br><a href="openGradleSettings">Gradle settings</a>


        这是啥情况,必须要2.10版本?
      • starryZzz:你好,请问按这种方法如何生成so文件
      • 37a4a1c806ba:一直都是:eclipse上做JNI部分,然后打成jar包导入到AS中,调试太痛苦。。。谢谢分享 :smile:
        lavor:@AltriaTT :pray: ,能帮到你就好
      • 食梦兽:minSdkVersion.apiLevel 15
        targetSdkVersion.apiLevel 23

        博主忘记说这两个也要改了
        食梦兽:@lavor 话说我生成的.c文件怎么只有一个#include<jni.h>
        食梦兽:@lavor 我试的时候报错了,才知道的
        lavor:@世界是我的床 你看的好仔细啊,是的,一会加上,多谢
      • 5332e323edfd:为啥我创建native方法时候并没有报红啊?。。
        lavor:@侯磊 不会吧,那你出现别的错误会报红吗?
      • 蟋蟀哥:不错不错

      本文标题:AndroidStudio NDK开发最佳入门实践

      本文链接:https://www.haomeiwen.com/subject/sufgrttx.html