android 新增native binder service 方式(三)

发布于:2025-03-01 ⋅ 阅读:(16) ⋅ 点赞:(0)

书接上回,继续第三种方式,是手动生成 service binder 的方法,项目结构

1,编译aidl

aidl 文件保持不变,如何生成Bn和Bp 文件呢。

aidl -I ./libserviceaidl/aidl -h ./ -o ./ --lang=cpp libserviceaidl/aidl/com/test/IService.aidl

aidl -I ./libserviceaidl/aidl -h ./ -o ./ --lang=cpp libserviceaidl/aidl/com/test/IServiceCallback.aidl

  -I aidi 文件目录  -h头文件生成路径  -o cpp文件存放路径

2,Native service 差别不大

#define LOG_TAG "testservverfirst"
#include <log/log.h>

#include <unistd.h>
#include <stdlib.h>
#include <utils/RefBase.h>
#include <utils/Log.h>
#include <binder/TextOutput.h>
#include <binder/IInterface.h>
#include <binder/IBinder.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>
#include <termios.h> 
#include <utils/String16.h>
#include "com/test/BnService.h"
#include "com/test/BnServiceCallback.h"


using namespace std;
using namespace android;

class TestService : public com::test::BnService 
{
    public:

    TestService(){
    }

    binder::Status nativecall(int i) 
    {
        ALOGI("server nativecall function is running %d",i);
        if(mycallback != nullptr){
            mycallback->onEventString(4,String16("callbacksuccuess"));
        }
        
        return binder::Status();
    }

    binder::Status  callMcu(int32_t file,const vector<uint8_t>& type, int32_t* _aidl_return){
        *_aidl_return = 1;
        ALOGI("server callMcu function is running _aidl_return",*_aidl_return);
        return binder::Status();
    }

    binder::Status  call(int32_t type){
        ALOGI("server call function is running call %d",type);
        return binder::Status();
    }


    // 实现回调注册
    binder::Status registerCallback(const sp<com::test::IServiceCallback>& callback){
        mycallback  = callback;
        return binder::Status();
    }

    private:
        sp<::com::test::IServiceCallback> mycallback;
    
};

int main(int argc, char const *argv[])
{
    ALOGD("Server is runing");
    defaultServiceManager()->addService(String16("TestService"), new TestService());
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
    
    return 0;
}

C++ 调用前面有介绍,最后补充下java 的调用方式。

3,Java 调用

try {
    Class<?> clazz = Class.forName("android.os.ServiceManager");

    Method method = clazz.getMethod("getService",String.class);

    IBinder binder = (IBinder) method.invoke(null,"TestService");

    if (binder != null){
        IService iservice = IService.Stub.asInterface(binder);
        // 千万不要忘记注册
        iservice.registerCallback(mycallback);
        iservice.call(1);
    }
} catch (ClassNotFoundException | NoSuchMethodException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
} catch (RemoteException e) {
    e.printStackTrace();
}

或者系统里面

 IService.Stub.asInterface(ServiceManager.getService("TestService"));

参考

[Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口_aidl c++-CSDN博客


网站公告

今日签到

点亮在社区的每一天
去签到