如何连接活页夹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);