Android Service实现详细过程

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

完整开源地址:https://docs.qq.com/doc/DSkNLaERkbnFoS0ZF

#include <utils/IServiceManager.h>

#include <utils/IPCThreadState.h>

namespace android {

static struct sigaction oldact;

static pthread_key_t sigbuskey;

int AddService::instantiate() {

LOGE(“AddService instantiate”);

int r = defaultServiceManager()->addService(

String16(“guilh.add”), new AddService());

LOGE(“AddService r = %d/n”, r);

return r;

}

AddService::AddService()

{ LOGV(“AddService created”);

mNextConnId = 1;

pthread_key_create(&sigbuskey, NULL);

}

AddService::~AddService()

{ pthread_key_delete(sigbuskey);

LOGV(“AddService destroyed”);

}

status_t AddService::onTransact(

uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){

switch(code) {

case 0: {

pid_t pid = data.readInt32();

int num = data.readInt32();

num = num + 1000;

reply->writeInt32(num);

return NO_ERROR;

} break;

default:

return BBinder::onTransact(code, data, reply, flags);

}

}

};

Android.mk文件:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= AddService.cpp

#LOCAL_C_INCLUDES:= $(JNI_H_INCLUDE)

LOCAL_SHARED_LIBRARIES:= libutils

LOCAL_MODULE:= libAddService

LOCAL_PRELINK_MODULE:= false

include $(BUILD_SHARED_LIBRARY)

Step-2:以C++撰写一个可独立执行的addserver.cpp 程序,它的用途是:诞生一个AddService 类别之对象,然后将该对象参考存入Binder Driver 里。其内容为:

addserver.cpp文件:

#include <sys/types.h>

#include <unistd.h>

#include <grp.h>

#include <utils/IPCThreadState.h>

#include <utils/ProcessState.h>

#include <utils/IServiceManager.h>

#include <utils/Log.h>

#include <private/android_filesystem_config.h>

#include “…/libaddservice/AddService.h”

using namespace android;

int main(int argc, char** argv)

{

sp proc(ProcessState::self());

sp sm = defaultServiceManager();

LOGI(“ServiceManager: %p”, sm.get());

AddService::instantiate();

ProcessState::self()->startThreadPool();

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

}

Android.mk文件:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= addserver.cpp

LOCAL_SHARED_LIBRARIES:= libutils libAddService

LOCAL_MODULE:= addservice

include $(BUILD_EXECUTABLE)

Step-3:编译上述两个文件分别产出了libAdd.so 类别库和addserver 可执行程序。接着将libAdd.so 拷贝到Android 仿真器的/system/lib/里;也把addserver拷贝到/system/bin/里。

Step-4:执行addserver。其中的指令:AddServer::instantiate()就执行到AddServer 类别的instantiate()函数,其内容为:

int AddService::instantiate() {

LOGE(“AddService instantiate”);

int r = defaultServiceManager()->addService(

String16(“guilh.add”), new AddService());

LOGE(“AddService r = %d/n”, r);

return r;

}

其先执行到new AddServer(),就诞生一个AddServer 类别之对象;

接着,呼叫defaultServiceManager()函数取得SM 的IServiceManager 接口;

再呼叫IServiceManager::addServer()将该对象参考存入Binder Driver 里。

Step-5:这样就成功地将AddService 服务加入到Binder Driver 里了。现在就可以写个Add 类来使用AddService 核心服务了。以C++撰写Add 类别,其完整程序代码为:

Add.h文件:

#ifndef ANDROID _ADD_H

#define ANDROID _ADD_H

namespace android {

class Add {

public:

int setN(int n);

private:

static const void getAddService();

};

}; //namespace

#endif // ANDROID _ADD_H

Add.cpp文件:

#include <utils/IServiceManager.h>

#include <utils/IPCThreadState.h>

#include “Add.h”

namespace android {

sp binder;

int Add::setN(int n){

getAddService();

Parcel data, reply;

data.writeInt32(getpid());

data.writeInt32(n);

LOGE(“BpAddService::create remote()->transact()/n”);

binder->transact(0, data, &reply);

int i = reply.readInt32();

return i;

}

const void Add::getAddService(){

sp sm = defaultServiceManager();

binder = sm->getService(String16(“guilh.add”));

LOGE(“Add::getAddService %p/n”,sm.get());

if (binder == 0) {

LOGW(“AddService not published, waiting…”);

return;

}

}

};

Android.mk文件:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=Add.cpp

LOCAL_SHARED_LIBRARIES := libutils libAddService

LOCAL_MODULE := libAdd

LOCAL_PRELINK_MODULE:= false

include $(BUILD_SHARED_LIBRARY)

Step-6:下面写个JNI Native 类别来使用Add 类别之对象。透过JNI Native 函数,就可以与Java 层的Service 服务衔接起来。

首选使用javah命令生成相应头文件。

com_hello_Service_MySer.h文件:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class com_hello_Service_MySer */

#ifndef _Included_com_hello_Service_MySer

#define _Included_com_hello_Service_MySer

#ifdef __cplusplus

extern “C” {

#endif

/*

* Class:     com_hello_Service_MySer

* Method:    intFromJNI

* Signature: ()I

*/

JNIEXPORT jint JNICALL Java_com_hello_Service_MySer_intFromJNI

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

然后实现相应函数。

com_hello_Service_MySer.cpp文件:

#include <jni.h>

#include <JNIHelp.h>

#include “…/libadd/Add.h”

#include “com_hello_Service_MySer.h”

JNIEXPORT jint JNICALL Java_com_hello_Service_MySer_intFromJNI(JNIEnv * env, jobject thiz)

{

android::Add myadd;

int r = myadd.setN(5);

return r;

}

Android.mk文件:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=com_hello_Service_MySer.cpp

LOCAL_C_INCLUDES:= $(JNI_H_INCLUDE)

LOCAL_SHARED_LIBRARIES := libutils libAdd

LOCAL_MODULE := libJniAdd

LOCAL_PRELINK_MODULE:= false

include $(BUILD_SHARED_LIBRARY)

所有相关文件组织:

a@ubuntu:~/work/android/source_android/development/my_module$ tree service

service

|-- addserver

|   |-- Android.mk

|   `-- addserver.cpp

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值