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库
扫描二维码关注公众号,回复:
2609042 查看本文章
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、出于保密