Ubuntu 에서 Android 를 위 한 Application Frameworks 계층 하드웨어 액세스 서비스 추가

디지털 기술 이 날로 발전 하 는 오늘날 소프트웨어 와 하드웨어 의 완벽 한 결합 은 스마트 모 바 일 기기 의 유행 을 만 들 었 다.오늘 iOS 와 안 드 로 이 드 시스템 에 대한 관심 은 어느 정도 이 두 시스템 에 다양한 애플 리 케 이 션 이 있 기 때문이다.따라서 소프트웨어 와 하드웨어 의 관 계 는 어느 정도 에 하드웨어 는 소프트웨어 를 위 한 서비스 라 고 할 수 있다.하드웨어 엔지니어 가 하드웨어 설 비 를 연구 개발 하면 소프트웨어 엔지니어 가 드라이버 를 작성 하 는 것 이 자연히 줄어든다.한편,드라이버 의 최종 목적 은 최상 위 응용 프로그램 이 이러한 하드웨어 가 제공 하 는 서 비 스 를 사용 하여 사용자 에 게 소프트웨어 기능 을 제공 할 수 있 도록 하 는 것 이다.안 드 로 이 드 시스템 의 애플 리 케 이 션 에 있어 서 는 시스템 의 애플 리 케 이 션 프레임 워 크 층 에서 하드웨어 서 비 스 를 제공 해 야 한다.앞의 몇 편의 글 에서 우 리 는 리 눅 스 커 널,하드웨어 추상 층 과 운영 시 라 이브 러 리 에서 제공 하 는 사용자 정의 하드웨어 서비스 인 터 페 이 스 를 중심 으로 소개 했다.이런 인 터 페 이 스 는 모두 C 또는 C+언어 를 통 해 이 루어 진 것 이다.이 글 에서 우 리 는 안 드 로 이 드 시스템 의 응용 프로그램 프레임 워 크 층 에서 자바 인터페이스의 하드웨어 서 비 스 를 제공 하 는 방법 을 소개 할 것 이다.
  1.Ubuntu Android HAL JNI 작성 방법 JAVA 액세스 하드웨어 서비스 인터페이스 제공글 에서 보 듯 이 하드웨어 추상 층 모듈 에 JNI 방법 호출 층 을 준비 합 니 다.
  2.Android 시스템 에서 하드웨어 서 비 스 는 일반적으로 하나의 독립 된 프로 세 스 에서 실행 되 어 각종 응용 프로그램 에 서 비 스 를 제공 합 니 다.따라서 이러한 하드웨어 서 비 스 를 호출 하 는 응용 프로그램 과 이러한 하드웨어 서비스 간 의 통신 은 대 리 를 통 해 이 루어 져 야 한다.이 를 위해,우 리 는 먼저 통신 인 터 페 이 스 를 정의 해 야 한다.frameworks/base/core/java/android/os 디 렉 터 리 에 들 어가 서 IHelloService.aidl 인터페이스 정의 파일 을 추가 합 니 다.
      USER-NAME@MACHINE-NAME:~/Android$ cd frameworks/base/core/java/android/os
      USER-NAME@MACHINE-NAME:~/Android/frameworks/base/core/java/android/os$ vi IHelloService.aidl
      IHelloService.aidl 은 IHelloService 인 터 페 이 스 를 정의 합 니 다.

package android.os; 
 
interface IHelloService { 
 void setVal(int val); 
 int getVal(); 
} 
 IHelloService 인 터 페 이 스 는 주로 장치 와 하드웨어 레지스터 val 의 값 을 가 져 오 는 기능 을 제공 하 는데 각각 setVal 과 getVal 두 함 수 를 통 해 이 루어 진다.
3.frameworks/base 디 렉 터 리 로 돌아 가 Android.mk 파일 을 열 고 LOCAL 을 수정 합 니 다.SRC_FILES 변수의 값,IHelloService.aidl 원본 파일 추가:

## 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/os/IVibratorService.aidl /

 core/java/android/os/IHelloService.aidl /

 core/java/android/service/urlrenderer/IUrlRendererService.aidl /

 .....................................................................
  4.IHelloService.aidl 인 터 페 이 스 를 컴 파일 합 니 다:
    USER-NAME@MACHINE-NAME:~/Android$ mmm frameworks/base
   이렇게 하면 IHello Service.aidl 에 따라 해당 하 는 IHello Service.Stub 인 터 페 이 스 를 생 성 합 니 다.
   5.frameworks/base/services/java/com/android/server 디 렉 터 리 에 들 어가 HelloService.java 파일 을 추가 합 니 다.

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(); 
 } 
 
 private static native boolean init_native(); 
 private static native void setVal_native(int val); 
 private static native int getVal_native(); 
}; 
 HelloService 는 주로 JNI 호출 방법 initnative、setVal_native 와 getVal네 이 티 브(4567915 참조)는 하드웨어 서 비 스 를 제공 합 니 다.
     6.같은 디 렉 터 리 의 SystemServer.자바 파일 을 수정 하고 ServerThread:run 함수 에 HelloService 를 불 러 오 는 코드 를 추가 합 니 다.

 @Override

 public void run() {

 ....................................................................................

 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, "Hello Service");

  ServiceManager.addService("hello", new HelloService());

 } catch (Throwable e) {

  Slog.e(TAG, "Failure starting Hello Service", e);

 }

 ......................................................................................

 } 
   7.HelloService 를 컴 파일 하고 system.img 을 다시 포장 합 니 다.
     USER-NAME@MACHINE-NAME:~/Android$ mmm frameworks/base/services/java
     USER-NAME@MACHINE-NAME:~/Android$ make snod
     이렇게 해서 다시 포장 한 system.img 시스템 미 러 파일 은 Application Frameworks 층 에 사용자 정의 하드웨어 서비스 HelloService 를 포함 하고 시스템 이 시 작 될 때 HelloService 를 자동 으로 불 러 옵 니 다.이 때 응용 프로그램 은 자바 인 터 페 이 스 를 통 해 Hello 하드웨어 서 비 스 를 방문 할 수 있 습 니 다.다음 글 에서 하드웨어 에 접근 하기 위해 자바 프로그램 을 만 드 는 방법 을 설명 할 것 입 니 다.기대 하 십시오.
 이상 은 바로 Android Application Frameworks 층 이 하드웨어 액세스 서비스 실현 방법 을 추가 하고 관련 지식 을 계속 보충 하 는 것 입 니 다.여러분 의 지원 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기