我想在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服务?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)