您的位置:首页 > 移动开发 > Android开发

android binder - 客户端(java层) 调用 服务端(c++层) 例子

2015-10-26 15:51 501 查看
客户端是Android程序和服务端采用C++程序编写

客户端新建一个Android程序,在包名 com.example.client3下有文件,如下
MainActivity.java
----------------------------------------------------------------------------------------------------------
[align=left]package com.example.client3;[/align]

[align=left]import android.app.Activity;[/align]
[align=left]import android.os.Bundle;[/align]
[align=left]import android.os.IBinder;[/align]
[align=left]import android.os.Parcel;[/align]
[align=left]import android.os.RemoteException;[/align]
[align=left]import android.os.ServiceManager;[/align]
[align=left]import android.util.Log;[/align]

public class MainActivity
extends Activity {
private static final
String TAG = MainActivity.class.getSimpleName();
private static final
java.lang.String DESCRIPTOR = "sample.hello";
private static final int FUNC_CALLFUNCTION =
1;

[align=left] @Override[/align]
protected void onCreate(Bundle
savedInstanceState) {
[align=left] super.onCreate(savedInstanceState);[/align]
[align=left] Log.i(TAG, "Client oncreate ");[/align]
[align=left] Parcel _data = Parcel.obtain();[/align]
[align=left] Parcel _reply = Parcel.obtain();[/align]
[align=left] IBinder b = ServiceManager.getService(DESCRIPTOR);[/align]
[align=left] try {[/align]
[align=left] _data.writeInterfaceToken(DESCRIPTOR);[/align]
b.transact(FUNC_CALLFUNCTION,
_data, _reply, 0);
[align=left] _reply.readException();[/align]
[align=left] _reply.readInt();[/align]
} catch (RemoteException
e) {
// TODO Auto-generated
catch block
[align=left] e.printStackTrace();[/align]

[align=left] } finally {[/align]
[align=left] _reply.recycle();[/align]
[align=left] _data.recycle();[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]

sampleService.cpp
----------------------------------------------------------------------------------------------------------

#include <binder/IServiceManager.h>

#include <binder/IBinder.h>

#include <binder/Parcel.h>

#include <binder/ProcessState.h>

#include <binder/IPCThreadState.h>

using namespace android;

#ifdef LOG_TAG

#undef LOG_TAG

#endif

#define LOG_TAG "sampleService"

#define SAMPLE_SERIVCE_DES "sample.hello"

#define FUNC_CALLFUNCTION 1

class SampleService: public BBinder
{

public:

SampleService() {

mydescriptor = String16(SAMPLE_SERIVCE_DES);

}

virtual ~SampleService()
{

}

virtual const String16&
getInterfaceDescriptor() const {

return mydescriptor;

}

protected:

void callFunction()
{

LOGE( "Service callFunction-----------");

}

virtual status_t
onTransact(uint32_t code, const Parcel& data,

Parcel* reply, uint32_t flags = 0) {

LOGD( "Service onTransact,
code = %d" , code);

switch (code)
{

case FUNC_CALLFUNCTION:

callFunction();

break;

default:

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

}

return 0;

}

private:

String16 mydescriptor;

};

int main() {

sp < IServiceManager > sm = defaultServiceManager();

SampleService* samServ = new SampleService();

status_t ret = sm->addService(String16(SAMPLE_SERIVCE_DES), samServ);

LOGD("Service main addservice ");

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

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

return 0;

}

[align=left]Android.mk[/align]
[align=left]-------------------------------------------------------------------[/align]

LOCAL_PATH:= $(call
my-dir)

[align=left]include $(CLEAR_VARS)[/align]

[align=left]LOCAL_MODULE_TAGS := eng[/align]

LOCAL_SRC_FILES:=

[align=left] sampleService.cpp[/align]

LOCAL_C_INCLUDES +=

[align=left] $(LOCAL_PATH) [/align]

LOCAL_SHARED_LIBRARIES : =

libcutils

libbinder

libutils

[align=left] libhardware[/align]

[align=left]LOCAL_CFLAGS := -DRIL_SHLIB[/align]

[align=left]LOCAL_MODULE:= sampleService[/align]

[align=left]include $(BUILD_EXECUTABLE)[/align]

-------------------------------------------------------------------

[align=left]1、先编译好服务,然后将服务跑起来[/align]
[align=left]2、运行android程序,抓log[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: