AndroidStudio NDK 开发最佳入门实践

NDKLearning

项目地址:lavor-zl/NDKLearning AndroidStudio NDK 开发最佳入门实践

简介:AndroidStudio NDK 开发最佳入门实践

更多:作者   提 Bug   官网   

标签:

 


网上一些介绍 AndroidStudio NDK 入门的教程,感觉都不是很完整和全面,也没有告诉初学 AndroidStudio NDK 的同学们一些需要注意的地方。
本文所介绍的是在 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/ 。
AndroidStudio NDK 开发最佳入门实践

AndroidStudio 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.
  • 然后,compileSdkVersion 23与 buildToolsVersion "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();
    AndroidStudio NDK 开发最佳入门实践
  • 其次,我们注意到添加的 native 方法的方法名是红色的,将鼠标移动到方法名上(注意不能是括号里面或者后面),然后按下Alt+Enter快捷键,弹出一些解决的方法建议,点击第一个Create Function...
    AndroidStudio NDK 开发最佳入门实践
  • 再次,此时会自动建立一个与 java 目录同级的 jni 目录,在 jni 目录自动建立一个 c 文件,在 c 文件中实现刚才的 native 方法。 AndroidStudio NDK 开发最佳入门实践
  • 然后,稍稍修改一下 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 开发最佳入门实践

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

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