使用Android Studio 进行NDK开发和调试
2019独角兽企业重金招聘Python工程师标准>>>
尽管Android Studio已经越来越流行了,但很多人还是习惯于Eclipse或源码环境下开发JNI应用。个人认为使用Android Studio作NDK开发是必然趋势,所以本文将简单介绍如何在Android Studio上实现NDK开发。
简介
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插件需要对以下三个文件做修改:
./build.gradle
./app/build.gradle
./gradle/wrapper/gradle-wrapper.properties
./gradle/wrapper/gradle-wrapper.properties
将distributionUrl改用gradle-2.10版本
distributionUrl=https\\://services.gradle.org/distributions/gradle-2.10-all.zip
./build.gradle
使用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}}
./app/build.gradle
这部分改动比较大,修改及注释如下:
// 用com.android.model.application 代替 com.android.applicationapply plugin: 'com.android.model.application'// 将原来的配置用 model{}包起来model {android {// 取值必须使用 “=” 形式// 否则会报 “Error:Cause: org.gradle.api.internal.ExtensibleDynamicObject” 错误compileSdkVersion = 23buildToolsVersion = '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 = 23versionCode = 1versionName = "1.0"}// 配置NDKndk {// 生成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 JNICALLJava_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) {// TODOreturn (*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 JNICALLJava_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) {// TODOreturn (*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调试配置,可以正常调试了。
文/ConnorLin(简书作者)
原文链接:http://www.jianshu.com/p/2690c9964110
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
转载于:https://my.oschina.net/xiahuawuyu/blog/726802
使用Android Studio 进行NDK开发和调试相关推荐
- Android studio中NDK开发(四)——使用addr2line分析Crash日志 backtrace
文章目录 一.前言 二.分析 1.先提取backtrace部分 2.提取对应so库的信息 3.提取错误地址 三.使用addr2line对地址进行转换 1.addr2line工具的路径放在 2.Term ...
- 26.Android Studio下Ndk开发(ffmpeg导入Android studio以cmake方式编译的过程)
Android studio 2.2开始支持cmake的方式进行jni开发,我在另一篇10.Eclipse下Ndk开发(ffmpeg解码)中写过Eclipse下编译ffmpeg的过程,但是现在几乎没有 ...
- Android studio使用NDK编译和调试(生成so文件)
作者:燕歆波 导读:android如何检测应用本身被卸载了,统计卸载量! 1.首先检查自己的Android studio上有没有装ndk,右击项目根目录–>open module setting ...
- android studio下NDK开发
2019独角兽企业重金招聘Python工程师标准>>> 1.NDK 的下载 和 配置 NDK 下载地址 : https://developer.android.com/ndk/ind ...
- Android Studio集成NDK开发环境
这几天需要使用C语言在底层编译,所以就打算在Android studio中打造可以编译C的环境,毕竟使用Android studio久了,就不怎么想用Eclipse开发了 废话不多说,直接来看一波集成 ...
- android studio ndk-builld方式开发
之前都是在Ubuntu开发,项目也是老的,自然也就顺理成章的用eclipse做各种android的开发.最近想在android studio 切换下,有点不习惯.android studio 为ndk ...
- android Studio 配置LUA 开发环境
android Studio 配置 LUA 开发环境 关于Android LUA资料 android如何调用lua? Android lua 教程 Lua官网 lua语言解释 Lua 5.1 参考手册 ...
- android studio lua插件,android Studio 配置LUA 开发环境
android Studio 配置 LUA开发环境 关于Android LUA资料 引诉大牛的原话: Android 调用 Lua /Lua 调用 Android 代码 在Android项目中使用Lu ...
- android studio lua插件,[置顶] android Studio 配置LUA 开发环境
android Studio 配置 LUA 开发环境 关于Android LUA资料 android如何调用lua? Android lua 教程 Lua官网 lua语言解释 Lua 5.1 参考手册 ...
最新文章
- OSS正式支持IPv6公测
- 微服务架构 — 微服务框架
- OA办公系统的核心-工作流
- sentry php使用,实战Sentry
- android log丢失(一)使用logd丢失log原理
- 推荐一款功能强大的Tomcat 管理监控工具,可替代Tomcat Manager
- css3直线运动_纯css3实现曲线运动——贝塞尔曲线(cubic-bezier)
- 苹果xsmax是什么接口_为什么苹果PD快充线头是银色而非金黄色?原来那根本就不是镀的银...
- HDU 6444 Neko's loop(单调队列)
- [转]paint,update和repaint三种awt方法
- 可视化实验二:大数据可视化工具—Tableau
- 板载RAID、RAID卡与RAID控制器
- Ubuntu 22.04 LTS apt-get update 报 Key is stored in legacy trusted.gpg keyring 警告解决方案
- 手机打字软件如何测试打字快,手机打字学好拼音最笨的方法 手机打字怎么练才能快...
- 转:latex 表格紧跟指定的文字后面
- 一键安装mysql5.7
- C++中的char,char*,char[]
- 英雄萨姆二次出击全攻略
- CIE颜色空间是如何用来设计更好的led的
- Unity使用WASD控制人物移动
热门文章
- 雇佣K个工人的最小费用 Minimum Cost to Hire K Workers
- centos dhcp 服务器搭建 多vlan
- CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内?
- 压力测试之apache benchmark
- Trip to America for 3 more months
- DataBinder.Eval数据绑定中的使用
- The used SELECT statements have a different number of columns 错误解决
- Hadoop用户配置免密登陆
- clickhouse安装教程
- java源程序编译型_Java语言的源程序不是编译型的,而是编译解释型的。