使用Android Studio 进行NDK开发和调试
2016-04-28 21:54
597 查看
尽管Android Studio已经越来越流行了,但很多人还是习惯于Eclipse或源码环境下开发JNI应用。个人认为使用Android Studio作NDK开发是必然趋势,所以本文将简单介绍如何在Android Studio上实现NDK开发。
使用这个工具可以很方便的编写和调试JNI的代码。
NDK可从官网或AndroidDevTools(个人网站)下载。
以往Android NDK开发需要在Eclipse或源码环境下,建立并配置Android.mk和Application.mk,且还要通过java命令生成.h头文件,才能编译生成so库。但在Android Studio中这些步骤都不需要,因为Gradle足够强大,只需配置Gradle即可编译生成so库。
同年7月,在Android Studio 1.3版本上添加了
CAVEAT: Note that this plugin is a preview of the plugin for feedback on performance and NDK integration. The Gradle API for the new component model is not final, which means each plugin will only work with a specific version of Gradle.
Additionally, the DSL may also change.
目前这个插件是预览插件,并不是正式的。意味着插件只能运行在特定的Gradle版本上。并且DSL(领域特定语言)也要改变。
2、Android Studio 1.3 RC1或更高版本
3、Android NDK r10e 或更高版本
4、Build Tools 19.0.0 或更高版本
每个版本的experimental插件需要特定的Gradle版本
2、按F4打开工程配置
3、使用experimental插件需要对以下三个文件(加粗)做修改:
.
├── 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
[b]./gradle/wrapper/gradle-wrapper.properties[/b]
将distributionUrl改用gradle-2.10版本
[b]./build.gradle[/b]
使用com.android.tools.build:gradle-experimental 代替 com.android.tools.build:gradle.
[b]./app/build.gradle[/b]
这部分改动比较大,修改及注释如下:
4、在Java文件(这里以JNIActivity为例)中添加代码
此时,native方法标红,提示如下:
在
按回车,会自动在main目录下生成jni文件夹,内含JniDemo.c:
你会发现,Android Studio已经为我们自动生成JNI方法了,你只需要再写实现就可以了。
至此,最简单的NDK开发配置完毕。
其他配置,请参考官方文档,Demo可以参考官方Demo
经过实验,答案是可以的!
2、打开 app level 的 build.gradle, 配置NDK
然后点击右上角Sync Now, 会有如下错误提示:
按提示,在 gradl.properties 文件里加上
3、在Java文件(这里以JNIActivity为例)中添加代码
接着在
同样,会自动在main目录下生成jni文件夹,内含JniDemo.c:
但是,你会发现并不会自动生成JNI方法,这是因为使用experimental插件才会自动生成代码。
那自动生成代码该如何实现呢?
方法依然是使用
4、在./app/build.gradle中添加
再次在
你会发现成功自动生成JNI方法了。
此时,只要将
这样我们在需要自动生成代码的时候,将gradle-experimental依赖再次打开即可。
1、打开JNI调试
2、配置Android Native - Debugger
3、下载LLDB 2.0
首次底部会报错
点击 Fix,提示下载LLDB 2.0,照做,下载安装即可。
4、完成NDK调试配置,可以正常调试了。
That’s all!
原创文章,欢迎转载,转载请注明出处
我的简书账号是ConnorLin,欢迎光临!
欢迎关注我的微信
简介
JNI
JNI 是Java Native Inteface的缩写,是Java中定义的一种用于连接Java和C/C++接口的一种实现方式。NDK
NDK 是 Native Developmentit的缩写,是Google在Android开发中提供的一套用于快速创建native工程的一个工具。使用这个工具可以很方便的编写和调试JNI的代码。
NDK可从官网或AndroidDevTools(个人网站)下载。
Gradle
Gradle 是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置。以往Android NDK开发需要在Eclipse或源码环境下,建立并配置Android.mk和Application.mk,且还要通过java命令生成.h头文件,才能编译生成so库。但在Android Studio中这些步骤都不需要,因为Gradle足够强大,只需配置Gradle即可编译生成so库。
gradle-experimental插件
在2015年5月的Google I/O大会上, Google宣布Android Studio开始支持NDK开发,通过和JetBrains的合作,将Clion整合进了Android Studio 1.3,并免费支持NDK C++开发。同年7月,在Android Studio 1.3版本上添加了
gradle-experimental插件,该插件支持NDK开发和调试,且带有代码不全和重构等高级功能。
CAVEAT: Note that this plugin is a preview of the plugin for feedback on performance and NDK integration. The Gradle API for the new component model is not final, which means each plugin will only work with a specific version of Gradle.
Additionally, the DSL may also change.
目前这个插件是预览插件,并不是正式的。意味着插件只能运行在特定的Gradle版本上。并且DSL(领域特定语言)也要改变。
使用Experimental插件进行NDK开发
使用Experimental插件的必要条件
1、Gradle-2.5或更高版本2、Android Studio 1.3 RC1或更高版本
3、Android NDK r10e 或更高版本
4、Build Tools 19.0.0 或更高版本
每个版本的experimental插件需要特定的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 |
NDK开发步骤
1、新建一个Android标准工程2、按F4打开工程配置
3、使用experimental插件需要对以下三个文件(加粗)做修改:
.
├── 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
[b]./gradle/wrapper/gradle-wrapper.properties[/b]
将distributionUrl改用gradle-2.10版本
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
[b]./build.gradle[/b]
使用com.android.tools.build:gradle-experimental 代替 com.android.tools.build:gradle.
buildscript { repositories { jcenter() } dependencies { //classpath 'com.android.tools.build:gradle:2.0.0' classpath "com.android.tools.build:gradle-experimental:0.7.0-alpha4" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
[b]./app/build.gradle[/b]
这部分改动比较大,修改及注释如下:
// 用com.android.model.application 代替 com.android.application apply plugin: 'com.android.model.application' // 将原来的配置用 model{}包起来 model { android { // 取值必须使用 “=” 形式 // 否则会报 “Error:Cause: org.gradle.api.internal.ExtensibleDynamicObject” 错误 compileSdkVersion = 23 buildToolsVersion = '23.0.2' defaultConfig { // 取值必须使用 “=” 形式 applicationId = "com.connorlin.jnitest" //这里要注意是 xxSdkVersion.apiLevel // 否则会报 “Unable to load class com.android.build.gradle.managed.ProductFlavor_Impl”错误 minSdkVersion.apiLevel = 15 targetSdkVersion.apiLevel = 23 versionCode = 1 versionName = "1.0" } // 配置NDK ndk { // 生成so的名字,是必须的 moduleName ="JNITest" toolchain = 'clang' CFlags.add('-std=c99') // 添加依赖库 ldLibs.addAll(['android','OpenSLES', 'log']) // 生成不同abi体系的so库 abiFilters.addAll(['armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64']) } buildTypes { release { minifyEnabled = false // 这里注意:使用proguardFiles.add()方法 proguardFiles.add(file('proguard-rules.txt')) } } } }
4、在Java文件(这里以JNIActivity为例)中添加代码
static { System.loadLibrary("JNITest"); } public native String testJni();
此时,native方法标红,提示如下:
在
testJni()方法上按快捷键
Alt + Enter,出现如下提示
按回车,会自动在main目录下生成jni文件夹,内含JniDemo.c:
#include <jni.h> JNIEXPORT jstring JNICALL Java_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) { // TODO return (*env)->NewStringUTF(env, "returnValue"); }
你会发现,Android Studio已经为我们自动生成JNI方法了,你只需要再写实现就可以了。
至此,最简单的NDK开发配置完毕。
其他配置,请参考官方文档,Demo可以参考官方Demo
换种方式进行NDK开发
既然预览版com.android.tools.build:gradle-experimental支持NDK,那么正式版
com.android.tools.build:gradle是否也可以实现NDK开发呢?
经过实验,答案是可以的!
步骤
1、新建一个Android标准工程,并在工程设置中配置NDK路径。2、打开 app level 的 build.gradle, 配置NDK
ndk { moduleName "NdkJniDemo" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库,可忽略 }
然后点击右上角Sync Now, 会有如下错误提示:
按提示,在 gradl.properties 文件里加上
android.useDeprecatedNdk=true即可。
3、在Java文件(这里以JNIActivity为例)中添加代码
static { System.loadLibrary("JNITest"); } public native String testJni();
接着在
testJni()方法上按快捷键
Alt + Enter并回车,
同样,会自动在main目录下生成jni文件夹,内含JniDemo.c:
#include <jni.h>
但是,你会发现并不会自动生成JNI方法,这是因为使用experimental插件才会自动生成代码。
那自动生成代码该如何实现呢?
方法依然是使用
gradle-experimental插件,但是不同的是,在app level的build.gradle中添加
com.android.tools.build:gradle-experimental依赖。
4、在./app/build.gradle中添加
gradle-experimental依赖
dependencies { compile 'com.android.tools.build:gradle-experimental:0.7.0' }
再次在
testJni()方法上按快捷键
Alt + Enter并回车
#include <jni.h> JNIEXPORT jstring JNICALL Java_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) { // TODO return (*env)->NewStringUTF(env, "returnValue"); }
你会发现成功自动生成JNI方法了。
副作用
这种方式有个副作用是 Run app 时可能会报错:此时,只要将
gradle-experimental依赖注释掉即可正常运行,同时会保持自动生成代码的功能,直到关闭工程。
这样我们在需要自动生成代码的时候,将gradle-experimental依赖再次打开即可。
NDK调试
默认情况下是不支持NDK调试的,但要支持NDK调试也很简单,只要做些简单配置即可。1、打开JNI调试
2、配置Android Native - Debugger
3、下载LLDB 2.0
首次底部会报错
点击 Fix,提示下载LLDB 2.0,照做,下载安装即可。
4、完成NDK调试配置,可以正常调试了。
That’s all!
原创文章,欢迎转载,转载请注明出处
我的简书账号是ConnorLin,欢迎光临!
欢迎关注我的微信
相关文章推荐
- 美团Android DEX自动拆包及动态加载简介
- 【错误反思】 android.content.res.Resources$NotFoundException
- 让Android Studio支持系统签名
- 你真的了解Android Notification吗?
- Android小错误收集
- Android This Activity already has an action bar supplied by the window decor
- Android系列之Activity
- android内存泄漏
- Android应用使用Multidex突破64K方法数限制
- 安卓导入第三方源码库
- 【Android动画九章】-TranslateAnimation(位移动画)
- Android游戏4-27 实现图像特效-旋转 缩放 平移
- Android5.0/6.0新特性
- 转: android 实现效果特效
- at android.widget.AbsListView.obtainView(AbsListView.java:2040)
- android 的外部存储的挂载的理解
- android学习(过程总结)
- Studio导入SlidingMenu流程详解及相关问题
- android layout 按比例布局的代码
- Android Activity使用拾遗