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

来源:互联网 发布:淘宝搜索店铺名找不到 编辑:程序博客网 时间:2024/05/18 09:09
客户端是Android程序和服务端采用C++程序编写


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

import android.app.Activity;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;

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;

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

          } finally {
              _reply.recycle();
              _data.recycle();
          }
     }
}


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;
}


Android.mk
-------------------------------------------------------------------
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng

LOCAL_SRC_FILES:= \
           sampleService.cpp

LOCAL_C_INCLUDES += \
        $(LOCAL_PATH) \

LOCAL_SHARED_LIBRARIES : = \
    libcutils \
    libbinder \
    libutils \
    libhardware

LOCAL_CFLAGS := -DRIL_SHLIB

LOCAL_MODULE:= sampleService

include $(BUILD_EXECUTABLE)

-------------------------------------------------------------------
1、先编译好服务,然后将服务跑起来
2、运行android程序,抓log



0 0