客戶端(java層) 呼叫 服務端(c++層) 例子
阿新 • • 發佈:2019-01-03
客戶端是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
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