Android 12 S 自定义native服务访问java服务

系列文章

Android 12 S ServiceManager原理

Android 12 S Native Service的创建流程

Android 12 S Binder原理之BpBinder,BnBinder以及IInterface介绍

Android 12 S HIDL Service创建流程

Android 12 S 自定义Hal服务selinux权限添加

Android 12 S 自定义Native服务selinux权限添加

Android 12 S java服务调用native服务

Android 12 S 自定义native服务访问java服务


由于C++无法引入java头文件,所以C++服务访问java服务有些麻烦。

native服务作为Client端,其代码位于如下目录:

android/frameworks/native/services/customizemanagerservice

WMS作为Server端,其代码路径如下:

android/frameworks/base/services/core/java/com/android/server/wm

1. 在frameworks/base/core/java/android/view/IWindowManager.aidl中添加自定义接口

+    /**
+     * set customize.
+    */
+    int setcustomize();

2. 在frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java中添加相应实现

+
+    @Override
+    public int setcustomize() {
+        Slog.d(TAG, "setcustomize");
+        return 1;
+    }

3. 在rameworks/native/services/customizemanagerservice下创建如下文件

IWindowManager.cpp*

WindowManager.cpp*

include_windowmanager/IWindowManager.h

include_windowmanager/WindowManager.h

include_windowmanager/IWindowManager.h
#ifndef ANDROID_IWINDOW_MANAGER_H
#define ANDROID_IWINDOW_MANAGER_H

#ifndef __ANDROID_VNDK__

#include <binder/IInterface.h>

namespace android {

// ------------------------------------------------------------------------------------

class IWindowManager : public IInterface
{
//这个public一定一定不要忘记加上
public:
    DECLARE_META_INTERFACE(WindowManager)

    virtual int setcustomize() = 0;

    enum {
        //这个说明这个函数是WindowManager的第一个方法,如果是在后面的方法,
        //可以采用IBinder::FIRST_CALL_TRANSACTION + number(看你函数名排在第几位)
        SET_CUSTOMIZE = IBinder::FIRST_CALL_TRANSACTION,
    };
};

// ------------------------------------------------------------------------------------

} // namespace android

#else // __ANDROID_VNDK__
#error "This header is not visible to vendors"
#endif // __ANDROID_VNDK__

#endif // ANDROID_IWINDOW_MANAGER_H
IBinder::FIRST_CALL_TRANSACTION + number,如果不知道number是几的话,就会aidl文件里数一数
IWindowManager.cpp*

#include <WindowManager.h>
#include <IWindowManager.h>
#include <binder/Parcel.h>
#include <utils/Errors.h>

namespace android {

// ------------------------------------------------------------------------------------

class BpWindowManager : public BpInterface<IWindowManager>
{
public:
    explicit BpWindowManager(const sp<IBinder>& impl)
        : BpInterface<IWindowManager>(impl)
    {
    }

    virtual int setcustomize()
    {
        Parcel data, reply;
        data.writeInterfaceToken(IWindowManager::getInterfaceDescriptor());
        status_t ret = remote()->transact(SET_CUSTOMIZE, data, & reply);
        if (ret == NO_ERROR) {
            return reply.readInt32();
        }
        return -1;
    }
};

// ------------------------------------------------------------------------------------

IMPLEMENT_META_INTERFACE(WindowManager, "android.view.IWindowManager")

} // namespace android
include_windowmanager/WindowManager.h
#pragma once

#ifndef __ANDROID_VNDK__

#include <IWindowManager.h>

#include <utils/threads.h>

// ---------------------------------------------------------------------------
namespace android {

class WindowManager
{
public:
    int setcustomize();
private:
    Mutex mLock;
    sp<IWindowManager> mService;
    sp<IWindowManager> getService();
};


} // namespace android
// ---------------------------------------------------------------------------
#else // __ANDROID_VNDK__
#error "This header is not visible to vendors"
#endif // __ANDROID_VNDK__

WindowManager.cpp*
#include <mutex>
#include <unistd.h>

#include <WindowManager.h>
#include <binder/Binder.h>
#include <binder/IServiceManager.h>

#include <utils/SystemClock.h>

namespace android {

sp<IWindowManager> WindowManager::getService()
{
    std::lock_guard<Mutex> scoped_lock(mLock);
    int64_t startTime = 0;
    sp<IWindowManager> service = mService;
    while (service == nullptr || !IInterface::asBinder(service)->isBinderAlive()) {
        sp<IBinder> binder = defaultServiceManager()->checkService(String16("window"));
        if (binder == nullptr) {
            // Wait for the window service to come back...
            if (startTime == 0) {
                startTime = uptimeMillis();
                ALOGI("Waiting for window service");
            } else if ((uptimeMillis() - startTime) > 1000000) {
                ALOGW("Waiting too long for window service, giving up");
                service = nullptr;
                break;
            }
            usleep(25000);
        } else {
            service = interface_cast<IWindowManager>(binder);
            mService = service;
        }
    }
    return service;
}

int WindowManager::setcustomize()
{
    sp<IWindowManager> service = getService();
    return service != nullptr ? service->setcustomize() : -1;
}
} // namespace android

4. 在native service中调用java服务

frameworks/native/libs/binder/include/binder/IInterface.h

在kManualInterfaces中添加android.view.IWindowManager

5. 在native service中调用java服务

CustomizeManagerService.cpp
#include "WindowManager.h"
int CustomizeManagerService::setcustomize(){
    WindowManager wm;
    return wm.setcustomize();
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值