如何连接活页夹C++;java中的服务? < >我想在C++中创建绑定服务,并能够绑定到 来自java的服务。我的问题是怎么做?我模仿了 框架/基础/摄像机/测试/摄像机服务测试中的实现/ CameraServiceTest.cpp。它编译得很好,没有任何警告,我 我可以运行它。但我如何连接到它

如何连接活页夹C++;java中的服务? < >我想在C++中创建绑定服务,并能够绑定到 来自java的服务。我的问题是怎么做?我模仿了 框架/基础/摄像机/测试/摄像机服务测试中的实现/ CameraServiceTest.cpp。它编译得很好,没有任何警告,我 我可以运行它。但我如何连接到它,java,c++,android,Java,C++,Android,服务代码如下: /* Imitating frameworks/base/camera/tests/CameraServiceTest/ CameraServiceTest.cpp */ #include <binder/IInterface.h> #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> #include <binder/ProcessState.h&

服务代码如下:

/* 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"), new
PokeService());
        ProcessState::self()->startThreadPool();

        android::ProcessState::self()->startThreadPool();
        LOGI("Poke service is now ready");
        IPCThreadState::self()->joinThreadPool();

        return 0;
}
当我使用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());
}
任何帮助都将不胜感激

亲切问候,,
Samuel

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

如果您正在编写一个特权本机服务,您可以使用您选择的名称向绑定驱动程序注册,但您可能不是拥有设备系统证书的oem

一个典型的java类型服务会导致基于意图而不是绑定器服务名称生成句柄,但是为了能够从本机代码而不是java处理该句柄,您必须对绑定器的现有接口进行大量令人沮丧的伪造

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


(很抱歉,如果我使用了错误的术语-一个月前我非常详细地研究了这个问题,发现a无法执行我想要的操作并将其删除)

使用
getSystemService()
无法获取服务句柄,因为您的不是默认系统服务。要使用您的服务,您需要使用JNI并调用

sm = defaultServiceManager();       
binder=sm->getService(String16("SERVICENAME"));
itf=interface_cast<IMul>(binder);
sm=defaultServiceManager();
binder=sm->getService(String16(“SERVICENAME”);
itf=界面_铸件(粘合剂);
您可以使用itf接口指针调用接口公开的任何API

I/Service (  715): Process system with component
com.android.internal.service.wallpaper.ImageWallpaper
I/Service (  715): Process com.android.phone with component
com.android.phone.BluetoothHeadsetService
I/Service (  715): Process com.android.inputmethod.latin with
component com.android.inputmethod.latin.LatinIME
sm = defaultServiceManager();       
binder=sm->getService(String16("SERVICENAME"));
itf=interface_cast<IMul>(binder);