Android(安卓)Studio添加NDK开发能力的两种方法
第一种方法:新建的项目(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是,在这里,看图把:
效果图:
更多相关文章
- 手把手带你搭建 Elasticsearch 集群
- Android(安卓)Studio 统计代码行数插件 — Statistic
- Android查看数据库工具sqlitemanager
- 由于android-sdk安装到Program Files目录下造成的启动错误
- android PhoneGap 自定义插件
- android root实践
- Android浏览器插件开发-Log
- 为TextView设置边框
- GreenDao 在 Android(安卓)Studio 中的配置使用