android进阶3step4:Android Studio——NDK配置

课程目标

  • 1,了解NDK Android NDK
  • 2,完成环境搭建
  • 3,能够开发完整NDK项目

课程内容

  • 1,初见Android NDK
  • 2,开发环境搭建
  • 3,Android NDK到底是什么
  • 4,Android NDK使用规范

一、初见Android NDK

1,Android NDK简介 

2,Android NDK优缺点及使用场景

3,本课程的优势及所需的准备

1,Android NDK简介 


Android NDK简介NDK全称是Native Development Kit

官方解释:

NDK是一套允许开发人员将本地代码嵌入Android应用程序包,可以将Android应用程序中的部分功能用C / C ++语言来实现,并将这部分C / C ++代码编译成可直接运行在Android平台上的本地代码。这些本地代码以及链接库的形式存在,并能自动将so和java应用一起打包成apk。 

一句话解释:NDK允许开发人员用C / C ++开发Android程序

与NDK密切相关的另一个词汇则是JNI,它是NDK开发中的枢纽,Java与底层交互绝大多数都是通过它来完成的

那么接下来看看什么是JNI?


JNI:Java Native Interface也就是java本地接口,它是一个协议,这个协议用来沟通java代码和本地代码(c / c ++)。通过这个协议,Java类的某些方法可以使用原生实现,同时让它们可以像普通的爪哇方法一样被调用和使用,而原生方法也可以使用的Java对象,调用和使用的Java方法也就是说,使用JNI这种协议可以实现:用Java代码调用C / C + +代码,而C / C ++代码也可以调用的Java代码。

运行机制:


2,Android NDK优缺点及使用场景

优点:

  • 机本。代码执行效率高
  • 反编译难度大保密性好
  • 可以直接接触底层系统
  • 嵌入式本地代码平台个人文库个人文库移植性好
  • 方便使用各种开源库

缺点:

  • 调用步骤繁琐
  • 互调过程开销较大
  • 需要处理资源分配与释放
  • 了解的知识更多

使用场景如下:

  1. 编写Android的驱动
  2. 对执行效率有高要求
  3. 对底层系统或一些本地开源库有依赖
  4. 代码保密性高

3,课程的优势及所需的准备

  1. 使用Android Studio做开发
  2.  从0开始编写完整NDK项目
  3. 分别介绍Linux的的/苹果机和视窗下开发方式
  4. 涉及部分底层原理及进阶内容
  5.  Gradle 2.5 1
  6. 安装并配置好Android Studio2.2以上开发环境
  7. 熟练使用C / C ++
  8. 有一定的的Linux的使用经验

二,NDK的环境搭建(MAC版)

一.NDK下载:

根据你的电脑下载NDK下载地址

目录介绍:

  • ndk-build:该shell脚本是Android NDK构建系统的起始点(最重要的文件
  • NDK-GDB:该外壳脚本允许用GUN调试器调试原生组件
  • NDK堆叠:该外壳脚本可以帮助分析原生组件崩溃时的堆栈追踪
  • build:该目录包含了Android NDK构建系统的所有模块
  • 平台:该目录包含了支持不同Android目标版本的头文件和库文件,Android NDK构建系统会根据具体的Android版本自动引用这些文档
  • 来源:该目录包含了可供开发人员导入到现有的Android NDK项目的一些共享模块
  • samples:该目录包含了一些示例应用程序,这些程序可以提现Android NDK的性能,示例程序对于学习如何使用Android NDK的特性很有帮助
  • toolchains:该目录包含了目前Android NDK支持的不同架构的交叉编译器,Android NDK目前支持ARM,X86,MIPS

二。环境变量配置

解压NDK的zip包,注意路径目录不要出现空格和中文,这里建议大家把包解压到SDK目录里面,并命名为ndk-bundle,好处是,启动AS的时候会检查它并直接添加到ndk.dir中,减少我们的配置工作;(步骤三:android studio中配置会说)

1.打开终端,输入命令:进入下载好的NDK文件夹中

cd ~/Library/Android/sdk/nkd-bundle

2.配置环境变量(进入当前目录的.bash_profile中配置文件中)然后英文状态下点击i(插入)键(才可以插入)

vi ~/.bash_profile

3.添加配置指定NDK,建立执行文件的目录

export PATH=${PATH}:~/Library/android/sdk/ndk-bundle/build

输入完之后点击ESC退出,下方输入:WQ然后按输入键保存

4.使刚刚配置文件生效并启动终端 

 source ~/.bash_profile
 exit

5.重启终端后输入 

ndk-build

就会显示(就成功啦)

Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.    
/Users/mac/documents/android-ndk-r16b/build/core/build-local.mk:151: *** Android NDK: Aborting    .  Stop.

如果途中遇到:Mac终端命令行报错-bash:vi:command not found  说明你环境变量设置有误,参考这篇文章

注意路径是否写错之类

三,Android Studio中的配置

1.打开android studio文件 - >项目结构 

Android NDK位置写入路径

工程中的local.properties文件中自动生成目录啦(方便之处,不用手动添加)

省去上面的三个方法,最简单的是在android studio中的

首选项 - >外观$行为 - >系统设置 - > Android SDK中进行相应的NDK下载

四,genymotion虚拟机的配置

genymotion运行的速度比作为自带的虚拟机快得多,因为NDK需要臂平台的机子运行,在作为上自带的臂运行更慢了

所以下载genymotion虚拟机提高开发效率,使用真机也可以

genymotion下载配置参考这篇文章:mac上安装Genymotion

安装完之后,要装Genymotion-ARM-Translation  密码:r93e genymotion的ARM平台包

直接将zip包拖动打开的虚拟机就可以自动安装了。

安装完成会让你重启虚拟机。

三、Android NDK使用规范(做一下了解)

  1. Android NDK目录结构及配置文件解析
  2. Android NDK中数据类型对应关系
  3. Java调用Native函数的方法
  4. Jni 字符串处理

1、Android NDK目录结构及配置文件解析


 

目录结构 

  • Java 目录:Android Java代码
  • Jni 目录:
  1.  C代码
  2.  H头文件
  3.  MK配置文件
  • Libs目录:通过ndk编译出来的so链接库
  • Obj目录:C代码编译出的目标文件(中间产物)

Android.mk 配置文件

要在两个include之间进行配置 

LOCAL_PATH:jni所在目录

CLEAR_VARS:清空本地配置变量,必须执行

LOCAL_MODULE:该变量指定模块名字( 指定生成.so的文件名,系统自动加上lib+指定的名字.so)

LOCAL_SRC_FILES:C/C++源文件名

BUILD_SHARED_LIBRARY:指定一个建立共享库的GNU Make脚本文件



2、Android NDK中数据类型对应关系

Java调用Native函数的方法

1、静态注册(懒汉式 -时间换空间)

方法名是“包名_类名_方法名”,形式复杂

上面的例子是在test.c函数中的形式是: 相当于在把.换成了下划线_

java_imooc_android_com_myndktest_NdkUtil_stringFromJNI

string_1FromJNI

这表示是一个整体(等价):stringFromJNI 通过这个方法消除歧义

2、动态注册 (饿汉式 -空间换时间)

通过数组完成对应关系注册,灵活 

在main目录下创建jni目录创建.c文件进行动态注册 

Jni 字符串相关处理

  1. NewStringUTF:创建一个UTF编码的字符串
  2. GetStringUTFChars:访问一个字符串
  3. GetStringUTFLength:查询字符串的长度
  4. ReleaseStringUTFChars:释放字符串所占内存,与Get成对 

Android ndk程序编写步骤

  1. 在Gradle中配置ndk so库名称
  2. 编写JAVA代码,用Native关键字声明C函数
  3. 编写C语言代码,通过静态/动态注册绑定函数
  4. 注意Jni变量类型对应关系

Android NDK 进阶

  1. 学习JNI函数的映射机制
  2. 编写Android驱动及HAL层代码
  3. 将复杂算法通过NDK提升效率
  4. 编写跨平台链接库

猜你喜欢

转载自blog.csdn.net/qq_17846019/article/details/84845330