Android JNI(一) —— NDK与JNI基础

本文介绍了Android开发中的NDK和JNI基础知识,包括NDK的定义、使用NDK的原因、NDK到SO的过程以及JNI的概念、优势和实现方法。NDK是一套允许使用C/C++开发部分应用的工具集,主要适用于需要跨平台移植、利用C/C++库、提高性能或保护代码的场景。JNI是Java调用C/C++代码的接口,通过JNI可以实现Java与C/C++的交互。
摘要由CSDN通过智能技术生成

Android jni也是开发中的一个重要环节,也是实现java与C交互的平台,接下来就来学习JNI.
本篇文章大纲如下:

1、导读
2、什么是NDK
3、为什么使用NDK
4、NDK到SO
5、JNI
在这里插入图片描述
一、导读
在Android OS上开发应用程序,Google提供了两种开发包:SDK和NDK。你可以从Google官方查阅到有许多关于SDK的优秀书籍、文章作为参考,但是Google提供的NDK资源,相对于SDK还是比较少的。本系列文章主要是用于,自己记录自学NDK的经验,并且希望能够帮助到哪些想学习NDK的朋友。

Android 平台从一开就已经支持了C/C++了。我们知道Android的SDK主要是基于Java的,所以导致了在用Android SDK进行开发的工程师们都必须使用Java语言。不过,Google从一开始就说明Android也支持JNI编程方式,也就是第三方应用完成可以通过JNI调用自己的C动态度。于是NDK就应运而生了。

二、什么是NDK
NDK 其中NDK的全拼是:Native Develop Kit。
那我们先来看下Android NDK官网是对NDK怎么解释的
在这里插入图片描述
关键文字如下:

Android NDK 是一套允许您使用原生代码语言(例如C和C++) 实现部分应用的工具集。在开发某些类型应用时,这有助于您重复使用以这些语言编写的代码库。

简单的来说:

Android NDK 就是一套工具集合,允许你使用C/C++语言来实现应用程序的部分功能。

NDK 是Native Develop Kit的含义,从含义很容易理解,本地开发。大家都知道,Android 开发语言是Java,不过我们也知道,Android是基于Linux的,其核心库很多都是C/C++的,比如Webkit等。那么NDK的作用,就是Google为了提供给开发者一个在Java中调用C/C++代码的一个工作。NDK本身其实就是一个交叉工作链,包含了Android上的一些库文件,然后,NDK为了方便使用,提供了一些脚本,使得更容易的编译C/C++代码。总之,在Android的SDK之外,有一个工具就是NDK,用于进行C/C++的开发。一般情况,是用NDK工具把C/C++编译为.co文件,然后在Java中调用。

NDK不适用于大多数初学的Android工程师,对于许多类型的Android应用没有什么价值。因为它不可避免地会增加开发过程的复杂性,所以一般很少使用。那为什么Google还提供NDK,我们就一起研究下

三、为什么使用NDK
上面提及了 NDK不适合大多数初级Android 工程师,由于它增加了开发的复杂度,所以对许多类型的Android其实也没有大的作用。不过在下面的需求下,NDK还是有很大的价值的:

1、在平台之间移植其应用
2、重复使用现在库,或者提供其自己的库重复使用
3、在某些情况下提性能,特别是像游戏这种计算密集型应用
4、使用第三方库,现在许多第三方库都是由C/C++库编写的,比如Ffmpeg这样库。
5、不依赖于Dalvik Java虚拟机的设计
6、代码的保护。由于APK的Java层代码很容易被反编译,而C/C++库反编译难度大。
四、NDK到so
在这里插入图片描述
从上图这个Android系统框架来看,我们上层通过JNI来调用NDK层的,使用这个工具可以很方便的编写和调试JNI的代码。因为C语言的不跨平台,在Mac系统的下使用NDK编译在Linux下能执行的函数库——so文件。其本质就是一堆C、C++的头文件和实现文件打包成一个库。目前Android系统支持以下七种不用的CPU架构,每一种对应着各自的应用程序二进制接口ABI:(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。对应关系如下:

ARMv5——armeabi
ARMv7 ——armeabi-v7a
ARMv8——arm64- v8a
x86——x86
MIPS ——mips
MIPS64——mips64
x86_64——x86_64
五、JNI
(一) 什么是JNI?
oracle中关于JNI的指导

Java调用C/C++在Java语言里面本来就有的,并非Android自创的,即JNI。JNI就是Java调用C++的规范。当然,一般的Java程序使用的JNI标准可能和android不一样,Android的JNI更简单。

JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安卓兼职framework应用工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值