在网上看到了一个例子,关于binder的例子,网址是http://blogold.chinaunix.net/u4/123238/showart_2442417.html
一下是代码:CalService.h文件#ifndef ANDROID _CAL_SERVICE_H
#define ANDROID _CAL_SERVICE_H
#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
namespace android
{
class CalService : public BBinder
{
public:
enum { //运算操作的命令类型
ADD,
SUB,
MUL,
DIV,
};
static int instantiate();
CalService();
virtual ~CalService();
virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);
};
};
#endif
CalService.cpp文件
#include "CalService.h"
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>
namespace android
{
static struct sigaction oldact;
static pthread_key_t sigbuskey; int CalService::instantiate()
{
LOGD("CalService instantiate");
/*向ServiceManager注册CalService服务,名字为"CalService"*/
int ret = defaultServiceManager()->addService(String16("CalService"), new CalService());
return ret;
} CalService::CalService()
{
LOGD("CalService created");
pthread_key_create(&sigbuskey, NULL);
} CalService::~CalService()
{
pthread_key_delete(sigbuskey);
LOGD("CalService destroyed");
}
/*具体实现函数*/
status_t CalService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code)
{
case ADD: {
pid_t pid = data.readInt32();
int num1 = data.readInt32();
int num2 = data.readInt32();
int result = num1 + num2;
reply->writeInt32(result);
return NO_ERROR;
} break;
case SUB: {
pid_t pid = data.readInt32();
int num1 = data.readInt32();
int num2 = data.readInt32();
int result = num1 - num2;
reply->writeInt32(result);
return NO_ERROR;
} break;
case MUL: {
pid_t pid = data.readInt32();
int num1 = data.readInt32();
int num2 = data.readInt32();
int result = num1 * num2;
reply->writeInt32(result);
return NO_ERROR;
} break;
case DIV: {
pid_t pid = data.readInt32();
int num1 = data.readInt32();
int num2 = data.readInt32();
float result = num1 / num2;
reply->writeFloat(result);
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:= CalService.cpp
LOCAL_C_INCLUDES:= $(JNI_H_INCLUDE) \
frameworks/base/include #注意添加头文件路径
LOCAL_SHARED_LIBRARIES:= \ #注意需要调用这些共享库
libutils \
libcutils \
libbinder \
libandroid_runtime
LOCAL_MODULE:= libCalService #服务的库名字
LOCAL_PRELINK_MODULE:= false
include $(BUILD_SHARED_LIBRARY)
在linux下,若编译生成这个动态库,是不是必须在源码的编译环境下编译啊。在NDK下用ndk-build是否可以编译?谢谢
一下是代码:CalService.h文件#ifndef ANDROID _CAL_SERVICE_H
#define ANDROID _CAL_SERVICE_H
#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
namespace android
{
class CalService : public BBinder
{
public:
enum { //运算操作的命令类型
ADD,
SUB,
MUL,
DIV,
};
static int instantiate();
CalService();
virtual ~CalService();
virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);
};
};
#endif
CalService.cpp文件
#include "CalService.h"
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>
namespace android
{
static struct sigaction oldact;
static pthread_key_t sigbuskey; int CalService::instantiate()
{
LOGD("CalService instantiate");
/*向ServiceManager注册CalService服务,名字为"CalService"*/
int ret = defaultServiceManager()->addService(String16("CalService"), new CalService());
return ret;
} CalService::CalService()
{
LOGD("CalService created");
pthread_key_create(&sigbuskey, NULL);
} CalService::~CalService()
{
pthread_key_delete(sigbuskey);
LOGD("CalService destroyed");
}
/*具体实现函数*/
status_t CalService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code)
{
case ADD: {
pid_t pid = data.readInt32();
int num1 = data.readInt32();
int num2 = data.readInt32();
int result = num1 + num2;
reply->writeInt32(result);
return NO_ERROR;
} break;
case SUB: {
pid_t pid = data.readInt32();
int num1 = data.readInt32();
int num2 = data.readInt32();
int result = num1 - num2;
reply->writeInt32(result);
return NO_ERROR;
} break;
case MUL: {
pid_t pid = data.readInt32();
int num1 = data.readInt32();
int num2 = data.readInt32();
int result = num1 * num2;
reply->writeInt32(result);
return NO_ERROR;
} break;
case DIV: {
pid_t pid = data.readInt32();
int num1 = data.readInt32();
int num2 = data.readInt32();
float result = num1 / num2;
reply->writeFloat(result);
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:= CalService.cpp
LOCAL_C_INCLUDES:= $(JNI_H_INCLUDE) \
frameworks/base/include #注意添加头文件路径
LOCAL_SHARED_LIBRARIES:= \ #注意需要调用这些共享库
libutils \
libcutils \
libbinder \
libandroid_runtime
LOCAL_MODULE:= libCalService #服务的库名字
LOCAL_PRELINK_MODULE:= false
include $(BUILD_SHARED_LIBRARY)
在linux下,若编译生成这个动态库,是不是必须在源码的编译环境下编译啊。在NDK下用ndk-build是否可以编译?谢谢
#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>估计要在源码下才能编译,因为这么多头文件解决不了.