Android底层cpp封装framework service给app实例

1、添加framework/base/core/java/android/os/IRtlAlarmPowerOn.aidl

package android.os;

/**
 * Direct interface to the UpdateLockService's functionality
 *
 * {@hide}
*/
interface IRtcAlarmPowerOn {
    int updatePowerOnToRtc(in int[] time);
    int rtcDeviceOpen();
}
 

2、添加framework/base/services/core/java/com/android/services/RtlAlarmPowerOn.java

package com.android.server;

import android.util.Slog;

import android.os.IRtcAlarmPowerOn;

import android.content.Context;

public class RtcAlarmPowerOn extends IRtcAlarmPowerOn.Stub{

private static final String TAG = "AidlService";

private final Context mContext;

public static final String RTCALARM_STATS_SERVICE = "rtcalarmstats";

public RtcAlarmPowerOn(Context context)

{

Slog.d(TAG,"RtcAlarmPowerOn");

mContext = context;

}

@Override

public int updatePowerOnToRtc(int[] time) throws android.os.RemoteException

{

Slog.d(TAG,"updatePowerOnToRtc begin nativeUpdatePowerOnToRtc");

return nativeUpdatePowerOnToRtc(time);

}


 

@Override

public int rtcDeviceOpen() throws android.os.RemoteException

{

Slog.d(TAG,"rtcDeviceOpen begin nativeRtcDeviceOpen");

return nativeRtcDeviceOpen();

}

public static native int nativeUpdatePowerOnToRtc(int[] arg);

public static native int nativeRtcDeviceOpen();

}

3、完成rameworks/base/services/core/jni/com_android_server_RtcAlarmPowerOn.cpp 

#define LOG_TAG "RtcAlarmPowerOn"

#include "jni.h"

#include <nativehelper/JNIHelp.h>

//#include "android_runtime/AndroidRuntime.h"

#include <utils/misc.h>

#include <utils/Log.h>

#include <stdio.h>


 

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

#include <poll.h>

#include <signal.h>

#include <sys/types.h>

#include <unistd.h>

#include <fcntl.h>

#include <linux/rtc.h>



 

#include <sys/ioctl.h>

#include "../../../../../../kernel-5.10/include/uapi/linux/rtc.h"

namespace android

{


 

int fd;

struct rtc_time dt;

#define RTC_ALM_PWRON_SET _IOW('p', 0x15, struct rtc_time)



 

static jint nativeUpdatePowerOnToRtc(JNIEnv *env , jobject /*clazz*/ , jintArray timeArr)

{

int i;

int length = env->GetArrayLength(timeArr);

jint* buf = env->GetIntArrayElements(timeArr,NULL);

for(i = 0; i < length; i++)

{

ALOGE("nativeUpdateTimeToRtc buf=%d index i=%d",buf[i],i);

}

if(length == 5)

{

dt.tm_sec = 0;//00

dt.tm_min = buf[4];//00

dt.tm_hour = buf[3];//11

dt.tm_mday = buf[2];//20-(2019-2016)=17 21=x-(2019-2016)-->x=24

//dt.tm_mon = buf[1];//10+1=11

dt.tm_wday = buf[1]; // rtc pcf8563 alarm need wday

dt.tm_year = buf[0];//20(19)

//start time 2019-11-21 09:30

}else

{

//parse time to int value

dt.tm_sec = 0;//00

dt.tm_min = buf[4];//00

dt.tm_hour = buf[3];//11

dt.tm_mday = buf[2];//20-(2019-2016)=17 21=x-(2019-2016)-->x=24

dt.tm_mon = buf[1];//10+1=11

dt.tm_year = buf[0];//20(19)

//start time 2019-11-21 09:30

}


 

int res;

fd = open("/dev/rtc0", O_RDWR);

if (fd < 0)

{

printf("can't open /dev/rtc0!\n");

return -11;

}


 

res = ioctl(fd, RTC_ALM_PWRON_SET, &dt);

if (res < 0)

printf("RTC_ALM_PWRON_SET ioctl failed");

close(fd);

//return fd;

return res;

}


 

static jint nativeRtcDeviceOpen(JNIEnv* /* env */, jobject /* clazz */)

{

int fd,retval;

struct rtc_time rtc_tm;

fd=open("/dev/rtc0",O_RDWR);

if(fd < 0)

{

printf("can't open /dev/rtc0!\n");

return -11;

}

retval=ioctl(fd,RTC_RD_TIME,&rtc_tm);

if(retval < 0)

{

printf("error RTC_RD_TIME ioctl");

return -1;

}

close(fd);

return 0;

}



 

static const JNINativeMethod method_table[] = {

{ "nativeUpdatePowerOnToRtc", "([I)I", (void*)nativeUpdatePowerOnToRtc },

{ "nativeRtcDeviceOpen", "()I", (void*)nativeRtcDeviceOpen },

};


 

int register_android_server_RtcAlarmPowerOn(JNIEnv *env)

{

jclass clazz = env->FindClass("com/android/server/RtcAlarmPowerOn");

if (clazz == NULL) {

ALOGE("Can't find com/android/server/RtcAlarmPowerOn");

return -1;

}

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

method_table, NELEM(method_table));

}

};

4、Android bp添加cpp编译

rameworks/base/services/core/jni/Android.bp 

"com_android_server_RtcAlarmPowerOn.cpp",

5、frameworks/base/services/core/jni/onload.cpp 

int register_android_server_sensor_SensorService(JavaVM* vm, JNIEnv* env);
int register_com_android_server_rkdisplay_RkDisplayModes(JNIEnv* env);
int register_com_android_server_audio_RkAudioSetting(JNIEnv* env);
int register_android_server_RtcAlarmPowerOn(JNIEnv* env);
};

using namespace android;
    register_android_server_sensor_SensorService(vm, env);
    register_com_android_server_rkdisplay_RkDisplayModes(env);
    register_com_android_server_audio_RkAudioSetting(env);
    register_android_server_RtcAlarmPowerOn(env);
    return JNI_VERSION_1_4;
}

6、 frameworks/base/services/java/com/android/server/SystemServer.java添加services

        boolean enableVrService = context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE);

        boolean disableRtcAlarmServices = SystemProperties.getBoolean("config.disable_rtcalarm", false);
        boolean disableVendorStorage = SystemProperties.getBoolean("config.disable_vendor_storage", false);

                   
    if (!disableRtcAlarmServices) {
                t.traceBegin("StartSerialService");
                try {
                    ServiceManager.addService(RtcAlarmPowerOn.RTCALARM_STATS_SERVICE, new RtcAlarmPowerOn(context));
                } catch (Throwable e) {
                    Slog.e(TAG, "Failure starting SerialService", e);
                }
                t.traceEnd();
            }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值