安卓硬件访问服务

Android学习笔记--[1]硬件访问服务_基础知识 应用程序——》硬件访问服务——》JNI——》硬件对于不同的硬件,构建不同的硬件访问服务。 阅读详情

安卓硬件访问服务

硬件访问服务通过硬件抽象层模块来为应用程序提供硬件读写操作。 由于硬件抽象层模块是使用C++语言开发的, 而应用程序框架层中的硬件访问服务是使用Java语言开发的, 因此, 硬件访问服务必须通过Java本地接口(Java Native Interface, JNI) 来调用硬件抽象层模块的接口。

image-20200716105744277

Android系统的硬件访问服务通常运行在系统进程System中, 而使用这些硬件访问服务的应用程序运行在另外的进程中, 即应用程序需要通过进程间通信机制来访问这些硬件访问服务。

Android系统提供了一种高效的进程间通信机制——Binder进程间通信机制, 应用程序就是通过它来访问运行在系统进程System中的硬件访问服务的。 Binder进程间通信机制要求提供服务的一方必须实现一个具有跨进程访问能力的服务接口, 以便使用服务的一方可以通过这个服务接口来访问它。 因此, 在实现硬件访问服务之前, 我们首先要定义它的服务接口。

定义硬件访问服务接口

Android系统提供了一种描述语言来定义具有跨进程访问能力的服务接口, 这种描述语言称为Android接口描述语言(Android Interface Definition Language, AIDL) 。 以AIDL定义的服务接口文件是以aidl为后缀名的, 在编译时, 编译系统会将它们转换成Java文件, 然后再对它们进行编译。

硬件访问服务接口定义 :

// frameworks\base\core\java\android\os\IFregService.aidl

package android.os;

interface IFregService 
{
    // 往虚拟硬件设备freg的寄存器val中写入一个整数
    void setVal(int val);
    // 从虚拟硬件设备freg的寄存器val中读出一个整数
    int getVal();
}

由于服务接口IFregService是使用AIDL语言描述的, 所以 需要将其添加到编译脚本文件中, 这样编译系统才能将其转换为Java文件, 然后再对它进行编译

编译脚本文件 :

# frameworks/base/Android.mk

## READ ME: ########################################################
##
## When updating this list of aidl files, consider if that aidl is
## part of the SDK API.  If it is, also add it to the list below that
## is preprocessed and distributed with the SDK.  This list should
## not contain any aidl files for parcelables, but the one below should
## if you intend for 3rd parties to be able to send those objects
## across process boundaries.
##
## READ ME: ########################################################
LOCAL_SRC_FILES += \
    core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl \
    #...
    core/java/android/net/IThrottleManager.aidl \
    core/java/android/nfc/IP2pTarget.aidl \
    core/java/android/os/IVibratorService.aidl \
    # 将需要的添加到编译脚本文件中
    core/java/android/os/IFregService.aidl \
    core/java/android/service/urlrenderer/IUrlRendererService.aidl \
    #...
    voip/java/android/net/sip/ISipService.aidl
#

编译 :

# 对硬件访问服务接口IFregService进行编译
mmm ./frameworks/base/

编译后得到的framework.jar文件就包含有IFregService接口, 它继承了android.os.IInterface接口。

在IFregService接口内部, 定义了一个Binder本地对象类Stub,它实现了IFregService接口, 并且继承了android.os.Binder类。 此外, 在IFregService.Stub类内部, 还定义了一个Binder代理对象类Proxy, 它同样也实现了IFregService接口。

用AIDL定义的服务接口是用来进行进程间通信的, 其中, 提供服务的进程称为Server进程, 而使用服务的进程称为Client进程。

在Server进程中, 每一个服务都对应有一个Binder本地对象, 它通过一个桩(Stub) 来等待Client进程发送进程间通信请求。

Client进程在访问运行Server进程中的服务之前, 首先要获得它的一个Binder代理对象接口(Proxy) , 然后通过这个Binder代理对象接口向它发送进程间通信请求。

image-20200716110435819

实现硬件访问服务

硬件访问服务实现 :

// frameworks\base\services\java\com\android\server\FregService.java

package com.android.server;

import android.content.Context;
import android.os.IFregService;
import android.util.Slog;

// 硬件访问服务 FregService 继承了 IFregService.Stub 类
public class FregService extends IFregService.Stub 
{
    private static final String TAG = "FregService";

    private int mPtr = 0;

    FregService() 
    {
        // 调用 JNI 方法 init_native 来打开虚拟硬件设备 freg ,
        // 并且获得它的一个句柄值, 保存在成员变量 mPtr 中
        // 这个句柄值实际上是指向虚拟硬件设备freg在硬件抽象层中的一个设备对象
        mPtr = init_native();

        if(mPtr == 0) 
        {
            Slog.e(TAG, "Failed to initialize freg service.");
        }
    }

    public void setVal(int val) 
    {
        if(mPtr == 0) 
        {
            Slog.e(TAG, "Freg service is not initialized.");
            return;
        }
        // 调用 JNI 方法 setVal_native 来写虚拟硬件设备 freg 的寄存器 val
        setVal_native(mPtr, val);
    }    

    public int getVal() 
    {
        if(mPtr == 0) 
        {
            Slog.e(TAG, "Freg service is not initialized.");
            return 0;
        }

        //调用 JNI 方法 getVal_native 来读虚拟硬件设备 freg 的寄存器 val
        return getVal_native(mPtr);
    }

    private static native int init_native();
    private static native void setVal_native(int ptr, int val);
    private static native int getVal_native(int ptr);
};
# 重新编译 Android 系统的 services 模块
mmm ./frameworks/base/services/java/

编译后得到的services.jar文件就包含有FregService类

实现硬件访问服务的JNI方法

实现了硬件访问服务FregService的JNI方法:

// frameworks\base\services\jni\com_android_server_FregService.cpp

#define LOG_TAG "FregServiceJNI"

#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"

#include <utils/misc.h>
#include <utils/Log.h>
#include <hardware/hardware.h>
#include <hardware/freg.h>

#include <stdio.h>

namespace android
{
    //设置虚拟硬件设备 freg 的寄存器的值
    static void freg_setVal(JNIEnv* env, jobject clazz, jint ptr, jint value) 
    {
        int val = value;

        //将参数 ptr 转换为 freg_device_t 结构体变量
        freg_device_t* device = (freg_device_t*)ptr;
        if(!device)
        {
            LOGE("Device freg is not open.");
            return;
        }

        LOGI("Set value %d to device freg.", val);

        device->set_val(device, val);
    }

    //读取虚拟硬件设备freg的寄存器的值
    static jint freg_getVal(JNIEnv* env, jobject clazz, jint ptr)
    {
        int val = 0;

        //将传输ptr转换为 freg_device_t 结构体变量
        freg_device_t* device = (freg_device_t*)ptr;
        if(!device) 
        {
            LOGE("Device freg is not open.");
            return 0;
        }

        device->get_val(device, &val);

        LOGI("Get value %d from device freg.", val);

        return val;
    }

    //打开虚拟硬件设备freg
    static inline int freg_device_open(const hw_module_t* module, 
                                       struct freg_device_t** device) 
    {
        return module->methods->open(module, 
                                     FREG_HARDWARE_DEVICE_ID, 
                                     (struct hw_device_t**)device);
    }

    //初始化虚拟硬件设备freg
    static jint freg_init(JNIEnv* env, jclass clazz)
    {
        freg_module_t* module;
        freg_device_t* device;

        LOGI("Initializing HAL stub freg......");

        //加载硬件抽象层模块freg
        // 根据 FREG_HARDWARE_MODULE_ID 来加载 Android 硬件抽象层模块 freg
        if(hw_get_module(FREG_HARDWARE_MODULE_ID, 
                         (const struct hw_module_t**)&module) == 0) 
        {
            LOGI("Device freg found.");
            //打开虚拟硬件设freg , 打开设备ID为 FREG_HARDWARE_DEVICE_ID 的硬件设备
            if(freg_device_open(&(module->common), &device) == 0) 
            {
                LOGI("Device freg is open.");
                //将freg_device_t 接口转换为整型句柄值值返回
                return (jint)device;
            }

            LOGE("Failed to open device freg.");
            return 0;
        }

        LOGE("Failed to get HAL stub freg.");

        return 0;
    }

    //java本地接口方法表
    // 把JNI方法表method_table注册到Java虚拟机
    // 将函数freg_init、 freg_setVal和 freg_getVal的JNI方法注册
    //为init_native、 setVal_native和 getVal_native
    static const JNINativeMethod method_table[] = {
        {"init_native", "()I", (void*)freg_init},
        {"setVal_native", "(II)V", (void*)freg_setVal},
        {"getVal_native", "(I)I", (void*)freg_getVal},
    };

    //注册java本地接口方法
    int register_android_server_FregService(JNIEnv *env) 
    {
        return jniRegisterNativeMethods(env, 
                                        "com/android/server/FregService", 
                                        method_table, 
                                        NELEM(method_table));
    }

};

增加 register_android_server_FregService函数的声明和调用 :

onload.cpp文件实现在libandroid_servers模块中。 当系统加载libandroid_servers模块时, 就会调用实现在onload.cpp文件中的JNI_OnLoad函数。 这样, 就可以将前面定义的三个JNI方法init_native、 setVal_native和getVal_native注册到Java虚拟机中

image-20200716121659492

// frameworks/base/services/jni/onload.cpp

#include "JNIHelp.h"
#include "jni.h"
#include "utils/Log.h"
#include "utils/misc.h"

namespace android 
{
// ...
int register_android_server_location_GpsLocationProvider(JNIEnv* env);
    // 声明
int register_android_server_FregService(JNIEnv* env);
};

using namespace android;

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) {
        LOGE("GetEnv failed!");
        return result;
    }
    LOG_ASSERT(env, "Could not retrieve the env!");

    //...
    register_android_server_location_GpsLocationProvider(env);
    //调用
    register_android_server_FregService(env);

    return JNI_VERSION_1_4;
}

进入到frameworks/base/services/jni目录中, 打开里面的Android.mk文件, 修改变量LOCAL_SRC_FILES的值

# frameworks/base/services/jni/Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

# 修改变量LOCAL_SRC_FILES的值
LOCAL_SRC_FILES:= \
    #...
    com_android_server_location_GpsLocationProvider.cpp \
    com_android_server_FregService.cpp \
    onload.cpp

LOCAL_C_INCLUDES += \
    $(JNI_H_INCLUDE)

LOCAL_SHARED_LIBRARIES := \
    libandroid_runtime \
    libcutils \
    libhardware \
    libhardware_legacy \
    libnativehelper \
    libsystem_server \
    libutils \
    libui \
    libsurfaceflinger_client

ifeq ($(TARGET_SIMULATOR),true)
ifeq ($(TARGET_OS),linux)
ifeq ($(TARGET_ARCH),x86)
LOCAL_LDLIBS += -lpthread -ldl -lrt
endif
endif
endif

ifeq ($(WITH_MALLOC_LEAK_CHECK),true)
    LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK
endif

LOCAL_MODULE:= libandroid_servers

include $(BUILD_SHARED_LIBRARY)
# 重新编译libandroid_servers模块 , 得到的libandroid_servers.so文件
mmm ./frameworks/base/services/jni/

编译后得到的libandroid_servers.so文件就包含有init_native、 setVal_native和getVal_native这三个JNI方法

启动硬件访问服务

Android系统的硬件访问服务通常是在系统进程System中启动的, 而系统进程System是由应用程序孵化器进程Zygote负责启动的。 由于应用程序孵化器进程Zygote是在系统启动时启动的, 所以要把硬件访问服务运行在系统进程System中, 就实现了开机时自动启动

image-20200716102646715

打开里面的SystemServer.java文件, 修改ServerThread类的成员函数run的实现

// frameworks/base/services/java/com/android/server/SystemServer.java
//...
class ServerThread extends Thread 
{
    //...
    // 修改 ServerThread 类的成员函数run的实现
    @Override
    public void run() 
    {
        //...
        if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) 
        {
            //...
            try {
                Slog.i(TAG, "DiskStats Service");
                ServiceManager.addService("diskstats", new DiskStatsService(context));
            } catch (Throwable e) {
                Slog.e(TAG, "Failure starting DiskStats Service", e);
            }

            try {
                Slog.i(TAG, "Freg Service");
                ServiceManager.addService("freg", new FregService());
            } catch (Throwable e) {
                Slog.e(TAG, "Failure starting Freg Service", e);
            }
        }
        //...
    }
}

//...

系统进程System在启动时, 会创建一个ServerThread线程来启动系统中的关键服务,其中就包括一些硬件访问服务。

在ServerThread类的成员函数run中, 首先创建一个FregService实例, 然后把它注册到Service Manager中。 Service Manager是Android系统的Binder进程间通信机制的一个重要角色, 它负责管理系统中的服务对象。

注册到Service Manager中的服务对象都有一个对应的名称, 使用这些服务的Client进程就是通过这些名称来向Service Manager请求它们的Binder代理对象接口的, 以便可以访问它们所提供的服务。 硬件访问服务FregService注册到Service Manager之后, 它的启动过程就完成了

image-20200716103437599

# 重新编译services模块
mmm ./frameworks/base/services/java/

编译后得到的services.jar文件就包含有硬件访问服务FregService, 并且在系统启动时, 将它运行在系统进程System中

# 重新打包Android系统镜像文件system.img
make snod
Android硬件服务访问:使用JNI方法实现Java与硬件服务接口的交互 通过以上步骤,我们成功地使用JNI方法提供了Java访问硬件服务接口的能力。你可以根据实际需求,进一步扩展JNI方法的功能,实现更复杂的硬件服务交互。首先,我们需要创建一个JNI文件,用于编写与硬件服务交互的本地方法。在"HardwareServiceJNI"文件中,我们可以编写与硬件服务交互的本地方法。在Java代码中,我们可以通过调用JNI方法来实现与硬件服务的交互。Android硬件服务访问:使用JNI方法实现Java与硬件服务接口的交互。方法,来打开和关闭名为"sensor"的硬件服务。 阅读详情

相关推荐

android通过硬件访问服务访问硬件LED

android通过硬件访问服务访问硬件LED,包括硬件访问服务访问LED的所有文件。aidl,led服务,onload.cpp文件,SystemServer.java,JNI文件等代码

Android硬件访问服务 (硬核最终篇)

Android服务访问流程 (硬核最终篇) 一、调用关系及流程简要 SystemService.java:(调库、启动服务) 1.System.loadLibbrary(“android_servers”); libandroid_servers.so依赖jni文件夹下所有的com_android_server_xxx Service.cpp文件和onload.cpp文件。 System.loa...

阿路 1021

andriod硬件访问硬件服务框架–流程(思维导图)

安卓多个应用程序的时候 同时访问硬件 会造成冲突 所以就是用 server框架 写server的框架 有些复杂 就用流程图 表示出来 大概开发应用程序的时候 就是这个流程图 后面 有详细开发按按理—–led server框架开发 根据流程图编写代码 写一个 AIDL 文件 把文件放入 /home/book/Desktop/android-5.0.2/frameworks/base/core/java/android/os 在 book@ubuntu:~/Desktop/android-5.0.2/frameworks/base$ ls Android.mk 找到 An

第二章:硬件访问服务(4)-HAL编写

通过前面的学习,我们知道怎么通过andriod硬件访问服务控制硬件,再次贴出框图如下 其中红色圈出部分我们已经完成,我们知道在andriod系统中,java程序是无法直接访问硬件的,他访问硬件需要service_manager.c发出请求,才能操控硬件,之前我们通过com_android_server_LedService.cpp直接访问硬件,这种方法一般不被推荐,主要有以下几点 1.单我们需要......

江南才尽江南山,年少无知年少狂! 1081

Realtek 10GbE芯片组解析:低成本高速网络方案

10GbE(万兆以太网)技术通过提升网络带宽,显著改善了数据传输效率,成为现代网络架构的核心组件。其工作原理基于高速串行通信协议,通过优化信号处理和编码技术实现低延迟、高吞吐量。在技术价值上,10GbE不仅满足数据中心和企业网络的高需求,还逐步渗透到消费级市场,推动家庭和小型企业的网络升级。应用场景包括NAS存储、视频编辑工作站和云服务接入等。Realtek最新发布的RTL8127、RTL8159和RTL8261C芯片组,以低功耗和低成本优势,进一步降低了10GbE的普及门槛。这些芯片支持PCIe Gen4

weixin_36427956的博客 592

【yolov8】与yolov5的区别及改进详解

yolov8-----有点厉害的目标检测框架.

qq_44878985的博客 3万+

Android硬件访问服务-Service

Android有四大组件: 一、Activity 二、Service 三、Broadcast Receiver 四、Content ProviderService是Android中一个类,它是Android四大组件之一,使用Service可以在后台执行长时间的操作( perform long-running operations in the background ),Service并不与用

itdo_just的博客 2843

基于 CodeMirror 6 与 Vite 构建极简在线代码编辑器的核心原理与实践

在线代码编辑器是前端开发领域的重要工具,它允许开发者在浏览器中直接编写、运行和调试代码。其核心原理通常基于成熟的编辑器内核(如 CodeMirror 或 Monaco Editor)与实时预览技术,通过 iframe 沙箱实现代码的安全执行。这类技术的核心价值在于提供了轻量级、可嵌入、零配置的编码环境,极大地提升了代码演示、教学、快速原型验证的效率。在实际应用中,它常被集成到技术文档、在线教程和协作平台中,用于创建可交互的示例。本文以 **CodeMirror 6** 和 **Vite** 构建的极简编辑器

weixin_30652491的博客 337

四、Android硬件访问服务框架

Android硬件访问服务框架 一 概括 只让SystemServer访问硬件,应用程序APP将访问硬件的请求发给systemserver,由它统一管理,这就是硬件访问服务。 SystemServer通过loadlibrary 加载C库。硬件底层都是用C写的,systemserver用java写的,中间肯定要通过JNI接口,所以加载C库 在C库的JNI_Onload 函数中注册本地方法。 ...

AIoT技术栈的博客 586

AquaCrop-OSPy学习笔记02:模型输入设置

AquaCrop-OSPy的输入设置

EWBA_GIS_RS_ER的博客 3699

龙芯2K1000 OTG双模驱动深度解析

是Synopsys公司开发的USB 2.0 OTG控制器IP核,龙芯2K1000内置该IP,作为唯一的OTG控制器(PCI Dev4 Func0),物理基地址0x40000000。核心能力:同时支持Host主机模式(接U盘/键盘)、Device设备模式(虚拟串口ttyGS0)、OTG双模自动切换速率驱动路径:内核源码PMON:启用otg0设备树内核:开启HOSTPERIPHERALG_SERIAL启动参数脚本:sysfs角色切换+开机自启Host按以上配置,龙芯2K1000 DWC2 OTG可完美实现。

weixin_44932366的博客 377

Android硬件访问服务

Android访问硬件常用的两种方式:通过JNI接口直接访问、通过Android硬件访问服务 通过JNI接口直接访问 Android应用程序通过loadLibrary函数加载C库,C库被加载时里面的JNI_Onload函数被调用,该函数注册了本地方法,来访问硬件驱动程序,从而控制硬件 。 Android硬件访问服务 应用程序只有systemserver能够访问硬件,

小跃_进击 573

融合双主干网络提升YOLOv8性能一种基于SOTA思想的目标检测改进

YOLOv8采用了单一的主干网络进行特征提取,通常是基于CSPDarknet作为骨干网络,在目标检测过程中通过不同的卷积层提取不同尺度的信息。虽然这种设计在大多数应用场景下表现出色,但在面对复杂背景、细节丰富的物体或小物体检测时,YOLOv8有时难以保持良好的精度。在本文中,我们提出了一种基于双主干网络的YOLOv8改进方案,通过结合先进的SOTA思想,全面提升了YOLOv8在目标检测任务中的表现。双主干网络架构。

博客 1154

android+硬件服务,android之硬件访问服务框架

一、硬件接口描述文件aidl新增\frameworks\base\core\java\android\os\ILedService.aidl二、mk编译脚本修改vi frameworks/base/Android.mk编译命令及效果图:编译输出:/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/a...

weixin_29655399的博客 233

编程实践:寒武纪-LLM&VLM模型量化&部署

本文介绍了在MLU370-S4平台上对大模型(LLM/VLM)进行量化的两种方法:SmoothQuant和WeightOnly。以Qwen2-VL-2B模型为例,详细说明了两种量化方式的命令行参数配置,包括必须设置的per_channel选项和量化参数调整建议。量化完成后,提供了模型部署的具体命令示例,包含设备分配、端口设置、并行度等关键参数。文章强调在MLU370芯片上需要手动设置block_size,并指出两种量化方式只能二选一使用。配套资料已上传至百度网盘供参考。

微风❤水墨 511

YooAsset 学习

YooAssets使用教程

weixin_44884538的博客 1659

开发Android硬件访问服务

在http://blog.youkuaiyun.com/getnextwindow/article/details/47731597中,为Android系统添加了HAL模块,开发好一个硬件抽象层以后,我们通常还需要在应用程序框架中实现一个硬件访问服务。硬件访问服务通过硬件抽象层(HAL)模块来为应用程序提供读写操作。由于硬件抽象层使用c++开发,而应用程序框架中的硬件访问服务是Java语言开发的,因此,硬件访问

GetnextWindow的专栏 2458

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android+硬件服务,Android硬件服务访问流程

Android硬件服务访问流程SystemService.java:(调库、启动服务)1.System.loadLibbrary(“android_servers”);libandroid_servers.so依赖jni文件夹下所有的com_android_server_xxx Service.cpp文件和onload.cpp文件。System.loadLibbrary()函数会调用JNI_OnL...

weixin_33603316的博客 276

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android硬件访问服务 JNI实现 图解调用关系

Android硬件访问服务 硬件访问服务通过硬件抽象层模块来为应用程序提供硬件读写操作。 由于硬件抽象层模块是使用C++语言开发的, 而应用程序框架层中的硬件访问服务是使用Java语言开发的, 因此, 硬件访问服务必须通过Java本地接口(Java Native Interface, JNI) 来调用硬件抽象层模块的接口。 Android系统的硬件访问服务通常运行在系统进程System中, 而使用这些硬件访问服务的应用程序运行在另外的进程中, 即应用程序需要通过进程间通信机制来访问这些硬件访问服务。

记录点点滴滴 987

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

3 Android硬件访问服务 JNI实现

Android系统的硬件访问服务通常运行在系统进程System中, 而使用这些硬件访问服务的应用程序运行在另外的进程中, 即应用程序需要通过进程间通信机制来访问这些硬件访问服务。 Android系统提供了一种高效的进程间通信机制——Binder进程间通信机制, 应用程序就是通过它来访问运行在系统进程System中的硬件访问服务的。 Binder进程间通信机制要求提供服务的一方必须实现一个具有跨进程访问能力的服务接口, 以便使用服务的一方可以通过这个服务接口来访问它。 因此, 在实现硬件访问服务之前, 我们首

MrPeng的博客 461

Android 硬件访问服务

怎么实现硬件访问服务 1、JNI和HAL com_andorid_server_ledService.cpp hal_led.c 2、修改onload.cpp 调用 com_andorid_server_ledService.cpp 实现的函数 3、修改systemServer.java     new ledService & addService

漫不经心 910

Android硬件服务访问流程

Android硬件服务访问流程 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-phXht2Rc-1581134814880)(E:\Users\ZhangZhilu\Desktop\Android底层开发\第二部分\Android服务访问流程.png)] SystemService.java:(调库、启动服务) 1.System.loadLibbrary(“andr...

阿路 552

android+硬件服务,2.4.2 实现硬件访问服务

在Android系统中,通常把硬件访问服务实现在frameworks/base/services/java/com/android/server目录中。因此,我们把实现了硬件访问服务FregService的FregService.java文件也保存在这个目录中,它的内容如下所示。**frameworks/base/services/java/com/android/server/FregServi...

weixin_33417140的博客 133
上一篇: Android安卓应用
下一篇: 安卓硬件驱动开发
onnx
博客等级 码龄5年 1万+粉丝 416原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

onnx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值