《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