详解如何使用Android Studio 进行NDK开发和调试

尽管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可从官网或jb51.net下载。

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.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调试配置,可以正常调试了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 详解Android studio ndk配置cmake开发native C
  • Android studio 使用Debugger问题(代码中含有ndk)
(0)

相关推荐

  • Android studio 使用Debugger问题(代码中含有ndk)

    NDK NDK 是 Native Developmentit的缩写,是Google在Android开发中提供的一套用于快速创建native工程的一个工具. 使用这个工具可以很方便的编写和调试JNI的代码. NDK可从官网或AndroidDevTools(个人网站)下载. 1.出现错误: Error running app: Unable to open debugger port (localhost:8601): java.net.ConnectException "Connection re

  • 详解Android studio ndk配置cmake开发native C

    Android 2.2 以后的版本对NDK的支持已经非常好了.最近把一个纯C的android项目,从eclipse ADT迁移到Android studio上.本文是参考Add C and C++ Code to Your Project官方文档(需要翻墙),经过各种尝试之后的总结. Android studio整合NDK开发,有两种模式,一种是ndk build,一种是cmake,如果是新项目官方推荐cmake.原来,ADT的时候只能用ndk build,这次切换IDE并没有选用ndk bui

  • 详解如何使用Android Studio 进行NDK开发和调试

    尽管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开发中提供的

  • 详解如何在Android studio中更新sdk版本和build-tools版本

    一.首先看下Android开发用到的sdk目录: build-tools 保存着一些Android平台相关通用工具,比如adb.和aapt.aidl.dx等文件.  aapt即Android Asset Packaging Tool , 在SDK的build-tools目录下. 该工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也可将资源文件编译成二进制文件.  Adb 即android debug bridge 管理模拟器和真机的万能工具,ddms 调试环境 

  • 详解如何使用Android Studio开发Gradle插件

    缘由 首先说明一下为什么会有这篇文章.前段时间,插件化以及热修复的技术很热,Nuwa热修复的工具NuwaGradle,携程动态加载技术DynamicAPK,还有希望做最轻巧的插件化框架的Small.这三个App有一个共同的地方就是大量的使用了Gradle这个强大的构建工具,除了携程的框架外,另外两个都发布了独立的Gradle插件提供自动化构建插件,或者生成热修复的补丁.所以学习一下Gradle插件的编写还是一件十分有意义的事. 插件类型 Gradle的插件一般有这么几种: 一种是直接在项目中的g

  • 详解如何在Android Studio中添加RecyclerView-v7支持包

    一直知道RecyclerView可以代替ListView.GridView使用,听说功能很强大,但还没有去学习过.今天想学习,没想到还没开始便撞墙了.输入Recycler,只有这两个东西,没有提示RecyclerView,说明支持包中没有. 最后一番百度后,终于解决(真不敢想象没有网络的情况下,怎么开发.怎么解决问题). 1.打开SDK Manager,在Extras树下找到Android Support Library,下载好支持包.RecyclerView在v7-21版本就出来了.我这里不用

  • 详解android studio游戏摇杆开发教程,仿王者荣耀摇杆

    最近在做一个山寨版的王者荣耀,刚开始做的时候毫无头绪 摇杆的多点触控做的特别烂 经过几天的思考已完美解决所有问题,下面就和大家分享下这个摇杆的开发思路 若有不正之处,请多多谅解并欢迎指正. 首先这个摇杆要用到较多的数学知识,小编的数学特别烂也就高中水平吧 我们这个摇杆一共就五个按钮,一个移动摇杆.三个技能摇杆和一个普通攻击按钮 最终效果 好了废话少说让我们开始吧 新建一个项目 建好项目之后,我们先新建一个类叫做"画".也是我们的主View 修改Hua.java的代码 public cl

  • Android Studio使用USB真机调试详解

    本文为大家分享了Android Studio使用USB真机调试的具体方法,供大家参考,具体内容如下 以小米4为例,先将手机通过USB连接电脑,在设备管理器中确保驱动安装正确. 对手机的设置 1.设置手机为开发者模式(设置->关于手机->连续点击MIUI版本--开启成功) 2.在更多设置中找到系统安全设置--允许安装未知来源的应用 3.在更多设置中选择开发者选项,在开发者选项中同时勾选USB调试和USB安装的开关 对Android Studio 的设置: 1.在工具栏中找到app,点开后选择&q

  • 详解Flutter 调用 Android Native 的方法

    Flutter 调用 Android Native 的方法,是通过MethodChannel的方式来实现的: 在Android端: 创建一个Class,实现FlutterPlugin和MethodCallHandler接口 重写onAttachedToEngine(),onDetachedFromEngine(),onMethodCall() onAttachedToEngine()中,根据自定义的CHANNEL_NAME创建MethodChannel, onDetachedFromEngine

  • Android Studio 下 Flutter 开发环境搭建,Flutter,Dart 插件安装,Flutter SDK 安装,环境变量配置,开发环境检查

    I . Flutter 学习资料 Flutter 学习资料 : ① 官方文档 : https://flutter.dev/docs ② Flutter Android 开发者文档 : https://flutter.dev/docs/get-started/flutter-for/android-devs ② Flutter 插件库 : https://pub.dev/ II . Flutter 开发环境搭建 Flutter 开发环境搭建 : ① Android Studio : https:/

  • Android Studio配置Kotlin开发环境详细步骤

    Android Studio配置Kotlin开发环境详细步骤 第一步:安装Kotlin插件 打开Settings面板,找到Plugins选项,点击Browse repositories(浏览仓库),输入"Kotlin"查找,然后安装即可.安装完成之后需要重启Android Studio (切记!). 安装完成之后如下图所示. 插件当前的最新版本是1.1.2-release-Studio-2.3-3. 第二步:配置Kotlin开发环境 点击菜单栏的"Tools"选项,

  • 详解如何使用Docker部署Django+MySQL8开发环境

    前一段时间重装了系统,然后我还没有备份,导致电脑里的开发环境全都没有了. 一想到又要装 Python 环境,还要装数据库,然后安装过程中还可能报一堆错就头疼. 最近正在学习 Docker,这不正好解决了我当前的痛点了吗?而且,不止这次重装系统,以后再重装都不怕了,只要拿着 Dockerfile 和 docker-compose 文件,不管到什么环境,一条命令轻松跑起来. 之前部署 Python 开发环境,都是用的 virtualenv,或者是 Pipenv.这次使用 Docker 之后,对比下来

随机推荐