android binder - 客户端(java层) 调用 服务端(c++层) 例子
2014-11-20 16:48
661 查看
客户端是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]
[align=left]LOCAL_SRC_FILES:= \[/align]
[align=left] sampleService.cpp[/align]
[align=left]LOCAL_C_INCLUDES += \[/align]
[align=left] $(LOCAL_PATH) \[/align]
[align=left]LOCAL_SHARED_LIBRARIES : = \[/align]
[align=left] libcutils \[/align]
[align=left] libbinder \[/align]
[align=left] libutils \[/align]
[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]
客户端新建一个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]
[align=left]LOCAL_SRC_FILES:= \[/align]
[align=left] sampleService.cpp[/align]
[align=left]LOCAL_C_INCLUDES += \[/align]
[align=left] $(LOCAL_PATH) \[/align]
[align=left]LOCAL_SHARED_LIBRARIES : = \[/align]
[align=left] libcutils \[/align]
[align=left] libbinder \[/align]
[align=left] libutils \[/align]
[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]
相关文章推荐
- android binder - 客户端(java层) 调用 服务端(c++层) 例子
- android binder c++层-客户端(c++) 调用 服务端(c++) 例子
- android binder c++层 - 回调客户端服务 - 客户端(c++层) 调用 服务端(c++层) 例子,服务端回调客户端服务
- 在eclipse下,JAVA通过JNI调用C++方法的简单例子(非android)
- cocos2dx 之 android java 与 c++ 互相调用 代码(以百度定位为例子)
- Android-NDK开发之第四个例子--用C/C++调用Java
- Android-NDK开发之第四个例子--用C/C++调用Java
- Android-NDK开发之第四个例子--用C/C++调用Java
- JAVA SOCKET 服务端/客户端可随时从任意一方发消息的例子
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- C++调用java CXF服务端
- Android JNI 使用的数据结构JNINativeMethod详解 ||建立Android SDK下的JNI、JAVA应用完整步骤---Android JAVA调用C++代码
- Android 在JNI中执行Java方法--C/C++调用Java
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
- AndroidJNI 通过C++调用JAVA
- Android中简单的JNI使用,C++调用JAVA
- Android客户端与JAVA服务端JSON传值
- Android java 与 javascript互访(相互调用)的方法例子
- Android学习开发4--Android在C++中调用java
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)