android调用底层原理

android中app调用c过程

在这里插入图片描述
在这里插入图片描述

什么是JNI?

是一种协议,并提供一套编程框架,让java和本地语言(C/C++)之间能够相互调用。
JNI简单来说就是java程序可以调用C/C++写的动态链接库

为什么需要JNI

Java由于是平台无关语言,通过不同操作系统下具有相同功能的JVM实现一次编译,可以到处运行。也正是因为JVM,使得Java程序运行的效率相对于C/C++等本地语言较低,而且不能像C/C++一样直接操作底层硬件。

什么是NDK

Native Development Kit 本地开发工具集。简单的说就是一整套工具,用来构建、编译本地c/c++源程序,生成.so动态库,加入本地库中,让Android应用程序中Java程序通过jni调用。

能再具体点写出调用过程吗

在这里插入图片描述

那小朋友们怎么知道android如何控制硬件的?

andirod的硬件抽象层HAL,运行在用户空间中,它向下屏蔽硬件驱动模块的实现细节,向上提供硬件访问服务。Android系统分为两层来支持硬件设备,其中一层实现在用户空间(User Space),另外一层是现在内核空间(Kernel Space)。传统的Linux系统把对硬件的支持完全是现在在内核空间,即把对硬件的支持完全实现在硬件驱动模块中。
在这里插入图片描述
因为在linux内核中会损害厂家的利益
因此,Android才会想到把对硬件的支持分成硬件抽象层和内核驱动层( ioctrl ),内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,这样就可以把商业秘密隐藏起来了。
在这里插入图片描述

详细

在这里插入图片描述

Kernel Driver

这里的kernel driver相对于linux真正的driver形式上是一样的,也提供open,read,write,ioctl,mmap等接口,但是,一般来说,只通过这些代码,你并不能了解到硬件的特性,比如write接口,就可以只作成往寄存器写操作,至于如何写,为什么要写,这些工作都会再HAL层进行,而一般用户是看不到这些代码的。这也是为什么linux mainstream把android的kernel踢出去的原因,因为这些driver根本无法用在其他的linux平台上。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值