当我阅读aosp
来源IServiceManager.cpp IServiceManager.h
时,我会找到代码。我知道它来自宏
DECLARE_META_INTERFACE (ServiceManager, "android.os.IServiceManager")IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager");
#define DECLARE_META_INTERFACE(INTERFACE) \
static const android::String16 descriptor; \
static android::sp<I##INTERFACE> asInterface( \
const android::sp<android::IBinder>& obj); \
virtual const android::String16& getInterfaceDescriptor() const;\
I##INTERFACE(); \
virtual ~I##INTERFACE();
翻译一段代码后,就像这样
class IServiceManager : public IInterface
{
public:
DECLARE_META_INTERFACE(ServiceManager);
.......
==&GT;
class IServiceManager : public IInterface
{
public:
.......
const android::String16& getInterfaceDescriptor() const; //macro be translated
.......
asInterface
是static
并且没问题。 getInterfaceDescriptor
不是static
类的方法,而是virtual const
。为什么getInterfaceDescriptor
类可以直接调用方法IServiceManager
?
virtual sp<IBinder> checkService( const String16& name) const
{
Parcel data, reply;
data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
data.writeString16(name);
remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);
return reply.readStrongBinder();
}
我哪里错了?如果你知道,请告诉我。感谢。
我写了一个测试代码。
#include <iostream>
using namespace std;
class AA {
public:
virtual void bb() {
cout<<"sdfsdf";
}
};
int main(int argc, char *argv[]) {
AA::bb();
}
发生错误。
Untitled 4.cpp:13:6: error: call to non-static member function without an object argument
AA::bb();
~~~~^~
1 error generated.
答案 0 :(得分:0)
可悲的是,对我来说很愚蠢,只是因为我不熟悉C ++编程。 IServiceManager::getInterfaceDescriptor()
在其派生类中调用。所以它是调用超类实例方法的方式。我把它搞砸了。
测试代码:
#include <iostream>
using namespace std;
class AA {
public:
virtual void aa() {
cout<<"sdfsdf";
}
};
class BB : public AA {
public:
void bb(){
AA::aa();
}
};
int main(int argc, char *argv[]) {
BB bObject;
bObject.bb();
}
运行良好。