framework添加自己的服务

本文介绍如何在Android系统中实现Smack Service,包括创建AIDL接口、编写服务端Java类和服务注册过程,并展示了自定义JNI方法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.360doc.com/content/12/0719/19/87000_225297295.shtml 借鉴

1  frameworks/base/core/java/android/os 中添加Ismackserviec.aidl 

package android.os;
interface Ismackservice
{
    boolean seton();

}


2 修改/frameworks/base/Android.mk 添加     core/java/android/os/Ismackservice.aidl ,使其得到编译

3 frameworks/base/services/java/com/android/server 中添加smack_service.java

package com.android.server;
import android.content.Context;

import android.os.Ismackservice;
import java.io.IOException;
import android.util.Log;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public final class smack_service extends Ismackservice.Stub{
        public static final String TAG = "smack_service";
        smack_service(Context context){
                Log.i(TAG,"GET smack_service_stub");
        }



        public boolean set_net_on(){
                Log.i(TAG,"set net on");
                 set_net_on_jni();
/*
                 String s = "\n";
                  try{
                                 Process p =Runtime.getRuntime().exec("echo ^ > /smack/ambient");
                                 BufferedReader in = new BufferedReader(  
                         new InputStreamReader(p.getErrorStream()));  
     String line = null;  
     while ((line = in.readLine()) != null) {  
         s += line + "\n";   
          
     }  
     Log.i(TAG,s);
                                 
                                 }
                                 catch (IOException e) {
                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                }*/
                return true;
        }

            public boolean set_net_off(){
                Log.i(TAG,"set net off");
            set_net_off_jni();
                return true;
        }

     private static native void set_net_on_jni();
     private static native void set_net_off_jni();

}



4 修改frameworks/base/services/java/com/android/server/SystemServer.java 注册smack_service

             Slog.i(TAG, "smack_service");
             ServiceManager.addService(Context.SMACK_SERVICE,new smack_service(context));

修改 frameworks/base/core/java/android/content/Context.java

public static final String SMACK_SERVICE = "smack";//xiayu fix



5 make_updata-api     mmm framework/base/services/java     m

6 编写测试apk , 在eclipse中,右键-》Buid Path->Configure Build Path->Libraries->Add External Jars

    out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar



自己编的jni

#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
#include <utils/misc.h>
#include <utils/Log.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <time.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <hardware/smack.h>
#define LOG_TAG "smack_service-JNI"

namespace android{

static inline int smack_control_open(const struct hw_module_t* module,
        struct smack_control_device_t** device) {
    return module->methods->open(module,
            SMACK_HARDWARE_MODULE_ID, (struct hw_device_t**)device);
}
static void set_net_on_jni(JNIEnv *env, jobject clazz){

 smack_module_t* module;
struct smack_control_device_t *smackDevice;
      LOGE("xiayu set_net_on jni\n");
    if (hw_get_module(SMACK_HARDWARE_MODULE_ID, (const hw_module_t**)&module) == 0) {
        LOGI("SMACKService JNI: SMACK Stub found.");
        if (smack_control_open(&module->common, &smackDevice) == 0) {
            LOGI("LedService JNI: Got Stub operations.");
        }
    }
      char *st="hao";
      char buf[10];
   
    int fd3=open("/sys/power/wake_lock",O_RDWR);		
          LOGE("xiayu open   wrong error fd3 =%d ,errno =%d",fd3, errno);
    int tt= write(fd3,st,3);
          LOGE("xiayu write   wrong error  =%d uid=%d pid=%d tt=%d",errno,getuid(),getpid(),tt);
    int yy=read(fd3,buf,3);
          LOGE("xiayu read error=%d  buf[]=%c yy=%d",errno,buf[0],yy);
     close(fd3);
       smackDevice->set_net_on(smackDevice, 2);
}


static void set_net_off_jni(JNIEnv *env, jobject clazz){
	LOGE("xiayu set_net_off jni\n");
       int fd = open("/smack", O_WRONLY);
     if(fd<0){
          LOGE("xiayu off wrong error=%d",errno);
          //perror("xiayu");  
     }
}
static JNINativeMethod method_table[] = {
    { "set_net_on_jni", "()V", (void*)set_net_on_jni },
    { "set_net_off_jni", "()V", (void*)set_net_off_jni },
};

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


}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值