Когда я читаю 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);
.......
==>
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.
К сожалению, глупо для меня, просто потому что я не знаком с программированием на C ++. IServiceManager::getInterfaceDescriptor()
быть вызванным в его производном классе. Так что это способ вызова метода экземпляра суперкласса. Я перепутал это с Java.
Тестовый код:
#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();
}
Работает хорошо.
Других решений пока нет …