On Jun 23, 7:50 pm, xro <[email protected]> wrote:
> ok...
>
> funny...
>
> I think that your card don't have battery. So the battery seems to be
> empty for Android.
>
> I had the same thing and i resolve it like that:
>
> /*
>  * Copyright (C) 2008 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 "BatteryService"
>
> #include "JNIHelp.h"
> #include "jni.h"
> #include "utils/Log.h"
> #include "utils/misc.h"
>
> #include <fcntl.h>
> #include <stdio.h>
> #include <string.h>
> #include <sys/types.h>
> #include <sys/socket.h>
> #include <arpa/inet.h>
> #include <netinet/in.h>
> #include <stdlib.h>
> #include <errno.h>
> #include <unistd.h>
>
> #if HAVE_ANDROID_OS
> #include <linux/ioctl.h>
> #endif
>
> namespace android {
>
> #define AC_ONLINE_PATH "/sys/class/power_supply/ac/online"
> #define USB_ONLINE_PATH "/sys/class/power_supply/usb/online"
> #define BATTERY_STATUS_PATH "/sys/class/power_supply/battery/status"
> #define BATTERY_HEALTH_PATH "/sys/class/power_supply/battery/health"
> #define BATTERY_PRESENT_PATH "/sys/class/power_supply/battery/present"
> #define BATTERY_CAPACITY_PATH "/sys/class/power_supply/battery/
> capacity"
> #define BATTERY_VOLTAGE_PATH "/sys/class/power_supply/battery/
> batt_vol"
> #define BATTERY_TEMPERATURE_PATH "/sys/class/power_supply/battery/
> batt_temp"
> #define BATTERY_TECHNOLOGY_PATH "/sys/class/power_supply/battery/
> technology"
>
> struct FieldIds {
>     // members
>     jfieldID mAcOnline;
>     jfieldID mUsbOnline;
>     jfieldID mBatteryStatus;
>     jfieldID mBatteryHealth;
>     jfieldID mBatteryPresent;
>     jfieldID mBatteryLevel;
>     jfieldID mBatteryVoltage;
>     jfieldID mBatteryTemperature;
>     jfieldID mBatteryTechnology;};
>
> static FieldIds gFieldIds;
>
> struct BatteryManagerConstants {
>     jint statusUnknown;
>     jint statusCharging;
>     jint statusDischarging;
>     jint statusNotCharging;
>     jint statusFull;
>     jint healthUnknown;
>     jint healthGood;
>     jint healthOverheat;
>     jint healthDead;
>     jint healthOverVoltage;
>     jint healthUnspecifiedFailure;};
>
> static BatteryManagerConstants gConstants;
>
> static jint getBatteryStatus(const char* status)
> {
>     switch (status[0]) {
>         case 'C': return gConstants.statusCharging;         //
> Charging
>         case 'D': return gConstants.statusDischarging;      //
> Discharging
>         case 'F': return gConstants.statusFull;             // Not
> charging
>         case 'N': return gConstants.statusNotCharging;      // Full
>         case 'U': return gConstants.statusUnknown;          // Unknown
>
>         default: {
>             LOGW("Unknown battery status '%s'", status);
>             return gConstants.statusUnknown;
>         }
>     }
>
> }
>
> static jint getBatteryHealth(const char* status)
> {
>     switch (status[0]) {
>         case 'D': return gConstants.healthDead;         // Dead
>         case 'G': return gConstants.healthGood;         // Good
>         case 'O': {
>             if (strcmp(status, "Overheat") == 0) {
>                 return gConstants.healthOverheat;
>             } else if (strcmp(status, "Over voltage") == 0) {
>                 return gConstants.healthOverVoltage;
>             }
>             LOGW("Unknown battery health[1] '%s'", status);
>             return gConstants.healthUnknown;
>         }
>
>         case 'U': {
>             if (strcmp(status, "Unspecified failure") == 0) {
>                 return gConstants.healthUnspecifiedFailure;
>             } else if (strcmp(status, "Unknown") == 0) {
>                 return gConstants.healthUnknown;
>             }
>             // fall through
>         }
>
>         default: {
>             LOGW("Unknown battery health[2] '%s'", status);
>             return gConstants.healthUnknown;
>         }
>     }
>
> }
>
> static int readFromFile(const char* path, char* buf, size_t size)
> {
>     int fd = open(path, O_RDONLY, 0);
>     if (fd == -1) {
>         LOGE("Could not open '%s'", path);
>         return -1;
>     }
>
>     size_t count = read(fd, buf, size);
>     if (count > 0) {
>         count = (count < size) ? count : size - 1;
>         while (count > 0 && buf[count-1] == '\n') count--;
>         buf[count] = '\0';
>     } else {
>         buf[0] = '\0';
>     }
>
>     close(fd);
>     return count;
>
> }
>
> static void setBooleanField(JNIEnv* env, jobject obj, const char*
> path, jfieldID fieldID)
> {
>     const int SIZE = 16;
>     char buf[SIZE];
>
>     jboolean value = true;
> /*
>     if (readFromFile(path, buf, SIZE) > 0) {
>         if (buf[0] == '1') {
>             value = true;
>         }
>     }
> */
>     env->SetBooleanField(obj, fieldID, value);
>
> }
>
> static void setIntField(JNIEnv* env, jobject obj, const char* path,
> jfieldID fieldID)
> {
>     const int SIZE = 128;
>     char buf[SIZE];
>
>     jint value = 100;
> /*
>     if (readFromFile(path, buf, SIZE) > 0) {
>         value = atoi(buf);
>     }
> */
>     env->SetIntField(obj, fieldID, value);
>
> }
>
> static void android_server_BatteryService_update(JNIEnv* env, jobject
> obj)
> {
>     setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);
>     setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);
>     setBooleanField(env, obj, BATTERY_PRESENT_PATH,
> gFieldIds.mBatteryPresent);
>
>     setIntField(env, obj, BATTERY_CAPACITY_PATH,
> gFieldIds.mBatteryLevel);
>     setIntField(env, obj, BATTERY_VOLTAGE_PATH,
> gFieldIds.mBatteryVoltage);
>     setIntField(env, obj, BATTERY_TEMPERATURE_PATH,
> gFieldIds.mBatteryTemperature);
>
>     env->SetIntField(obj, gFieldIds.mBatteryStatus,
> gConstants.statusFull);
>
>     env->SetIntField(obj, gFieldIds.mBatteryHealth,
> gConstants.healthGood);
>
>     env->SetObjectField(obj, gFieldIds.mBatteryTechnology, 
> env->NewStringUTF("1"));
>
> /*
>     const int SIZE = 128;
>     char buf[SIZE];
>
>     if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) > 0)
>         env->SetIntField(obj, gFieldIds.mBatteryStatus,
> getBatteryStatus(buf));
>     else
>        env->SetIntField(obj, gFieldIds.mBatteryStatus,
> gConstants.statusUnknown);
>
>     if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) > 0)
>         env->SetIntField(obj, gFieldIds.mBatteryHealth,
> getBatteryHealth(buf));
>
>     if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) > 0)
>         env->SetObjectField(obj, gFieldIds.mBatteryTechnology, env-
>
> >NewStringUTF(buf));
> */
> }
>
> static JNINativeMethod sMethods[] = {
>      /* name, signature, funcPtr */
>         {"native_update", "()V", (void*)
> android_server_BatteryService_update},
>
> };
>
> int register_android_server_BatteryService(JNIEnv* env)
> {
>     jclass clazz = env->FindClass("com/android/server/
> BatteryService");
>
>     if (clazz == NULL) {
>         LOGE("Can't find com/android/server/BatteryService");
>         return -1;
>     }
>
>     gFieldIds.mAcOnline = env->GetFieldID(clazz, "mAcOnline", "Z");
>     gFieldIds.mUsbOnline = env->GetFieldID(clazz, "mUsbOnline", "Z");
>     gFieldIds.mBatteryStatus = env->GetFieldID(clazz,
> "mBatteryStatus", "I");
>     gFieldIds.mBatteryHealth = env->GetFieldID(clazz,
> "mBatteryHealth", "I");
>     gFieldIds.mBatteryPresent = env->GetFieldID(clazz,
> "mBatteryPresent", "Z");
>     gFieldIds.mBatteryLevel = env->GetFieldID(clazz, "mBatteryLevel",
> "I");
>     gFieldIds.mBatteryTechnology = env->GetFieldID(clazz,
> "mBatteryTechnology", "Ljava/lang/String;");
>     gFieldIds.mBatteryVoltage = env->GetFieldID(clazz,
> "mBatteryVoltage", "I");
>     gFieldIds.mBatteryTemperature = env->GetFieldID(clazz,
> "mBatteryTemperature", "I");
>
>     LOG_FATAL_IF(gFieldIds.mAcOnline == NULL, "Unable to find
> BatteryService.AC_ONLINE_PATH");
>     LOG_FATAL_IF(gFieldIds.mUsbOnline == NULL, "Unable to find
> BatteryService.USB_ONLINE_PATH");
>     LOG_FATAL_IF(gFieldIds.mBatteryStatus == NULL, "Unable to find
> BatteryService.BATTERY_STATUS_PATH");
>     LOG_FATAL_IF(gFieldIds.mBatteryHealth == NULL, "Unable to find
> BatteryService.BATTERY_HEALTH_PATH");
>     LOG_FATAL_IF(gFieldIds.mBatteryPresent == NULL, "Unable to find
> BatteryService.BATTERY_PRESENT_PATH");
>     LOG_FATAL_IF(gFieldIds.mBatteryLevel == NULL, "Unable to find
> BatteryService.BATTERY_CAPACITY_PATH");
>     LOG_FATAL_IF(gFieldIds.mBatteryVoltage == NULL, "Unable to find
> BatteryService.BATTERY_VOLTAGE_PATH");
>     LOG_FATAL_IF(gFieldIds.mBatteryTemperature == NULL, "Unable to
> find BatteryService.BATTERY_TEMPERATURE_PATH");
>     LOG_FATAL_IF(gFieldIds.mBatteryTechnology == NULL, "Unable to find
> BatteryService.BATTERY_TECHNOLOGY_PATH");
>
>     clazz = env->FindClass("android/os/BatteryManager");
>
>     if (clazz == NULL) {
>         LOGE("Can't find android/os/BatteryManager");
>         return -1;
>     }
>
>     gConstants.statusUnknown = env->GetStaticIntField(clazz,
>             env->GetStaticFieldID(clazz, "BATTERY_STATUS_UNKNOWN",
> "I"));
>
>     gConstants.statusCharging = env->GetStaticIntField(clazz,
>             env->GetStaticFieldID(clazz, "BATTERY_STATUS_CHARGING",
> "I"));
>
>     gConstants.statusDischarging = env->GetStaticIntField(clazz,
>             env->GetStaticFieldID(clazz, "BATTERY_STATUS_DISCHARGING",
> "I"));
>
>     gConstants.statusNotCharging = env->GetStaticIntField(clazz,
>             env->GetStaticFieldID(clazz,
> "BATTERY_STATUS_NOT_CHARGING", "I"));
>
>     gConstants.statusFull = env->GetStaticIntField(clazz,
>             env->GetStaticFieldID(clazz, "BATTERY_STATUS_FULL", "I"));
>
>     gConstants.healthUnknown = env->GetStaticIntField(clazz,
>             env->GetStaticFieldID(clazz, "BATTERY_HEALTH_UNKNOWN",
> "I"));
>
>     gConstants.healthGood = env->GetStaticIntField(clazz,
>             env->GetStaticFieldID(clazz, "BATTERY_HEALTH_GOOD", "I"));
>
>     gConstants.healthOverheat = env->GetStaticIntField(clazz,
>             env->GetStaticFieldID(clazz, "BATTERY_HEALTH_OVERHEAT",
> "I"));
>
>     gConstants.healthDead = env->GetStaticIntField(clazz,
>             env->GetStaticFieldID(clazz, "BATTERY_HEALTH_DEAD", "I"));
>
>     gConstants.healthOverVoltage = env->GetStaticIntField(clazz,
>             env->GetStaticFieldID(clazz,
> "BATTERY_HEALTH_OVER_VOLTAGE", "I"));
>
>     gConstants.healthUnspecifiedFailure = env->GetStaticIntField
> (clazz,
>             env->GetStaticFieldID(clazz,
> "BATTERY_HEALTH_UNSPECIFIED_FAILURE", "I"));
>
>     return jniRegisterNativeMethods(env, "com/android/server/
> BatteryService", sMethods, NELEM(sMethods));}
> } /* namespace android */

..and your changes are the commented sections above?? Also the name of
this file would help.
But can't we switch off battery as a service somwehere instaed of
modifying the code?
--~--~---------~--~----~------------~-------~--~----~
unsubscribe: [email protected]
website: http://groups.google.com/group/android-porting
-~----------~----~----~----~------~----~------~--~---

Reply via email to