第一种方法:新建的项目(new project)的时候使用Include C++ Support选项

第一种方法:Add C and C++ Code to Your Project


第二种方法:使用插件(Plugin)-- Experimental Plugin

第二种方法:‎New Build System‎ > ‎ Experimental Plugin User Guide


这里我演示一下,了解具体内容请科学上网,去查看详情


试验环境:

java jdk1.8

Android Stduio 2.2.1

gradle 2.14.1

1、新建的项目(new project)的时候使用Include C++ Support选项

新建一个项目,注意是项目(project),不是模块(module)


点多次next,到达这里


在Android视图下,能明显看到多了一个External Build Files,project视图在app模块(module)的build.gradle的同一目录



如果你没选择空Activity,那么直接运行即可看到效果,具体代码自己找,位置在Activity里调用了native方法,并且有声明的。

从Project新建的自动帮你生成了一个含c++的app模块(module),再新建项目你会发现新建的module是普通的,并没有ndk的能力,这里只是指出能用这种方法而已,并没有深究过,算是“师傅领进门,修行看个人”吧。其他等待你挖掘啊。


在这个项目内新建的module都可以添加NDK的能力,如图:


这个需要添加一个CMakeLists.txt这个文本文件,这个这个具体的定义只有三个东西我写了好久这个博客,具体自己去看吧,就是第一个方法的那个连接里面有了,注意科学上网

2、使用插件(Plugin)-- Experimental Plugin

这个方法实质就是替换了android studio的gradle的自动构建插件
(1)目录结构(Android Studio Project的)和插件对应的gradle版本

├──APP/

│├──app.iml

│├──build.gradle(二级目录)

└──SRC /│

├──build.gradle(一级目录)

├──Gradle /

│└──wrapper /

├──gradle-wrapper.jar│

│└──gradle-wrapper.properties

├──gradle.properties

├──gradlew *

├──gradlew.bat

├──local.properties

├──myapplication.iml

└──settings.gradle



Plugin Version Gradle Version
0.1.0 2.5
0.2.0 2.5
0.3.0-alpha3 2.6
0.4.0 2.8
0.6.0-alpha1 2.8
0.6.0-alpha5 2.10
0.7.0-alpha1 2.10
0.7.0 2.10
0.8.1 2.14.1

这个与你版本不匹配,会自动下载对应的gradle-wrapper

在最新的gradel,会提示你要不要更换为最新的插件版本(比如上面的2.14.1,原网页0.7.3,更新之后会替换为0.8.1)


(2)替换android studio自带的gradel构建工具

这是一级build.gradel修改后的情况,这里的一级的具体位置请看上面的目录结构(切换到project视图就能看出来啦)

// 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:2.2.1'//这是android studio的自带的版本构建工具,双斜杠注释掉        classpath 'com.android.tools.build:gradle-experimental:0.8.1'//这是新添加的        // 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}
(3)二级build.gradel的修改比较多。这里慢慢说

【1】将第一行的应用插件(apply plugin)修改为替换的插件应用(apply plugin)

【2】在android节点外层加一个model (这里不要看错成module了),与dependencies同级

【3】android节点的defaultConfig的minSdkVersion和targetSdkVersion要追加.apiLevel 

model{ android{ defaultConfig{ minSdkVersion..apiLevel ..........}}}

【4】android节点buildTypes节点release

的proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'注释掉,更改为proguardFiles.add(file("proguard-rules.pro"))

model{ android{ buildTypes { release{.......proguardFiles.add(file("proguard-rules.pro"))}}}}

【5】添加ndk节点

ndk {
            moduleName = "native"//名字可以自己起的,成的so名字为libXXX.so  XXX为这个节点里面的moduleName
        }

apply plugin: 'com.android.model.application'model {    android {        compileSdkVersion 25        buildToolsVersion "25.0.0"        ndk {            moduleName = "native"        }        defaultConfig {            applicationId "space.xxhui.dnkjni"            minSdkVersion.apiLevel 15            targetSdkVersion.apiLevel 25            versionCode 1            versionName "1.0"            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"        }        buildTypes {            release {                minifyEnabled false                //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'                proguardFiles.add(file("proguard-rules.pro"))            }        }    }    android.productFlavors {        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")    }//以上的android.productFlavors节点为控制生成什么平台的so,毕竟全部生成你的包会很大}//这是model的结束dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {        exclude group: 'com.android.support', module: 'support-annotations'    })    compile 'com.android.support:appcompat-v7:25.0.0'    testCompile 'junit:junit:4.12'}
这里的改动还是很大的,所以慢慢体会吧。配置完成点sync让gradel重新构建你的project吧


(4)测试NDK是否支持

写一个类,里面声明native方法:

public class NDK {    static {        System.loadLibrary("native");//这里的字符串为要生成的.c文件名,要与上面声明的ndk节点的moduleName名字一样    }    public native String get();}

在get上面使用快捷键alt+enter,然后回车,下图:




下面是自动生成的native.c的内容:


本来是一个未定义的字符,改为你要返回的字符吧。

native.c是与static初始化块native名字相同的,不与build.gradle的有关系,但是确保他们都一样吧

ps:如果你alt+enter不会出现提示,那绝对不是你操作错了,而是android studio有点傻才不会提示,我是搞了两天,突然好了,我就呵呵了


代码简洁点吧,直接盖标题比较快



生成的so的位置并不在lib是,在这里,看图把:


效果图:



更多相关文章

  1. 手把手带你搭建 Elasticsearch 集群
  2. Android(安卓)Studio 统计代码行数插件 — Statistic
  3. Android查看数据库工具sqlitemanager
  4. 由于android-sdk安装到Program Files目录下造成的启动错误
  5. android PhoneGap 自定义插件
  6. android root实践
  7. Android浏览器插件开发-Log
  8. 为TextView设置边框
  9. GreenDao 在 Android(安卓)Studio 中的配置使用

随机推荐

  1. C语言实现乘法口诀表
  2. 如何从 0 到 1 构建个性化推荐?
  3. 打造最可靠的自动驾驶基础架构
  4. 实时计算引擎在贝壳的应用与实践
  5. “RDD女王”获2020年小诺奖!她的RD数据,
  6. 介绍B树索引
  7. 推荐系统中模型训练及使用流程的标准化
  8. 关于事件研究法的50篇精选paper专辑! 助
  9. 基于知识图谱的问答在美团智能交互场景中
  10. Hadoop or TDengine,如何做物联网大数据平