如何在Java中连接到活页夹C服务?

如何在Java中连接到活页夹C服务?,第1张

概述我想在C中创建绑定程序服务并能够绑定到该服务Java提供的服务.我的问题是?我模仿了在frameworks/base/camera/tests/CameraServiceTest/中实现CameraServiceTest.cpp.它编译良好,没有任何警告,我可以运行它.但是我该如何连接呢?该服务的代码在这里:/*Imitatingframewor

我想在C中创建绑定程序服务并能够绑定到该服务
Java提供的服务.我的问题是?我模仿了
在frameworks / base / camera / tests / CameraServiceTest /中实现
CameraServiceTest.cpp.它编译良好,没有任何警告,我
可以运行它.但是我该如何连接呢?

该服务的代码在这里:

/* Imitating frameworks/base/camera/tests/CameraServiceTest/CameraServiceTest.cpp */#include <binder/IInterface.h>#include <binder/IPCThreadState.h>#include <binder/IServiceManager.h>#include <binder/Processstate.h>#include <binder/IBinder.h>using namespace androID;class IPokeService : public IInterface {        protected:                enum {                        POKE = IBinder::FirsT_CALL_TRANSACTION                };        public:                DECLARE_Meta_INTERFACE(PokeService);                virtual voID poke() = 0;};class BnPokeService : public BnInterface<IPokeService> {        virtual status_t onTransact(uint32_t code, const Parcel& data,Parcel* reply, uint32_t flags = 0);};class BpPokeService : public BpInterface<IPokeService> {        public:                BpPokeService(const sp<IBinder>& impl) :BpInterface<IPokeService>(impl) {                }                virtual voID poke() {                        Parcel data, reply;                        remote()->transact(POKE, data, &reply);                }};IMPLEMENT_Meta_INTERFACE(PokeService, "PokeService");status_t BnPokeService::onTransact(uint32_t code, const Parcel& data,Parcel* reply, uint32_t flags) {        switch(code) {                case POKE: {                          poke();                          return NO_ERROR;                } break;                default:                        return BBinder::onTransact(code, data, reply, flags);        }}class PokeService : public BnPokeService {        virtual voID poke() {                printf("Poked\n");        }};int main(int argc, char **argv){        defaultServiceManager()->addService(String16("PokeService"), newPokeService());        Processstate::self()->startThreadPool();        androID::Processstate::self()->startThreadPool();        LOGI("Poke service is Now ready");        IPCThreadState::self()->joinThreadPool();        return 0;}

这是我的AndroID.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_fileS := main.cppLOCAL_CFLAGS += -dplATFORM_ANDROIDLOCAL_MODulE := poke# for Now, until I do a full rebuild.LOCAL_PRElink_MODulE := falseLOCAL_SHARED_liBRARIES += liblogLOCAL_SHARED_liBRARIES += libutils libui libcutilsLOCAL_SHARED_liBRARIES += libbinderinclude $(BUILD_EXECUtable)

当我在java中列出清单时,该服务不会显示:

Context context = getBaseContext();ActivityManager am = (ActivityManager)context.getSystemService(Activity.ACTIVITY_SERVICE);List<RunningServiceInfo> serviceInfos = am.getRunningServices(50);for (RunningServiceInfo service : serviceInfos) {        Log.i("Service", "Process " + service.process + " with component " + service.service.getClassname());}

那只会从logcat给我:

I/Service (  715): Process system with componentcom.androID.internal.service.wallpaper.ImageWallpaperI/Service (  715): Process com.androID.phone with componentcom.androID.phone.BluetoothheadsetServiceI/Service (  715): Process com.androID.inputmethod.latin withcomponent com.androID.inputmethod.latin.LatiniME

任何帮助,将不胜感激!

亲切的问候,
塞缪尔

解决方法:

我的理解是您不能这样做,因为客户端应用程序没有提供任何获取目标句柄的方法.

如果您正在编写特权本机服务,则可以使用您选择的名称在活页夹驱动程序中注册,但是大概您不是拥有该设备的系统证书的OEM.

典型的java类型服务会基于意图而非绑定器服务名称来生成句柄,但是您必须对现有接口与绑定器进行大量劝阻,以便能够从本机代码而不是本地代码中进行处理.从Java.

如果您不想通过jni进行备份并从Java进行 *** 作,最好使用unix域套接字而不是绑定器.

(对不起,如果我使用了错误的用语-一个月前我曾对此进行了非常详细的调查,发现无法满足我的要求并放弃了它)

总结

以上是内存溢出为你收集整理的如何在Java中连接到活页夹C服务?全部内容,希望文章能够帮你解决如何在Java中连接到活页夹C服务?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1083199.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存