JNI与底层调用-1

Java Native Interface(JNI),它允许Java 代码和其他语言写的代码进行交互。JNI 一开始是为了本地已编译语言,尤其是C 和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。Java Native Interface,java本地接口,Native本地,当前系统用什么语言开发的那么 这种语言对于这个系统而言就是本地语言
摘要由CSDN通过智能技术生成

JNI开发系列阅读

JNI与底层调用1:http://blog.csdn.net/axi295309066/article/details/60758515
JNI与底层调用2:http://blog.csdn.net/axi295309066/article/details/60778076
C/C++在Android开发中的应用:http://blog.csdn.net/axi295309066/article/details/60954771

1. JNI 简介

1.1 什么是JNI

Java Native Interface(JNI),它允许Java 代码和其他语言写的代码进行交互。JNI 一开始是为了本地已编译语言,尤其是C 和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
Java Native Interface,java本地接口,Native本地,当前系统用什么语言开发的那么 这种语言对于这个系统而言就是本地语言,android底层是linux linux是c/c++开发的 所以对于android来说 c/c++就是本地语言。JNI 可以看做是一个翻译 实现JAVA语言和本地语言之间的相互调用

1.2 为什么用JNI

  • JNI 扩展了Java 虚拟机的能力,因为Java 不能直接和硬件交互, 不能开发驱动
  • Java 代码效率一般要低于C 代码,而Native code 效率高,因此在数学运算,实时渲染的游戏上以及音视频处理上都需要用Java 调用C 语言
  • 复用C/C++代码,C 语言经过几十年的发展,已经形成了强大的类库(比如文件压缩,人脸识别opencv,7zip,ffmpeg 等),这些类库我们没必要用java 语言重新实现一遍,通过JNI 直接调用这些类库即可
  • 特殊的业务场景,比如电视、车载系统、微波炉等跟硬件直接相关的开发
  • java代码 不可以直接操作硬件 硬件的驱动基本都是C代码写的 如果想操作硬件必须得让java代
    码可以调用C,这个时候JNI就发挥作用了 可以扩展JAVA代码的性能
  • java代码安全性比较差 java->,class->. C安全性相对高一些 C编译之后直接生成机器码 机器码可以反汇编 汇编代码可以猜出C的源代码 伪代码 有些时候跟源代码有区别 比如登录先关 跟钱打交道的应用 可以通过JNI把加密的业务逻辑放到C里面实现
  • Java特点 跨平台 一处编译到处运行 通过虚拟机来实现的 java是解释型语言 效率相对比较低在要求效率的地方 java性能会差一些 大型3d游戏 c/c++ 音视频解码 JNI可以提升java的效率 复式投注 需要效率的时候可以通过JNI来调用C/C++来实现
  • c1972年 c++ java 1995年 ffmpeg音视频解码 opencv 图像处理 人脸识别 使用JNI可以让java代码调用 c/c++写的优秀开源项目,学习JNI目的是满足自己项目的需求

2. NDK 简介

2.1 NDK 产生的背景

Android 平台从诞生起,就已经支持C、C++开发。众所周知,Android 的SDK 基于Java 实现,这意味着基于Android SDK 进行开发的第三方应用都必须使用Java 语言。但这并不等同于“第三方应用只能使用Java”。在Android SDK 首次发布时,Google 就宣称其虚拟机Dalvik 支持JNI 编程方式,也就是第三方应用完全可以通过JNI 调用自己的C 动态库,即在Android 平台上,“Java+C”的编程方式是一直都可以实现的。

不过,Google 也表示,使用原生SDK 编程相比Dalvik 虚拟机也有一些劣势,Android SDK 文档里,找不到任何JNI 方面的帮助。即使第三方应用开发者使用JNI 完成了自己的C 动态链接库(so)开发,但是so 如何和应用程序一起打包成apk 并发布?这里面也存在技术障碍。比如程序更加复杂,兼容性难以保障,无法访问Framework API,Debug 难度更大等。开发者需要自行斟酌使用。

于是NDK 就应运而生了。NDK 全称是Native Development Kit。

NDK 的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。NDK 将是Android 平台支持C 开发的开端。

2.2 为什么使用NDK

  • 代码的保护。由于apk 的java 层代码很容易被反编译,而C/C++库反编译难度较大
  • 可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的
  • 提高程序的执行效率。将要求高性能的应用逻辑使用C 开发,从而提高应用程序的执行效率
  • 便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用

2.3 NDK 简介

2.3.1 NDK 是一系列工具的集合

NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so 和java 应用一起打包成apk。NDK 集成了交叉编译器,并提供了相应的mk 文件隔离CPU、平台、ABI 等差异,开发人员只需要简单修改mk 文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

2.3.2 NDK 提供了一份稳定、功能有限的API 头文件声明

Google 明确声明该API 是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API 支持的功能非常有限,包含有:C 标准库(libc)、标准数学库(libm)、压缩库(libz)、Log 库(liblog)。

3. NDK 的安装

3.1 NDK 的下载

NDK 的官方下载地址

ndk下载

3.2 将NDK 解压到一个不包含空格和中文的目录下

本人将NDK 解压在D:\software\ndkr9\android-ndk-r9b 中

3.3 NDK 目录结构说明

自定义好组合控件之后,之前的activity_setting.xml 中的代码就可以进行简化,具体如下所示:

jni

  • build:该目录存放的使用NDK 的mk 脚本,mk 脚本指定了编译参数
  • docs:该目录存放的是NDK 的使用帮助文档
  • platforms:这里面存放的是与各个Android 版本相关的平台(x86,arm,mips)相关C 语言库和头文件
  • prebuilt:预编译工作目录
  • samples:存放的是演示程序
  • sources:存放的是NDK 工具链的C 语言源码
  • tests:测试相关的文件
  • toolchains:工具链,存放了三种架构的静态库等文件
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值