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开发和调试相关推荐

  1. Android studio中NDK开发(四)——使用addr2line分析Crash日志 backtrace

    文章目录 一.前言 二.分析 1.先提取backtrace部分 2.提取对应so库的信息 3.提取错误地址 三.使用addr2line对地址进行转换 1.addr2line工具的路径放在 2.Term ...

  2. 26.Android Studio下Ndk开发(ffmpeg导入Android studio以cmake方式编译的过程)

    Android studio 2.2开始支持cmake的方式进行jni开发,我在另一篇10.Eclipse下Ndk开发(ffmpeg解码)中写过Eclipse下编译ffmpeg的过程,但是现在几乎没有 ...

  3. Android studio使用NDK编译和调试(生成so文件)

    作者:燕歆波 导读:android如何检测应用本身被卸载了,统计卸载量! 1.首先检查自己的Android studio上有没有装ndk,右击项目根目录–>open module setting ...

  4. android studio下NDK开发

    2019独角兽企业重金招聘Python工程师标准>>> 1.NDK 的下载 和 配置 NDK 下载地址 : https://developer.android.com/ndk/ind ...

  5. Android Studio集成NDK开发环境

    这几天需要使用C语言在底层编译,所以就打算在Android studio中打造可以编译C的环境,毕竟使用Android studio久了,就不怎么想用Eclipse开发了 废话不多说,直接来看一波集成 ...

  6. android studio ndk-builld方式开发

    之前都是在Ubuntu开发,项目也是老的,自然也就顺理成章的用eclipse做各种android的开发.最近想在android studio 切换下,有点不习惯.android studio 为ndk ...

  7. android Studio 配置LUA 开发环境

    android Studio 配置 LUA 开发环境 关于Android LUA资料 android如何调用lua? Android lua 教程 Lua官网 lua语言解释 Lua 5.1 参考手册 ...

  8. android studio lua插件,android Studio 配置LUA 开发环境

    android Studio 配置 LUA开发环境 关于Android LUA资料 引诉大牛的原话: Android 调用 Lua /Lua 调用 Android 代码 在Android项目中使用Lu ...

  9. android studio lua插件,[置顶] android Studio 配置LUA 开发环境

    android Studio 配置 LUA 开发环境 关于Android LUA资料 android如何调用lua? Android lua 教程 Lua官网 lua语言解释 Lua 5.1 参考手册 ...

最新文章

  1. OSS正式支持IPv6公测
  2. 微服务架构 — 微服务框架
  3. OA办公系统的核心-工作流
  4. sentry php使用,实战Sentry
  5. android log丢失(一)使用logd丢失log原理
  6. 推荐一款功能强大的Tomcat 管理监控工具,可替代Tomcat Manager
  7. css3直线运动_纯css3实现曲线运动——贝塞尔曲线(cubic-bezier)
  8. 苹果xsmax是什么接口_为什么苹果PD快充线头是银色而非金黄色?原来那根本就不是镀的银...
  9. HDU 6444 Neko's loop(单调队列)
  10. [转]paint,update和repaint三种awt方法
  11. 可视化实验二:大数据可视化工具—Tableau
  12. 板载RAID、RAID卡与RAID控制器
  13. Ubuntu 22.04 LTS apt-get update 报 Key is stored in legacy trusted.gpg keyring 警告解决方案
  14. 手机打字软件如何测试打字快,手机打字学好拼音最笨的方法 手机打字怎么练才能快...
  15. 转:latex 表格紧跟指定的文字后面
  16. 一键安装mysql5.7
  17. C++中的char,char*,char[]
  18. 英雄萨姆二次出击全攻略
  19. CIE颜色空间是如何用来设计更好的led的
  20. Unity使用WASD控制人物移动

热门文章

  1. 雇佣K个工人的最小费用 Minimum Cost to Hire K Workers
  2. centos dhcp 服务器搭建 多vlan
  3. CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内?
  4. 压力测试之apache benchmark
  5. Trip to America for 3 more months
  6. DataBinder.Eval数据绑定中的使用
  7. The used SELECT statements have a different number of columns 错误解决
  8. Hadoop用户配置免密登陆
  9. clickhouse安装教程
  10. java源程序编译型_Java语言的源程序不是编译型的,而是编译解释型的。