Android binder-クライアント(c++層)がサービス端末(java層)を呼び出し、サービス端末がクライアントの例をフィードバックする。
27346 ワード
学習しました:android binder-クライアント(java層)の呼び出しサービス端末(c++層)の例http://blog.csdn.net/ganyue803/article/details/41315733
android binder c++層-クライアント(c++)がサービス端末(c++)を呼び出した例http://blog.csdn.net/ganyue803/article/details/41315519
Android binder c++層-クライアントサービス-クライアント(c++層)がサービス端末(c++層)の例を呼び出し、サービス端末がクライアントサービスを再開する。http://blog.csdn.net/ganyue803/article/details/41316707
クライアント(c+++層)がサービス端末(java層)を呼び出している状況をさらに学びたいです。例を書き始める。
サービス:ファイル構造は下記の図のようです。はappプロジェクトを作成し、MyBinderServiceをBinderのサービスとして追加しました。このサービスはランチャーチャーにアイコンがないかもしれません。起動してからサービスを開始します。そこでここでstartServiceはAppplicationで処理します。
Android Manifest.xml
次にクライアントを実現します。ファイルは以下の通りです。。
Android.mk
android binder c++層-クライアント(c++)がサービス端末(c++)を呼び出した例http://blog.csdn.net/ganyue803/article/details/41315519
Android binder c++層-クライアントサービス-クライアント(c++層)がサービス端末(c++層)の例を呼び出し、サービス端末がクライアントサービスを再開する。http://blog.csdn.net/ganyue803/article/details/41316707
クライアント(c+++層)がサービス端末(java層)を呼び出している状況をさらに学びたいです。例を書き始める。
サービス:ファイル構造は下記の図のようです。はappプロジェクトを作成し、MyBinderServiceをBinderのサービスとして追加しました。このサービスはランチャーチャーにアイコンがないかもしれません。起動してからサービスを開始します。そこでここでstartServiceはAppplicationで処理します。
Android Manifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lzl.bindertest"
android:sharedUserId="android.uid.system">
<application android:name=".BinderTestApplication"
android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:theme="@style/AppTheme"
>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<service android:name="com.lzl.bindertest.MyBinderService"/>
application>
manifest>
MyBinderService.javapackage com.lzl.bindertest;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.support.annotation.Nullable;
import android.util.Log;
/**
* Created by lzl on 2017/7/6.
*/
public class MyBinderService extends Service{
final String TAG = "bindertest";
final String MyBinderService_name = "lzl.mybinderservice";
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
IMyBinderService.Stub mBinder = new IMyBinderService.Stub(){
// ,onTransact
@Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
switch (code) {
case Stub.TRANSACTION_mytest:
int dataSize = data.dataSize();
int replySize = reply.dataSize();
Log.d(TAG, "dataSize:" + dataSize + ", replySize:" + replySize);
//
int streamType = data.readInt();
int pid = data.readInt();
int writeNum = mytest(streamType, pid);
// parcel , ,
reply.writeInt(0);
Log.d(TAG, "reply.writeInt:" + writeNum);
reply.writeInt(writeNum); //
break;
}
return true;
}
@Override
public int mytest(int streamType, int pid) throws RemoteException {
// do something...
int result = 100;
return result;
}
};
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "============MyBinderService onCreate==========");
// ServiceManager , APP ,
// android framework.jar
ServiceManager.addService(MyBinderService_name, mBinder);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
}
BinderTestApple.javapackage com.lzl.bindertest;
import android.app.Application;
import android.content.Intent;
import android.util.Log;
/**
* Created by lzl on 2017/7/6.
*/
public class BinderTestApplication extends Application {
final String TAG = "bindertest";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "=========BinderTestApplication onCreate=========");
startService(new Intent(this, MyBinderService.class));
}
}
MainActivity.javaは処理しません。package com.lzl.bindertest;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
final String TAG = "bindertest";
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "============MainActivity onCreate==========");
}
}
IMyBinderService.aidl// IMyBinderService.aidl
package com.lzl.bindertest;
// Declare any non-default types here with import statements
interface IMyBinderService {
int mytest(int streamType, int pid);
}
IMyBinderService.aidlを追加すると、clean projectまたはrebuild projectは、対応するIMyBinderService.javaを自動的に生成します。/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: F:\\Work\\MyDemo\\bindertest\\src\\main\\aidl\\com\\lzl\\bindertest\\IMyBinderService.aidl
*/
package com.lzl.bindertest;
// Declare any non-default types here with import statements
public interface IMyBinderService extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.lzl.bindertest.IMyBinderService
{
private static final java.lang.String DESCRIPTOR = "com.lzl.bindertest.IMyBinderService";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.lzl.bindertest.IMyBinderService interface,
* generating a proxy if needed.
*/
public static com.lzl.bindertest.IMyBinderService asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.lzl.bindertest.IMyBinderService))) {
return ((com.lzl.bindertest.IMyBinderService)iin);
}
return new com.lzl.bindertest.IMyBinderService.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_mytest:
{
data.enforceInterface(DESCRIPTOR);
int _arg0;
_arg0 = data.readInt();
int _arg1;
_arg1 = data.readInt();
int _result = this.mytest(_arg0, _arg1);
reply.writeNoException();
reply.writeInt(_result);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements com.lzl.bindertest.IMyBinderService
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
@Override public int mytest(int streamType, int pid) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(streamType);
_data.writeInt(pid);
mRemote.transact(Stub.TRANSACTION_mytest, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
// ID , ID mytest 。
static final int TRANSACTION_mytest = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
public int mytest(int streamType, int pid) throws android.os.RemoteException;
}
プロジェクトをコンパイルしてappを生成して、インストールしてスタートして、MyBinderServiceはシステムの中に追加しました。次にクライアントを実現します。ファイルは以下の通りです。。
Android.mk
# Copyright 2009 The Android Open Source Project
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
nativeBinderTest.cpp \
IMyBinderManager.cpp
LOCAL_SHARED_LIBRARIES := libc \
libcutils \
libbinder \
libutils
LOCAL_LDLIBS :=-llog
LOCAL_MODULE:= nativebinder
LOCAL_MODULE_TAGS := debug
LOCAL_CFLAGS : = -DRIL_SHLIB
include $(BUILD_EXECUTABLE)
IMyBinderManager.h#ifndef IMYBINDERMANAGER_H_H
#define IMYBINDERMANAGER_H_H
#include
#include
#include
#include
#include
#include
#include
#include
using namespace android;
namespace android
{
class IMyBinderManager : public IInterface
{
public:
DECLARE_META_INTERFACE(MyBinderManager); // declare macro
virtual int mytest(int streamType, int pid)=0;
};
enum
{
MYTEST = IBinder::FIRST_CALL_TRANSACTION+0,
};
class BpMyBinderManager: public BpInterface {
public:
BpMyBinderManager(const sp& impl);
virtual int mytest(int streamType, int pid);
};
}
#endif
IMyBinderManager.cpp#include "IMyBinderManager.h"
namespace android
{
IMPLEMENT_META_INTERFACE(MyBinderManager, "com.lzl.bindertest.IMyBinderService");
}
native BinderTest.cpp// Copyright 2009 The Android Open Source Project
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "IMyBinderManager.h"
using namespace android;
#define BINDERTEST_DEBUG
#define TAG "bindertest"
#ifdef BINDERTEST_DEBUG
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__)
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__)
#else
#define LOGD(...) do { } while(0)
#define LOGI(...) do { } while(0)
#define LOGW(...) do { } while(0)
#define LOGF(...) do { } while(0)
#endif
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__)
#endif
#define MY_BINDER_SERIVCE_NAME "lzl.mybinderservice"
namespace android
{
BpMyBinderManager::BpMyBinderManager(const sp& impl) :
BpInterface(impl) {
}
int BpMyBinderManager::mytest(int streamType, int pid) {
LOGW("Client call server mytest method
");
Parcel data, reply;
data.writeInt32(streamType);
data.writeInt32(pid);
remote()->transact(MYTEST, data, &reply);
int code = reply.readExceptionCode();//
int result;
reply.readInt32(&result);//
LOGW("Server exepction code: %d
", code);
return result;
}
}
int main (int /*argc*/, char **/*argv*/)
{
int socketfd;
int tempBuf[2];
tempBuf[0] = 12; //streamType
tempBuf[1] = 198; //pid
sp sm = defaultServiceManager();
sp binder = sm->getService(String16(MY_BINDER_SERIVCE_NAME));
if (binder == NULL){
LOGW( "Client can't find Service" );
return -1;
} else {
LOGW( "Client find Service" );
}
sp service = interface_cast(binder);
int result = service->mytest(tempBuf[0], tempBuf[1]); //
LOGW("MyBinderManager client result:%d", result);
return 0;
}
Androidシステムのソース環境でクライアントプログラムをコンパイルし、native binder binファイルを生成し、binファイルをマシンにプッシュし、binファイルを実行するように命令し、ロゴを確認します。