Android 하드웨어 추상 층 (HAL) 개요 소개 및 학습 계획

세련 된 안 드 로 이 드 시스템 개발 소개
http://blog.csdn.net/luoshengyang/article/details/6567257
요약 은 다음 과 같다.
app(java)
IService. Stub 를 통 해 service 가 제공 하 는 인 터 페 이 스 를 사용 합 니 다.
	import android.os.IHelloService; 
	
	private IHelloService helloService;
	helloService = IHelloService.Stub.asInterface(ServiceManager.getService("hello"));
	
	helloService.setVal(val);

"hello":            시스템 시작 시 HelloService 불 러 올 때 지정
IHelloService.Stub   IHelloService. aidl 생 성
framework service (java) (AIDL 기반)
대상: 자바 인터페이스 제공, service 서비스 등록
다음: jni 가 제공 하 는 native 인 터 페 이 스 를 호출 합 니 다.
frameworks/base/core/java/android/os
IHelloService. aidl: IHelloService. Stub 생 성
	interface IHelloService {  
		void setVal(int val);  
		int getVal();  
	}

frameworks/base/services/java/com/android/server
Hello Service. java: 자바 인터페이스 에서 nativa 인터페이스 로 전환 실현
			public class HelloService extends IHelloService.Stub {
				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();  
			};  

SystemServer. java: HelloService 를 불 러 오 는 코드 추가
			ServiceManager.addService("hello", new HelloService());

framework JNI 인터페이스 (c + +) (JNI 기반)
대상: native 인터페이스 구현, 등록, 자바 환경 변수 변환 실현
다음: HAL 인터페이스 호출
frameworks/base/services/jni
com_android_server_HelloService. cpp: com. android. server. HelloService 에 대응 합 니 다.
자바 인터페이스의 로 컬 구현 (HAL 인터페이스 기반);jni 등록;자바 변수 변환
	namespace android  
	{  
		struct hello_device_t* hello_device = NULL;  
		static void hello_setVal(JNIEnv* env, jobject clazz, jint value) {  
			hello_device->set_val(hello_device, val);  
		}  
		static jint hello_getVal(JNIEnv* env, jobject clazz) {  
			hello_device->get_val(hello_device, &val);  
		}  
		static inline int hello_device_open(const hw_module_t* module, struct hello_device_t** device) {  
			return module->methods->open(module, HELLO_HARDWARE_MODULE_ID, (struct hw_device_t**)device);  
		}  
		static jboolean hello_init(JNIEnv* env, jclass clazz) {  
			hello_module_t* module;  
			if(hw_get_module(HELLO_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0) {  
				if(hello_device_open(&(module->common), &hello_device) == 0) {  
		<span style="white-space:pre">	</span>	}  
	<span style="white-space:pre">	</span>	}  
		}  


		static const JNINativeMethod method_table[] = {  
			{"init_native", "()Z", (void*)hello_init},  
			{"setVal_native", "(I)V", (void*)hello_setVal},  
			{"getVal_native", "()I", (void*)hello_getVal},  
		};  


		int register_android_server_HelloService(JNIEnv *env) {  
			return jniRegisterNativeMethods(env, "com/android/server/HelloService", method_table, NELEM(method_table));  
		}  
	};  

HAL 인터페이스 (c) (android HAL 프레임 기반)
대상: 구동 격 리 실현 (사용자 컨트롤)
다음: 드라이브 호출
hardware/libhardware/include/hardware
struct hw_module_t common
struct hw_device_t common
hardware/libhardware/modules
struct hello_module_t HAL_MODULE_INFO_SYM 정적 정의
hello_device_open 동적 설정 struct hellodevice_t

좋은 웹페이지 즐겨찾기