Jimmy Chen

A Programmer

Native(C、C++)跨层访问Java注册的service

  上一篇我们介绍了在Java层如何跨层访问在Native(C、C++)层注册的Binder service。这一篇我们打算反过来,在Native(C、C++)层跨层访问Java层注册的Binder service。如果对上一篇有初步了解的话,对这一篇的实现应该也不会有太多的问题,毕竟都是通过Binder调用。老样子,本篇的示例代码也是在没有添加selinux权限下进行的

Java层实现service

  Java层在AIDL的帮助下,实现service会比较简单,所以接下来service的实现我们就不用AIDL的方式了,直接是自己写代码进行实现(嗯,比较作,偏不走简单的路,真是作死)

ISayHelloServiceInterface.java

和C、C++实现service有点类似哈,这里也是先继承IInterface,作为service服务端和客户端都需要实现的基类,下面看服务端的代码实现

SayHelloService.java

从这里看,其实自己使用Java手动实现一个binder service也不是特别复杂。接下来我们看客户端的代码。

SayHelloServiceManager.java

没什么特别的,需要注意的是要先将Token写到Parcel中,然后再讲需要发送的数据写到Parcel。否则可能会出现Service处理失败的情况。当然,如果只是想通过Java注册service的话,客户端的代码都可以不用实现的,不过博主是打算在APK里面进行一些简单的测试,所以客户端的代码也就一起实现了。最后是注册service和测试的代码了,博主统一写到MainActivity中了

MainActivity.java

布局有两个button,分别用来测试sayHello和displayDialog binder调用的。好的Java层的service 实现就到这里了,接下来就到了在native层怎么通过binder调用到这个Java service了。

Native(C、C++)调用service

ISayHelloService.h

emmm,C、C++也是老样子的,定义一个公共头文件,继承IInterface,作为binder服务端和客户端都需要实现的公共类。因为我们是希望在Native中通过binder调用Java层的service,所以后面我们只需要实现客户端的代码即可

ISayHelloService.cpp

这个就是客户端的代码,文件名起得不好,记住这个是客户端的代码就行了。另外就是两个定义宏了DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE宏了,接下来我们看看客户端的实现代码。

TestClient.cpp

常规流程,获取service,然后调用就对了。最后就是Android.mk了

Android.mk

好了,最后push这个test_sayhello_client可执行程序push到system/bin 然后先运行servcie所在的apk,apk会先往system_server注册service,然后执行test_sayhello_client就可以实现native(C、C++)跨层访问Java注册的service了。OK这篇到这里,各位看官有什么问题可以留言一起交流交流。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注