1. 程式人生 > >客戶端(java層) 呼叫 服務端(c++層) 例子

客戶端(java層) 呼叫 服務端(c++層) 例子

客戶端是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 staticfinalintFUNC_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