理解IServiceManager :: getInterfaceDescriptor()不是静态的

时间:2016-03-16 05:25:56

标签: android c++ android-source

当我阅读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
.......        

asInterfacestatic并且没问题。 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.

1 个答案:

答案 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();
}

运行良好。