课程目标
- 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优缺点及使用场景
优点:
- 机本。代码执行效率高
- 反编译难度大,保密性好
- 可以直接接触底层系统
- 嵌入式本地代码平台个人文库个人文库移植性好
- 方便使用各种开源库
缺点:
- 调用步骤繁琐
- 互调过程开销较大
- 需要处理资源分配与释放
- 要了解的知识更多
使用场景如下:
- 编写Android的驱动
- 对执行效率有高要求
- 对底层系统或一些本地开源库有依赖
- 代码保密性高
3,课程的优势及所需的准备
- 使用Android Studio做开发
- 从0开始编写完整NDK项目
- 分别介绍Linux的的/苹果机和视窗下开发方式
- 涉及部分底层原理及进阶内容
- Gradle 2.5 1
- 安装并配置好Android Studio2.2以上开发环境
- 熟练使用C / C ++
- 有一定的的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使用规范(做一下了解)
- Android NDK目录结构及配置文件解析
- Android NDK中数据类型对应关系
- Java调用Native函数的方法
- Jni 字符串处理
1、Android NDK目录结构及配置文件解析
目录结构
- Java 目录:Android Java代码
- Jni 目录:
- C代码
- H头文件
- 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 字符串相关处理
- NewStringUTF:创建一个UTF编码的字符串
- GetStringUTFChars:访问一个字符串
- GetStringUTFLength:查询字符串的长度
- ReleaseStringUTFChars:释放字符串所占内存,与Get成对
Android ndk程序编写步骤
- 在Gradle中配置ndk so库名称
- 编写JAVA代码,用Native关键字声明C函数
- 编写C语言代码,通过静态/动态注册绑定函数
- 注意Jni变量类型对应关系
Android NDK 进阶
- 学习JNI函数的映射机制
- 编写Android驱动及HAL层代码
- 将复杂算法通过NDK提升效率
- 编写跨平台链接库