书接上回,继续第三种方式,是手动生成 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博客