2016-09-11 15 views
1

Androidプロジェクトでは、私が完全に理解できない非常に面倒な継承状況があります。 これは私がコンパイル取得エラーです:これはmediarecorder.h抽象メソッドのC++実装が満足されていない

............ 
....... 
#include <media/IMediaRecorderClient.h> 
....... 
........... 

class MediaRecorder : public BnMediaRecorderClient, 
         public virtual IMediaDeathNotifier 
{ 
public: 
    MediaRecorder(); 
    ~MediaRecorder(); 

    void  died(); 
    status_t initCheck(); 
    status_t setCamera(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy); 
    status_t setPreviewSurface(const sp<IGraphicBufferProducer>& surface); 
    status_t setVideoSource(int vs); 
    status_t setAudioSource(int as); 
    status_t setOutputFormat(int of); 
    status_t setVideoEncoder(int ve); 
    status_t setAudioEncoder(int ae); 
    status_t setOutputFile(const char* path); 
    status_t setOutputFile(int fd, int64_t offset, int64_t length); 
    status_t setVideoSize(int width, int height); 
    status_t setVideoFrameRate(int frames_per_second); 
    status_t setParameters(const String8& params); 
    status_t setListener(const sp<MediaRecorderListener>& listener); 
    status_t setClientName(const String16& clientName); 
    status_t prepare(); 
    status_t getMaxAmplitude(int* max); 
    status_t start(); 
    status_t stop(); 
    status_t reset(); 
    status_t init(); 
    status_t close(); 
    status_t release(); 
    void  notify(int msg, int ext1, int ext2); 
    sp<IGraphicBufferProducer>  querySurfaceMediaSourceFromMediaServer(); 

#ifdef MTK_AOSP_ENHANCEMENT 
    status_t setParametersExtra(const String8& params); 
#endif 

private: 
    void     doCleanUp(); 
    status_t    doReset(); 

    sp<IMediaRecorder>   mMediaRecorder; 
    sp<MediaRecorderListener> mListener; 

    // Reference to IGraphicBufferProducer 
    // for encoding GL Frames. That is useful only when the 
    // video source is set to VIDEO_SOURCE_GRALLOC_BUFFER 
    sp<IGraphicBufferProducer> mSurfaceMediaSource; 

    media_recorder_states  mCurrentState; 
    bool      mIsAudioSourceSet; 
    bool      mIsVideoSourceSet; 
    bool      mIsAudioEncoderSet; 
    bool      mIsVideoEncoderSet; 
    bool      mIsOutputFileSet; 
    Mutex      mLock; 
    Mutex      mNotifyLock; 
}; 

からクラスMediaRecorderある

proprietary/external/audioATCmdHandlerServer/AudioCmdHandler.cpp:4458:51: error: cannot allocate an object of abstract type 'android::MediaRecorder' 
     m_MediaRecorderClient = new MediaRecorder(); 
               ^
In file included from proprietary/external/audioATCmdHandlerServer/AudioCmdHandler.h:101:0, 
       from proprietary/external/audioATCmdHandlerServer/AudioCmdHandler.cpp:199: 
frameworks/av/include/media/mediarecorder.h:245:7: note: because the following virtual functions are pure within 'android::MediaRecorder': 
class MediaRecorder : public BnMediaRecorderClient, 
    ^
In file included from frameworks/av/include/media/mediarecorder.h:30:0, 
       from proprietary/external/audioATCmdHandlerServer/AudioCmdHandler.h:101, 
       from proprietary/external/audioATCmdHandlerServer/AudioCmdHandler.cpp:199: 
frameworks/av/include/media/IMediaRecorderClient.h:32:18: note:  virtual void android::IMediaRecorderClient::readAudio() 
    virtual void readAudio() = 0; 

これはIMediaRecorderClient.h

#include <utils/RefBase.h> 
#include <binder/IInterface.h> 
#include <binder/Parcel.h> 

namespace android { 

class IMediaRecorderClient: public IInterface 
{ 
public: 
    DECLARE_META_INTERFACE(MediaRecorderClient); 

    virtual void notify(int msg, int ext1, int ext2) = 0; 
    virtual void readAudio() = 0; 
}; 

// ---------------------------------------------------------------------------- 

class BnMediaRecorderClient: public BnInterface<IMediaRecorderClient> 
{ 
public: 
    virtual status_t onTransact(uint32_t code, 
            const Parcel& data, 
            Parcel* reply, 
            uint32_t flags = 0); 
}; 

}; 

であり、これはからの抜粋ですIMediaRecorderClient.cpp、抽象メソッドを実装しているようです。virtual void readAudio()

#include <utils/RefBase.h> 
#include <binder/IInterface.h> 
#include <binder/Parcel.h> 

#include <media/IMediaRecorderClient.h> 

namespace android { 

enum { 
    NOTIFY = IBinder::FIRST_CALL_TRANSACTION, 
    READ_AUDIO, 
}; 

class BpMediaRecorderClient: public BpInterface<IMediaRecorderClient> 
{ 
public: 
    BpMediaRecorderClient(const sp<IBinder>& impl) 
     : BpInterface<IMediaRecorderClient>(impl) 
    { 
    } 

    virtual void notify(int msg, int ext1, int ext2) 
    { 
     Parcel data, reply; 
     data.writeInterfaceToken(IMediaRecorderClient::getInterfaceDescriptor()); 
     data.writeInt32(msg); 
     data.writeInt32(ext1); 
     data.writeInt32(ext2); 
     remote()->transact(NOTIFY, data, &reply, IBinder::FLAG_ONEWAY); 
    } 

    virtual void readAudio() 
    { 
     Parcel data, reply; 
     data.writeInterfaceToken(IMediaRecorderClient::getInterfaceDescriptor()); 
     remote()->transact(READ_AUDIO, data, &reply, IBinder::FLAG_ONEWAY); 
    } 
}; 

どこが間違っていますか?

m_MediaRecorderClient = new MediaRecorder(); 

抽象クラスであるクラスMediaRecorderをインスタンス化しようとする試みがある:

+1

TLDR:コンパイラは、問題の内容を正確に伝えます。 –

+0

@DieterLückingによると、エラーメッセージは100%クリアです。しかし、あなたには分からない場合は、問題のコードは 'BpMediaRecorderClient'をインスタンス化していません。 MediaRecorderをインスタンス化しています。 –

+0

ありがとう、それはまさに私が恐れていたものです。私が得ることができなかったメカニズムが問題を解決することを望んでいました。ですから、MediaRecorderをインスタンス化する場合は、readAudioを定義する必要があります。 – 4javier

答えて

0

コンパイラがAudioCmdHandler.cppの次のステートメントでことを語っています。抽象クラスは、定義されていない仮想関数が少なくとも1つあることを意味し、その場合はreadAudio()です。

どうしてですか?

表示したクラス定義MediaRecorderは、readAudio()を提供しません。しかし、クラスはBnMediaRecorderClientから継承しています。これはいずれもreadAudio()を提供せず、テンプレートBnInterface<IMediaRecorderClient>から継承します。

私はテンプレートクラスBnInterface<...>が定義されているかを正確に知りませんが、私はそれが最後で、MediaRecorderは間接的IMediaRecorderClientから継承されるように、引数として提供されるインタフェースを拡張しCRTPあると思います。

virtual void readAudio() = 0; 

はどのようにそれを解決するために:

そして、この1は、この純粋仮想関数を定義しますか?

このクラスのオブジェクトをインスタンス化できるようにするには、MediaRecorderにこの関数を指定して実装する必要があります。

+0

あなたもありがとう。以前の答えは正しい、試合はより完全です。私はそれを受け入れたものとしてマークします。 – 4javier

+0

@ 4javier: 'BpMediaRecorderClient'やその他の具体的なクラスをインスタンス化し、' MediaRecord'クラスで混乱させるべきではないでしょう。 –

関連する問題