Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android C++;不满足抽象方法的实现_Android_C++_Inheritance_Abstract Class - Fatal编程技术网

Android C++;不满足抽象方法的实现

Android C++;不满足抽象方法的实现,android,c++,inheritance,abstract-class,Android,C++,Inheritance,Abstract Class,在一个Android项目中,我有一个非常混乱的继承情况,我不能完全理解。 这是我在编译时遇到的错误: proprietary/external/audioATCmdHandlerServer/AudioCmdHandler.cpp:4458:51: error: cannot allocate an object of abstract type 'android::MediaRecorder' m_MediaRecorderClient = new MediaRecorder

在一个Android项目中,我有一个非常混乱的继承情况,我不能完全理解。 这是我在编译时遇到的错误:

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;
这是MediaRecorder.h中的MediaRecorder类

............
.......
#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:public BnMediaRecorderClient,
公共虚拟死亡通知程序
{
公众:
MediaRecorder();
~MediaRecorder();
虚空死亡();
status_t initCheck();
状态设置摄像头(常量sp和摄像头、常量sp和代理);
状态设置预览表面(常数sp和表面);
状态设置视频源(int vs);
状态设置音频源(int as);
状态设置输出格式(int of);
状态设置视频编码器(int-ve);
状态设置音频编码器(int ae);
状态设置输出文件(常量字符*路径);
状态设置输出文件(int fd、int64偏移量、int64长度);
状态设置视频大小(整数宽度、整数高度);
状态设置视频帧率(每秒整数帧);
状态设置参数(常量字符串8和参数);
状态设置侦听器(常量sp和侦听器);
状态\u t setClientName(常量String16和clientName);
状态准备();
状态获取最大振幅(int*max);
状态_t start();
状态停止();
状态重置();
status_t init();
状态_t close();
状态释放();
无效通知(int msg、int ext1、int ext2);
sp querySurfaceMediaSourceFromMediaServer();
#ifdef MTK_AOSP_增强
状态设置参数SEXTRA(常量字符串8和参数);
#恩迪夫
私人:
void doCleanUp();
status_t doReset();
sp-mmedia记录器;
sp-mListener;
//对IGP生产商的参考
//用于编码GL帧。仅当
//视频源被设置为视频源缓冲区
sp mSurfaceMediaSource;
媒体记录器状态mCurrentState;
布尔错误音频源集;
bool-mIsVideoSourceSet;
bool-mIsAudioEncoderSet;
bool-mIsVideoEncoderSet;
布尔输出错误文件集;
互斥锁;
互斥锁mNotifyLock;
};
这是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);
};

};
#包括
#包括
#包括
名称空间android{
IMediaRecorderClient类:公共接口
{
公众:
声明元接口(MediaRecorderClient);
虚拟无效通知(int msg,int ext1,int ext2)=0;
虚拟void readAudio()=0;
};
// ----------------------------------------------------------------------------
类BnMediaRecorderClient:公共BnInterface
{
公众:
虚拟状态合同(uint32代码,
const地块和数据,
包裹*答复:,
uint32_t标志=0);
};
};
这是IMediaRecorderClient.cpp的摘录,在我看来,它实现了抽象方法virtual void readAudio()

#包括
#包括
#包括
#包括
名称空间android{
枚举{
NOTIFY=IBinder::第一次调用\u事务,
读音,
};
BpMediaRecorderClient类:公共BpInterface
{
公众:
BpMediaRecorderClient(常量sp和impl)
:BpInterface(impl)
{
}
虚拟无效通知(int msg、int ext1、int ext2)
{
包裹数据,回复;
writeInterfaceToken(IMediaRecorderClient::GetInterfacedDescriptor());
数据写入32(msg);
数据写入32(ext1);
数据写入32(ext2);
remote()->transact(通知、数据和回复,IBinder::FLAG_单向);
}
虚拟void readAudio()
{
包裹数据,回复;
writeInterfaceToken(IMediaRecorderClient::GetInterfacedDescriptor());
remote()->transact(读取音频、数据和回复,IBinder::FLAG\u单向);
}
};

我哪里错了?

编译器在下面的
AudioCmdHandler.cpp
语句中告诉您:

    m_MediaRecorderClient = new MediaRecorder();
有人试图实例化类
MediaRecorder
,它是一个抽象类。抽象类意味着它至少有一个未定义的虚拟函数,在您的情况下,它是
readAudio()

怎么回事?

您显示的
MediaRecorder
的类定义没有提供
readAudio()
。但是该类继承自
BnMediaRecorderClient
。该类也不提供
readAudio()
,而是继承自模板
BnInterface

我不知道template类
BnInterface
是如何定义的,但我想它是一个扩展了作为参数提供的接口的类,因此,
MediaRecorder
最终将间接继承
IMediaRecorderClient

这个函数定义了这个纯虚函数:

virtual void readAudio() = 0;
如何解决它?


您必须在
MediaRecorder
中提供并实现此函数,以便能够实例化此类的对象。

编译器在
AudioCmdHandler.cpp
的以下语句中告诉您:

    m_MediaRecorderClient = new MediaRecorder();
有人试图实例化类
MediaRecorder
,它是一个抽象类。抽象类意味着它至少有一个未定义的虚拟函数,在您的情况下,它是
readAudio()

怎么回事?

您显示的
MediaRecorder
的类定义没有提供
readAudio()
。但是该类继承自
BnMediaRecorderClient
。该类也不提供
readAudio()
,而是继承自模板
BnInterface

我不知道怎么做