1、Android 驱动 = linux驱动 + 封装

xiaoxiao2021-02-28  82

1、Android 驱动 = linux驱动 + 封装

1、(JNI访问)Java –> C库 app –>c库

2、硬件访问服务

通过硬件服务 | + JNI 硬件服务

硬件访问服务: 1、loadLibrary 加载C库

2、JNI_Onload:注册本地方法 (分别调用各个硬件的函数来注册本地方法) { LED { 振动器 { 串口

3、SystemServer:对每个硬件 {构造Service(使用本地方法) {addService

Server–>Service(服务器提供服务)

4、APP怎么使用{获得服务:getService {使用服务:执行service方法

/** * The main entry point from zygote. */ public static void main(String[] args) { new SystemServer().run(); }

加载C库

private void run() { // Initialize native services. System.loadLibrary("android_servers"); }

调用到onload.cpp

extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; jint result = -1; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { ALOGE("GetEnv failed!"); return result; } ALOG_ASSERT(env, "Could not retrieve the env!"); register_android_server_PowerManagerService(env); return JNI_VERSION_1_4; }

函数名+com前缀 com_android_server_SerialService.cpp(JNI文件) 完全可以在这个里面实现硬件操作的实现。

int register_android_server_VibratorService(JNIEnv *env) { //注册本地方法 return jniRegisterNativeMethods(env, "com/android/server/VibratorService", method_table, NELEM(method_table)); }

硬件操作过于复杂: 单独写在HAL文件 {1、容易修改 {2、出于保密

内核研究所 认证博客专家 Linux Kernel Android 一直从业于半导体行业,曾为Linux内核开源文档社区提交过若干文档。主要从事Linux、Android相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,喜欢阅读内核源代码,在不断的学习和工作中深入理解内存管理,进程调度,文件系统,设备驱动等内核子系统。
转载请注明原文地址: https://www.6miu.com/read-2250368.html

最新回复(0)