当前位置:编程学习 > C/C++ >>

JNI对HAL的封装

文件位置:
frameworks\base\services\jni
动态注册文件:onload.cpp
[cpp]  
#include "JNIHelp.h"  
#include "jni.h"  
#include "utils/Log.h"  
#include "utils/misc.h"  
  
namespace android {  
int register_android_server_AlarmManagerService(JNIEnv* env);  
int register_android_server_BatteryService(JNIEnv* env);  
int register_android_server_InputManager(JNIEnv* env);  
int register_android_server_LightsService(JNIEnv* env);  
int register_android_server_PowerManagerService(JNIEnv* env);  
int register_android_server_VibratorService(JNIEnv* env);  
int register_android_server_SystemServer(JNIEnv* env);  
int register_android_server_location_GpsLocationProvider(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_PowerManagerService(env);  
    register_android_server_InputManager(env);  
    register_android_server_LightsService(env);  
    register_android_server_AlarmManagerService(env);  
    register_android_server_BatteryService(env);  
    register_android_server_VibratorService(env);  
    register_android_server_SystemServer(env);  
    register_android_server_location_GpsLocationProvider(env);  
  
    return JNI_VERSION_1_4;  
}  
注册文件主要做了两件事情:1在android空间声明注册函数2.在C空间注册jni中注册相关的服务
将注册文件编译进内核
[cpp] 
LOCAL_SRC_FILES:= \  
    com_android_server_AlarmManagerService.cpp \  
    com_android_server_BatteryService.cpp \  
    com_android_server_InputManager.cpp \  
    com_android_server_LightsService.cpp \  
    com_android_server_PowerManagerService.cpp \  
    com_android_server_SystemServer.cpp \  
    com_android_server_UsbService.cpp \  
    com_android_server_VibratorService.cpp \  
    com_android_server_location_GpsLocationProvider.cpp \  
    onload.cpp  
3.JNI实现(com_android_server_LightsService.cpp)
[cpp]  
/* 
 * Copyright (C) 2009 The Android Open Source Project 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License. 
 */  
  
#define LOG_TAG "LightsService"  
  
#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/lights.h>  
  
#include <stdio.h>  
  
namespace android  
{  
  
// These values must correspond with the LIGHT_ID constants in  
// LightsService.java  
enum {  
    LIGHT_INDEX_BACKLIGHT = 0,  
    LIGHT_INDEX_KEYBOARD = 1,  
    LIGHT_INDEX_BUTTONS = 2,  
    LIGHT_INDEX_BATTERY = 3,  
    LIGHT_INDEX_NOTIFICATIONS = 4,  
    LIGHT_INDEX_ATTENTION = 5,  
    LIGHT_INDEX_BLUETOOTH = 6,  
    LIGHT_INDEX_WIFI = 7,  
    LIGHT_COUNT  
};  
  
struct Devices {  
    light_device_t* lights[LIGHT_COUNT];  
};  
  
static light_device_t* get_device(hw_module_t* module, char const* name)  
{  
    int err;  
    hw_device_t* device;  
    err = module->methods->open(module, name, &device);  
    if (err == 0) {  
        return (light_device_t*)device;  
    } else {  
        return NULL;  
    }  
}  
  
static jint init_native(JNIEnv *env, jobject clazz)  
{  
    int err;  
    hw_module_t* module;  
    Devices* devices;  
      
    devices = (Devices*)malloc(sizeof(Devices));  
  
    err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);  
    if (err == 0) {  
        devices->lights[LIGHT_INDEX_BACKLIGHT]  
                = get_device(module, LIGHT_ID_BACKLIGHT);  
        devices->lights[LIGHT_INDEX_KEYBOARD]  
                = get_device(module, LIGHT_ID_KEYBOARD);  
        devices->lights[LIGHT_INDEX_BUTTONS]  
                = get_device(module, LIGHT_ID_BUTTONS);  
        devices->lights[LIGHT_INDEX_BATTERY]  
                = get_device(module, LIGHT_ID_BATTERY);  
        devices->lights[LIGHT_INDEX_NOTIFICATIONS]  
     
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,