【问题标题】:.data.rel.ro+0x8 error: undefined reference to 'typeinfo for android::MediaSource'.data.rel.ro+0x8 错误:未定义对 'typeinfo for android::MediaSource' 的引用
【发布时间】:2013-02-26 15:10:06
【问题描述】:

在使用 ndk-build 在 android 中编译我的 JNI 源时,我无法解决问题。导致错误的类如下:

class MxDataSource : public MediaSource
{
    public:
          MxdataSource();
          virtual status_t start(MetaData *params);
          virtual status_t stop();
          virtual sp<MetaData> getFormat();
          virtual status_t read(MediaBuffer **buffer, const MediaSource::ReadOption *options));
          virtual ~MxDataSource();
          void LinkMxData(MxData* data);
          void DelinkMxData();
};

这里,所有的虚方法都是在MediaSource 类中定义的。现在,当我编译它时,出现以下错误:

MxDataSource.cpp(.data.rel.ro+0x8):error: undefined reference to 'typeinfo for android::MediaSource'
MxDataSource.cpp(.data.rel.ro+0x18):error: undefined reference to 'typeinfo for android::MediaSource'
MxDataSource.cpp(.data.rel.ro+0x54):error: undefined reference to 'typeinfo for android::MediaSource'

我已经查看了类似问题的 stackoverflow 链接,但无法解决。 任何方向将不胜感激。

谢谢。

【问题讨论】:

  • 您能否确认您的编译中是否包含了以下头文件? &lt;media/stagefright/DataSource.h&gt; , &lt;media/stagefright/MediaBuffer.h&gt;, &lt;media/stagefright/MediaBufferGroup.h&gt;, &lt;media/stagefright/MediaDefs.h&gt;, &lt;media/stagefright/MediaSource.h&gt;, &lt;media/stagefright/MetaData.h&gt;
  • 您能否也为frameworks/av/media/libstagefright 分享您的Android.mk 文件。你能确保MxDataSource 放在MediaSource 之后并且MediaSource.cpp 编译没有任何问题吗?
  • 再次感谢 Ganesh 的关注。我已经添加了你提到的标题。除此之外,在谷歌搜索了很多之后,我发现了一个标志-fno-rtti。你知道吗?当我在 Application.mk 中添加 APP_CPPFLAGS += -fno-rtti 时,我的编译错误得到了解决。我不知道它是否正确。我在网上搜索这个解决方案时发现的关键词是'virtual'、'-frtti'、'type-casting'等。上面的类有虚函数,派生自MediaSource。当我使用 -frtti 而不是 -fno-rtti 时,错误保持不变。对此有什么想法吗?
  • 我没有遇到APP_CPPFLAGS。我已经集成了一个新的解析器,但我的修改仅限于media/libstagefright 文件夹并将相关文件添加到Android.mk。在您的评论中,您提到了Application.mk。你能否分享更多关于你试图在哪里包含你的解析器文件的细节?它是在frameworks/av/media/libstagefright(假设是JB)还是其他文件夹下?请分享有关您的设置的更多详细信息。
  • 我正在尝试开发一个可以安装在所有安卓手机上的安卓应用程序。因此,我在 eclipse 中创建了一个项目,其中包含 jni 目录,我在其中定义 Android.mk 和 Application.mk 文件以及我的源文件。在同一个 jni 目录中,我添加了 stagefright 所需的所有包含文件和目录。目前我的 libstagefright.so 和所有标头都是从 Android ICS 构建中检索的。我的项目的 jni 目录下的 Application.mk 中添加了标志 APP_CPPFLAGS。如果我们正在考虑不同的方向,请告诉我。

标签: c++ gcc android-ndk stagefright


【解决方案1】:

您是否链接到在库中预编译的 MediaSource?似乎 MediaSource 是使用 -fno-rtti 编译的,这可能是添加 -fno-rtti 修复它的原因。 Android 是否提供 libsupc++ 运行时支持?我不是安卓开发者...

【讨论】:

  • 是的,这可能是它与 -fno-rtti 一起使用的原因。我链接了 libstagefriged.so。
猜你喜欢
  • 2021-02-16
  • 2019-03-11
  • 2010-09-23
  • 2014-06-04
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
相关资源
最近更新 更多