如何写一个native层的service

android的service大概有这么几种形式,Java service ,native service,或者Java层通过某种通信方式比如socket和demon交互.

Java层的aidl很方便,写socket的demon方式也很好理解,native的就显得稍微麻烦一点,咱们通过一个例子来说一下,首先说我们不讲解binder的内部机制….

我们打算写个简单的service,只提供set和get方法

1. 先写一个bin 的可执行文件

int main(int argc, char** argv)
{
signal(SIGPIPE, SIG_IGN);
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
sm->addService(String16("service.test"),new Test ());
IPCThreadState::self()->joinThreadPool();
}

sp<IServiceManager> sm = defaultServiceManager();

我们实际得到了servicemanager的binder proxy,通过这个接口我们可以调用servicemanager的方法addservice.

sm->addService(String16("service.test"),new Test ());

把我们提供的bbinder提供给servicemanager,前面的那个名字必须是唯一的.

IPCThreadState::self()->joinThreadPool();

有了joinThreadPool以后,我们就可以持续的提供服务了.

2 看一下test这个类的实现

test.h

class Test : public BnTest{
public:
    inline uint32_t  getTest(){
        ALOGD("getTest===== %d",IPCThreadState::self()->getCallingUid());
        return value;
    }
    inline void setTest(uint32_t par){
        ALOGD("setTest===== %d",IPCThreadState::self()->getCallingUid());
        value = par;
    }
private:
    uint32_t value;
};

我们的test类是继承了BnTest,它是具体的干活的类

ITest.h

class ITest : public IInterface{

public:
    DECLARE_META_INTERFACE(Test);
    virtual uint32_t getTest() = 0;
    virtual void setTest(uint32_t ) = 0;
};
class BnTest : public BnInterface<ITest>{

    public:
        virtual status_t  onTransact(uint32_t code,
                              const Parcel& data,
                              Parcel* reply,
                              uint32_t flags= 0 );

};

ITest就相当于是aidl的接口定义了

ITest.cpp

enum{
GET_Test = 1,
SET_Test,
};
class BpTest: public BpInterface<ITest>{
    public:
    BpTest(const sp<IBinder>& impl)
        : BpInterface<ITest>(impl){
    }

    virtual uint32_t getTest(){
        Parcel data,reply;
        data.writeInterfaceToken(ITest::getInterfaceDescriptor());
        remote()->transact(GET_Test,data,&reply);
        return reply.readInt32();

    }
    virtual void setTest(uint32_t params){
        Parcel data,reply;
        data.writeInterfaceToken(ITest::getInterfaceDescriptor());
        data.writeInt32(params);
        remote()->transact(SET_Test,data,&reply);
        return;

    }

};
IMPLEMENT_META_INTERFACE(Test,"android.Test.ITest");

status_t BnTest::onTransact(uint32_t code,
                        const Parcel& data,
                        Parcel* reply,
                        uint32_t flags){
    switch(code){
    case GET_Test:{
        CHECK_INTERFACE(ITest,data,reply);
        reply->writeInt32(getTest());
        return NO_ERROR;
        }break;
    case SET_Test:{
        CHECK_INTERFACE(ITest,data,reply);
        uint32_t value = data.readInt32();
        setTest(value);

        return NO_ERROR;
        }break;
    default:
    return BBinder::onTransact(code, data, reply, flags);

}
}

而ITest几乎也是照着模板写的,Google自己肯定写了类似于aidl的工具来生成native的service.

时间: 2024-08-05 19:16:54

如何写一个native层的service的相关文章

【Java学习笔记】如何写一个简单的Web Service

本Guide利用Eclipse以及Ant建立一个简单的Web Service,以演示Web Service的基本开发过程: 1.系统条件: Eclipse Java EE IDE for Web Developers Java SE 6 Windows XP 2.基本环境搭建: 1)Java SE6 JDK的安装:下载Java SE6 JDK,双击,安装默认选项进行安装即可. 2)Eclipse的安装与配置: 安装时直接解压.     配置处有两点,Window>Preferences>Jav

如何写一个程序升级的service

这个升级可以在程序启动时调用: 首先建立一个service的类:MyService extends Service,然后在menifest中声明: <service android:name=".MyService"></service> 这样来调用: Intent intent = new Intent(); intent.setClass(MainActivity.this, MyService.class); <strong>startServ

Android添加一个Native Service

Native Service其实就是一个linux守护进程,提供一些服务,不过由于android的进程间通讯使用了Binder机制,那么我们就需要按照android的规则来实现我们的Native Service. 客户端在请求service的服务时使用了一个具有相同接口的Proxy类.native service这具体实现这个接口,所以android提供了IInterface类,其是"base class for Binder interfaces",所以我们的IZxTask类继承它:

深入浅出React Native 3: 从零开始写一个Hello World

这是深入浅出React Native的第三篇文章. 1. 环境配置 2. 我的第一个应用 将index.ios.js中的代码全部删掉,为什么要删掉呢?因为我们准备从零开始写一个应用~学习技术最好的方式就是自己动手写,看别人的代码一百遍的效果也不如自己写一遍来的效果大~ 我们要做的事情主要分成以下两步: 1. 创建组件 2. 将创建好的组件显示在app上 打开index.ios.js文件,输入 var HelloWorld = React.createClass({ render: functio

Android 如何在java/native层修改一个文件的权限(mode)与用户(owner)?

前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 [Description] 如何在java/native层修改一个文件的权限(mode),用户(owner),组(group),以满足安全需要? [Keyword] 文件权限 文件用户 mode owner chomd chown permission [Solution] 在nativ

写一个service 启动停止你的微服务的命令吧

在这个微服务盛行的时代,docker获得了巨大的成功,因为我们需要在一台服务器装上N个服务. 本文不是想讨论如何使用docker,而是,在一台服务器安装了多个服务后,怎样启动方便的启动服务呢? 一.在tomcat的时代中,直接使用tomcat的启动停止命令,轻松搞定,(tomcat的启动脚本很有水平,贴上来学习下吧) #!/bin/sh # chkconfig: 2345 10 90 # description:tomcat service JAVA_OPTS="$JAVA_OPTS -serv

Android Framework 分析---消息机制Native层

在Android的消息机制中,不仅提供了供Application 开发使用的java的消息循环.其实java的机制最终还是靠native来实现的.在native不仅提供一套消息传递和处理的机制,还提供了自定义文件描述符的I/O时间的监听机制.下面我们从具体代码中分析一下. Native层的关键类: Looper.cpp.该类中提供了pollOnce 和wake的休眠和唤醒机制.同时在构造函数中也创建 管道 并加入epoll的机制中,来监听其状态变化. Looper::Looper(bool al

Myeclipse插件快速生成ssh项目并配置注解 在action层注入service的超详细过程

最近发现,我对于ssh的 自动注入配置 还是不熟悉,于是整理了一下 终于做了一个 简单的 注入配置出来. 以前都是在applicationContext.xml 里面这样配 <bean id="loginAction" class="com.dj.ssh.action.LoginAction" scope="prototype" autowire="byName"> <property name="

Android Native层Binder.transact()函数调用 Binder.onTransact() 函数失败分析

Q:Android Native层Binder.transact()函数调用 Binder.onTransact() 函数失败? 在Android Native层调用Camera.h中的api实现一个截屏功能的应用时,发现通过gCamera->setListener(new ScreenCaptureListener())设置到Camera的mListener的用于接收Camera预览数据的回调函数没有被调用,导致截屏失败? 注: Camera类文件汇总: libcamera_client.so