Android binder-クライアント(c++層)がサービス端末(java層)を呼び出し、サービス端末がクライアントの例をフィードバックする。


学習しました: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層)を呼び出している状況をさらに学びたいです。例を書き始める。
サービス:ファイル構造は下記の図のようです。android binder - 客户端(c++层) 调用 服务端(java层),服务端回调客户端 例子_第1张图片は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.java
package 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 = 100return 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.java
package 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ファイルを実行するように命令し、ロゴを確認します。