JNI对HAL的封装(四)

2013-04-24 12:13:39 · 作者: · 浏览: 1181

 

  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]

  = get_device(module, LIGHT_ID_NOTIFICATIONS);

  devices->lights[LIGHT_INDEX_ATTENTION]

  = get_device(module, LIGHT_ID_ATTENTION);

  devices->lights[LIGHT_INDEX_BLUETOOTH]

  = get_device(module, LIGHT_ID_BLUETOOTH);

  devices->lights[LIGHT_INDEX_WIFI]

  = get_device(module, LIGHT_ID_WIFI);

  } else {

  memset(devices, 0, sizeof(Devices));

  }

  return (jint)devices;

  }

  static void finalize_native(JNIEnv *env, jobject clazz, int ptr)

  {

  Devices* devices = (Devices*)ptr;

  if (devices == NULL) {

  return;

  }

  free(devices);

  }

  static void setLight_native(JNIEnv *env, jobject clazz, int ptr,

  int light, int colorARGB, int flashMode, int onMS, int offMS, int brightnessMode)

  {

  Devices* devices = (Devices*)ptr;

  light_state_t state;

  if (light < 0 || light >= LIGHT_COUNT || devices->lights[light] == NULL) {

  return ;

  }

  memset(&state, 0, sizeof(light_state_t));

  state.color = colorARGB;

  state.flashMode = flashMode;

  state.flashOnMS = onMS;

  state.flashOffMS = offMS;

  state.brightnessMode = brightnessMode;

  devices->lights[light]->set_light(devices->lights[light], &state);

  }

  static JNINativeMethod method_table[] = {

  { "init_native", "()I", (void*)init_native },//int init_native()

  { "finalize_native", "(I)V", (void*)finalize_native },//void finalize_native(int)

  { "setLight_native", "(IIIIIII)V", (void*)setLight_native },//void setLight_native(int,int,int,int,int,int,int)

  };

  int register_android_server_LightsService(JNIEnv *env)

  {

  return jniRegisterNativeMethods(env, "com/android/server/LightsService",

  method_table, NELEM(method_table));

  }

  };