Linux驱动怎么在Android上使用

  最近有Android的项目,学习下在Android上调用Linux驱动的开发流程,找到两个不错的资源。
  推荐一篇文章和一个视频:
  文章:Android硬件抽象层(HAL)概要介绍和学习计划
  视频:Android HAL编程实战
  都讲得很好,浅显易懂。
  


  然后讲下自己的理解:

HAL层

  Android 的Hal层是为了给不开放源码的厂商准备,编译Hal代码时会将其编译为.so文件使用。在Hal层中有几个主要的结构,分别是struct hw_module_tstruct hw_module_methods_t 以及struct hw_device_t,这三个结构的主要关系如下图:
在这里插入图片描述

  这三个结构体在使用时候是以被包含的形式存在,并且包含它的结构体必须把其放在第一个成员的位置上,这样可以进行相关结构的强制转换。例如上述文章链接中Hal的代码:

/*硬件模块结构体*/  
struct hello_module_t {  
    struct hw_module_t common;  
};  
/*硬件接口结构体*/  
struct hello_device_t {  
    struct hw_device_t common;  
    int fd;  
    int (*set_val)(struct hello_device_t* dev, int val);  
    int (*get_val)(struct hello_device_t* dev, int* val);  
};  

  通常,我们会在hardware/libhardware/include/hardware下定义头文件,在hardware/libhardware/modules/下创建新的文件夹用于存放源文件。
  源文件中会对上述三个结构体进行实例化,并且实现相关功能函数,包括open、close、自定义功能函数等。
  完成Hal的源文件代码编写后,在源文件的同目录下增加Android.mk文件,将Hal代码加入Android系统中。可以使用mmm命令对其单独编译,编译后生成.so的库文件。
  得到库文件后,上层可以使用hw_get_module() 函数,获取对应的struct hw_module_t结构,hw_get_module() 函数的调用关系如下图:
在这里插入图片描述
  HAL涉及的文件(参考上述文章):

文件名hello.hhello.cuevent.rcandroid.mkhello.default.so
所在目录hardware/libhardware/include/hardwarehardware/libhardware/modules/hellosystem/core/rootdirhardware/libhardware/modules/helloout/target/product/generic/system/lib/hw
作用定义设备hal相关结构hal层访问linux内核驱动的源码改变设备节点权限,让Hal可以调用编译加载编译完成后输出的库文件

JNI层

  JNI(Java Native Interface),用于提供接口给Java Framework Server,代码路径为:frameworks/base/services/jni。
  JNI的接口代码中使用hw_get_module() 函数获得struct hw_module_t结构,利用struct hw_module_t结构去调用open、close等相关功能函数,代码如下:

       /*通过硬件模块ID来加载指定的硬件抽象层模块并打开硬件*/  
    static jboolean hello_init(JNIEnv* env, jclass clazz) {  
        hello_module_t* module;  
          
        LOGI("Hello JNI: initializing......");  
        if(hw_get_module(HELLO_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0) {  
            LOGI("Hello JNI: hello Stub found.");  
            if(hello_device_open(&(module->common), &hello_device) == 0) {  
                LOGI("Hello JNI: hello device is open.");  
                return 0;  
            }  
            LOGE("Hello JNI: failed to open hello device.");  
            return -1;  
        }  
        LOGE("Hello JNI: failed to get hello stub module.");  
        return -1;        
    }  

  完成这些接口代码后,使用jniRegisterNativeMethods() 函数进行JNI方法注册。注册代码如下:

        /*JNI方法表*/  
    static const JNINativeMethod method_table[] = {  
        {"init_native", "()Z", (void*)hello_init},  
        {"setVal_native", "(I)V", (void*)hello_setVal},  
        {"getVal_native", "()I", (void*)hello_getVal},  
    };  
        /*注册JNI方法*/  
    int register_android_server_HelloService(JNIEnv *env) {  
            return jniRegisterNativeMethods(env, "com/android/server/HelloService", method_table, NELEM(method_table));  
    }  

  完成JNI方法注册后,需要通过修改onload.cpp 文件将JNI的源文件加载到Android系统中,并进行相关编译生成.so文件,具体可以参考上述文章链接中的JNI部分。
  JNI涉及的文件:

文件名com_android_server_HelloService.cpponload.cppAndroid.mk
所在目录frameworks/base/services/jniframeworks/base/services/jniframeworks/base/services/jni
作用jni接口源码编译jni编译jni接口源码

Framework Service

  Framework Service需要编写aidl文件和相关服务的java文件。
  aidl(Android interface definition language),是为了实现Android进程间通信而设计的语言。aidl文件的代码内容如下:

package android.os;  
   
interface IHelloService {  
    void setVal(int val);  
    int getVal();  
}  

  Android系统编译时会根据aidl文件生成相应的stub接口,而java文件中定义的类会继承stub接口,我们只需在java文件中利用JNI提供的接口去实现setVal和getVal两个功能函数即可,具体代码如下:

package com.android.server;  
import android.content.Context;  
import android.os.IHelloService;  
import android.util.Slog;  
public class HelloService extends IHelloService.Stub {  
    private static final String TAG = "HelloService"; 
    //构造函数 
    HelloService() {  
        init_native();  
    }  
    public void setVal(int val) {  
        setVal_native(val);  
    }     
    public int getVal() {  
        return getVal_native();  
    }  
    
    //JNI的接口函数声明
    private static native boolean init_native();  
    private static native void setVal_native(int val);  
    private static native int getVal_native();  
};  

  Framework Service涉及的文件

文件名IHelloService.aidlAndroid.mkHelloService.javaSystemServer.java
所在目录frameworks/base/core/java/android/osframeworks/baseframeworks/base/services/java/com/android/serverframeworks/base/services/java/com/android/server
作用与硬件服务进程通讯,增加操作接口配置需要编译的源文件调用jni方法,为frameworks提供硬件服务接口系统服务

APP

  APP不会写。看资料是根据stub函数提供的接口,转换为aidl的接口,再用aidl提供的两个setVal和getVal函数进行相关操作。
  
  
  
  
  
  
  
  
  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: linux-android-韦根驱动 jni.rar 是一个文件名,其中包含了与韦根驱动相关的文件。 Linux是一种开源的操作系统,广泛应用于各种计算机设备。它具有优秀的稳定性、安全性和可定制性。Android是基于Linux内核开发的移动操作系统,目前在智能手机等智能设备上广泛使用。 韦根(Wiegand)驱动是一种用于读取磁卡、感应卡等卡片数据的驱动程序。它使用韦根协议来传输卡片的数据。韦根协议是一种串行通信协议,常用于门禁系统、考勤系统等场景中。这个驱动程序可以使得Linux系统和Android系统能够读取和处理韦根卡片的数据。 JNI(Java Native Interface)是一种Java编程语言的编程框架,用于在Java程序中调用其他语言(如C/C++)编写的本地代码。在这里,JNI用来链接LinuxAndroid系统的驱动程序和Java程序之间的接口。通过JNI,Java程序可以调用韦根驱动的功能,读取韦根卡片的数据并进行相应的处理。 而 ".rar" 则是一种常见的文件压缩格式,它可以将多个文件或文件夹压缩成一个单独的文件,以方便传输和存储。所以,"linux-android-韦根驱动 jni.rar" 这个文件可能是包含了与韦根驱动功能相关的LinuxAndroid系统驱动程序以及JNI接口的压缩文件。 ### 回答2: "linux-android-韦根驱动 jni.rar" 是一个压缩文件,包含了用于在 LinuxAndroid 系统上支持韦根驱动的 JNI(Java Native Interface)代码。 Linux 是一个开源的操作系统内核,Android 则是基于 Linux 内核开发的移动设备操作系统。韦根驱动是一种用于读取条码信息的通信协议,常用于条码扫描仪等设备。 这个压缩文件包含了 JNI 的相关代码,JNI 是 Java 提供的机制,用于在 Java 程序中调用本地(C/C++)代码。由于韦根驱动是由本地代码实现的,所以需要使用 JNI 将其与 Java 程序进行交互。 在 Linux 系统上,可以使用这个 JNI 文件来编译并生成与韦根驱动相关的动态链接库(.so 文件),以便在 Java 程序中调用。在 Android 系统上,可以将这个 JNI 文件与其它 Android 项目一起编译,并将生成的 .so 文件集成到 Android 应用中,以实现对韦根驱动的调用。 这个压缩文件的具体内容可能包括 JNI 源代码、头文件以及必要的编译脚本。如果你想使用这个韦根驱动,你可能需要先解压这个压缩文件,然后参考其中的文档或指南,按照指导进行相应的编译和集成工作。 总之,"linux-android-韦根驱动 jni.rar" 是一个提供了在 LinuxAndroid 系统上支持韦根驱动的 JNI 代码文件,通过使用它,你可以将韦根驱动融入到你的 Java 或 Android 项目中,并实现对该驱动的功能调用。 ### 回答3: Linux是一种开源的操作系统,广泛用于服务器、桌面电脑和嵌入式设备。而Android是基于Linux内核开发的移动操作系统,主要运行于智能手机、平板电脑和其他便携式设备上。韦根驱动是一种用于与韦根协议进行通信的驱动程序,通过JNI(Java Native Interface)将Java代码与本地代码进行交互。 在开发Android应用程序时,我们经常会使用JNI技术来调用C/C++编写的本地代码,以实现一些特定功能或与底层进行交互。在这个过程中,我们需要将本地代码打包成库文件,然后从Java层进行调用。 韦根驱动JNI.rar可能是一个包含了韦根协议通信所需的本地代码的压缩文件。其中可能包含了以C/C++语言编写的代码和一些与之相关的资源文件。通过解压缩这个文件,我们可以得到驱动程序所需的源代码和资源文件,从而进行进一步的开发和调试。 这个韦根驱动JNI.rar文件可能为开发者提供了一种在Android平台上与韦根协议设备进行通信的解决方案。通过将相关的代码集成到Android应用程序中,开发者可以实现与韦根协议设备之间的数据交互,从而实现特定的功能或满足特定的需求。 总之,Linux是操作系统,Android是基于Linux的移动操作系统,韦根驱动是用于与韦根协议进行通信的驱动程序,而韦根驱动JNI.rar可能是一个包含了韦根驱动的本地代码的压缩文件,用于在Android平台上实现与韦根协议设备的通信。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr_zhangsq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值