使用Android Studio 1.3 版本进行NDK开发
2016-03-04 15:22
746 查看
转载自: http://blog.csdn.net/g707175425/article/details/47154115
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
众所周知Android Studio 1.3 版本新增了NDK支持,能够很方便的在上面开发C++或者C代码了,可是预览版功能不是非常完善,需要很多步骤,还有一些奇怪的BUG,整了半天终于可以使用Android Studio完美进行NDK开发了.先看下效果图:
![](http://img.blog.csdn.net/20150730171911206)
1.检查Android Studio更新.
![](http://img.blog.csdn.net/20150730172117624)
有些人可能会遇到问题:自己版本低于1.3检查更新却提示已经是最新版本?
那是因为更新渠道不是Beta渠道,需要先将渠道设置为Beta渠道才能更新到1.3:
![](http://img.blog.csdn.net/20150730172458868)
![](http://img.blog.csdn.net/20150730172431220)
然后重新检查更新就可以更新到1.3了.
Google原文链接:http://tools.android.com/tech-docs/new-build-system/gradle-experimental
1.将Gradle更新到2.5版本.
![](http://img.blog.csdn.net/20150730173047201)
在这里将GradleVersion改为2.5 点击OK键就会开始自动更新Gradle了.
2.Android NDK r10e ,将NDK更新到这个版本
3.BuildTools版本要求大于19.0.0
![](http://img.blog.csdn.net/20150730173304169)
4.红色标注的3个文件是需要手动修改的文件.
![](http://img.blog.csdn.net/20150730173426194)
5.修改gradle-wrapper.properties文件内容为如下:
6.修改Project(非Module)下的Gradle文件,将gradle版本改为实验版本(红色标注部分):
(classpath ‘com.android.tools.build:gradle-experimental:0.1.0’)
![](http://img.blog.csdn.net/20150730173700318)
7.修改Module下的Gradle文件(新版Gradle语法有了很大的改变,红色标注为需要修改的部分,注意dependencies在model外面):
在android{}外面要使用model{}来包括了,所有赋值都变为了=号,新增项变为了+=,buildTypes{},productFlavors{}和sources{}挪到了android{}外面.
![](http://img.blog.csdn.net/20150730173952121)
再上一份我的Module的配置:
实验版Gradle在某些机子上可能会有BUG,如果编译的时候报了如下错误,需要在android{}中添加tasks.withType指定较低的JDK编译版本(1.6或1.7):
bad class file magic (cafebabe) or version
最后在local.properties文件中指定NDK目录即可愉快的进行NDK开发啦:
ndk.dir=”你的NDK目录”
ldLibs项相当于Android.mk中的LOCAL_LDLIBS参数.
abiFilters相当于Application.mk中的APP_ABI参数.
![](http://img.blog.csdn.net/20150730175441296)
2.在Main文件夹下新建JNI文件夹(默认目录,如需修改可以在Gradle中指定 jni.srcDirs)
![](http://img.blog.csdn.net/20150730175856138)
3.定义JNI java类:
![](http://img.blog.csdn.net/20150730180137536)
4.使用javah命令生成头文件(不生成头文件也可,当C++中没有方法实现时,方法名为红色,直接在方法上alt+enter 选择create XXXX 就可以自动在C++文件中生成方法,很方便啊):
打开cmd,cd到java目录下,使用命令:
javah com.example.stronghope.jnitest.JNI
生成头文件,将头文件剪切到jni目录下.
自动生成方法:
![](http://img.blog.csdn.net/20150730182041013)
5.在jni目录下新建C++文件:
JniTest.cpp
![](http://img.blog.csdn.net/20150730180509805)
6.引入头文件,编写C++代码:
![](http://img.blog.csdn.net/20150730180439646)
7.运行Android项目,在控制台得到如下输出:
![](http://img.blog.csdn.net/20150730180645012)
好啦一个简单的Jni程序就实现了,使用Android Studio来进行NDK开发真的非常方便!坐等release版本出来o(∩_∩)o
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
众所周知Android Studio 1.3 版本新增了NDK支持,能够很方便的在上面开发C++或者C代码了,可是预览版功能不是非常完善,需要很多步骤,还有一些奇怪的BUG,整了半天终于可以使用Android Studio完美进行NDK开发了.先看下效果图:
方法:
一.首先将Android Studio更新到1.3版本:
1.检查Android Studio更新.有些人可能会遇到问题:自己版本低于1.3检查更新却提示已经是最新版本?
那是因为更新渠道不是Beta渠道,需要先将渠道设置为Beta渠道才能更新到1.3:
然后重新检查更新就可以更新到1.3了.
二.将gradle切换到实验版本.
根据Google官方提供的方法修改Gradle文件.(官方说法为测试版本不完善,需要手动修改Gradle文件以便兼容Gradle实验版,他们会在release版本中实现程序自动修改Gradle)Google原文链接:http://tools.android.com/tech-docs/new-build-system/gradle-experimental
1.将Gradle更新到2.5版本.
在这里将GradleVersion改为2.5 点击OK键就会开始自动更新Gradle了.
2.Android NDK r10e ,将NDK更新到这个版本
3.BuildTools版本要求大于19.0.0
4.红色标注的3个文件是需要手动修改的文件.
5.修改gradle-wrapper.properties文件内容为如下:
<code class="hljs ini has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-setting" style="box-sizing: border-box;">distributionBase=<span class="hljs-value" style="box-sizing: border-box;">GRADLE_USER_HOME</span></span> <span class="hljs-setting" style="box-sizing: border-box;">distributionPath=<span class="hljs-value" style="box-sizing: border-box;">wrapper/dists</span></span> <span class="hljs-setting" style="box-sizing: border-box;">zipStoreBase=<span class="hljs-value" style="box-sizing: border-box;">GRADLE_USER_HOME</span></span> <span class="hljs-setting" style="box-sizing: border-box;">zipStorePath=<span class="hljs-value" style="box-sizing: border-box;">wrapper/dists</span></span> <span class="hljs-setting" style="box-sizing: border-box;">distributionUrl=<span class="hljs-value" style="box-sizing: border-box;">https\://services.gradle.org/distributions/gradle-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.5</span>-all.zip</span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
6.修改Project(非Module)下的Gradle文件,将gradle版本改为实验版本(红色标注部分):
(classpath ‘com.android.tools.build:gradle-experimental:0.1.0’)
7.修改Module下的Gradle文件(新版Gradle语法有了很大的改变,红色标注为需要修改的部分,注意dependencies在model外面):
在android{}外面要使用model{}来包括了,所有赋值都变为了=号,新增项变为了+=,buildTypes{},productFlavors{}和sources{}挪到了android{}外面.
再上一份我的Module的配置:
<code class="hljs actionscript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">apply plugin: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'com.android.model.application'</span> model{ android { compileSdkVersion=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">19</span> buildToolsVersion=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"22.0.0"</span> defaultConfig.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">with</span> { applicationId = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"com.example.stronghope.jnitest"</span> minSdkVersion.apiLevel = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span> targetSdkVersion.apiLevel = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">19</span> versionCode = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> versionName = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1.0"</span> } tasks.withType(JavaCompile) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//指定编译JDK版本</span> sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7 } } android.ndk { moduleName=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"JniTest"</span> ldLibs +=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"log"</span> ldLibs += <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"z"</span> ldLibs += <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"m"</span> abiFilters +=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"armeabi"</span> abiFilters +=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"armeabi-v7a"</span> abiFilters +=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"x86"</span> } android.buildTypes { release { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// isMinifyEnabled = false</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// proguardFiles += file('proguard-rules.pro')</span> } } } dependencies { } </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li></ul>
实验版Gradle在某些机子上可能会有BUG,如果编译的时候报了如下错误,需要在android{}中添加tasks.withType指定较低的JDK编译版本(1.6或1.7):
bad class file magic (cafebabe) or version
最后在local.properties文件中指定NDK目录即可愉快的进行NDK开发啦:
ndk.dir=”你的NDK目录”
三.NDK开发
1.配置Gradle中ndk编译参数(只需要在Gradle中配置,就可以完全脱离书写Android.mk和Application.mk文件来编译啦):ldLibs项相当于Android.mk中的LOCAL_LDLIBS参数.
abiFilters相当于Application.mk中的APP_ABI参数.
2.在Main文件夹下新建JNI文件夹(默认目录,如需修改可以在Gradle中指定 jni.srcDirs)
3.定义JNI java类:
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> JNI { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span>{ System.loadLibrary(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"JniTest"</span>); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> native <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">testLog</span>(); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>
4.使用javah命令生成头文件(不生成头文件也可,当C++中没有方法实现时,方法名为红色,直接在方法上alt+enter 选择create XXXX 就可以自动在C++文件中生成方法,很方便啊):
打开cmd,cd到java目录下,使用命令:
javah com.example.stronghope.jnitest.JNI
生成头文件,将头文件剪切到jni目录下.
自动生成方法:
5.在jni目录下新建C++文件:
JniTest.cpp
6.引入头文件,编写C++代码:
7.运行Android项目,在控制台得到如下输出:
好啦一个简单的Jni程序就实现了,使用Android Studio来进行NDK开发真的非常方便!坐等release版本出来o(∩_∩)o
相关文章推荐
- Android Activity的lauchmod的理解
- Android开发笔记(七十五)内存泄漏的处理
- ADB连接方式: wifi与usb
- Android实现类似QQ的滑动删除效果
- Android中margin和padding的区别
- android广告植入
- 记一个Android Installer的bug
- Android开发添加QQ群
- Cordova-Android 插件开发
- Android实现系统语言切换功能
- 【文章推荐】Android MVP模式 简单易懂的介绍方式
- Android-常见的通过意图调用系统应用
- Android总结01_服务
- android之scrollview滑动和地图拖动冲突
- 【Android学习笔记】Android中pendingIntent的深入理解
- Android Studio 小知识——删除依赖包
- android listview点赞问题
- Android Listview加载不同布局,ViewHolder类型转换异常!!!
- android---TextView中电话号码、网址自动链接的实现方法
- android ToastShow 直接切换文字,不闪烁