【问题标题】:New to C/C++ Using Android NDK to port Legacy code, getting compile errorsC/C++ 新手使用 Android NDK 移植 Legacy 代码,出现编译错误
【发布时间】:2010-04-19 17:05:05
【问题描述】:

我今天一直在尝试使用 NDK 将一些旧的 Symbian C++ 代码转移到 Android。

我几乎没有 C 或 C++ 知识,所以这是一件苦差事,但必须完成。

我的主要问题是我在移植我认为是 Symbian 特定代码以使用 Android NDK 提供的小型 C/C++ 子集时遇到问题。

这是我在使用 cygwin 时遇到的编译错误的图片

我想知道是否有人可以为我指出如何处理这些错误的正确方向?例如 TBool/Int/TUint/RPointerArray/RSocket 是 Symbian 原语,这就是它无法编译的原因还是其他原因?

什么是 ISO C++?

任何教程、指南或提示和帮助将不胜感激。

编辑:

这是我尝试导入的 .h 文件中的代码 sn-p,后面是编译器的 sn-p 输出。

有人可以指导我如何将这个 Symbian 特定代码移植到普通 C++ 中吗?

如果我知道 Symbian 的具体内容以及如何更改它,我相信我可以更改,然后开始自己移植其余部分


#ifndef __RTPSTREAM_H__
#define __RTPSTREAM_H__


class CRTPParser;

class MDataRecorderObserver
{
public:
virtual void DataRecorded(const TDesC8& aData, TUint aCodec, TUint aFramesizeMs)=0;

};

class MRTPStreamDataObserver
{
 public:
virtual void AudioDataSent()=0;
virtual void DataReceived(const TDesC8& aData,TUint aCodec, TBool aMarker, TUint aSeq, TUint aTime)=0;
virtual void DataReceived(const TDesC8& aData)=0;
};

$ make APP=ndk-socket
Android NDK: Building for application 'ndk-socket'
Compile++ thumb: socket <= apps/ndk-socket/project/jni/rtpstream.cpp
In file included from apps/ndk-socket/project/jni/com_ciceronetworks_utils_RTPJn
i.h:2,
             from apps/ndk-socket/project/jni/rtpstream.cpp:4:
build/platforms/android-3/arch-arm/usr/include/jni.h:489: note: the mangling of
'va_list' has changed in GCC 4.4
In file included from apps/ndk-socket/project/jni/rtpstream.cpp:11:
apps/ndk-socket/project/jni/rtp/RTPStream.h:15: error: ISO C++ forbids declarati
on of 'TDesC8' with no type
apps/ndk-socket/project/jni/rtp/RTPStream.h:15: error: expected ',' or '...' bef
ore '&' token
apps/ndk-socket/project/jni/rtp/RTPStream.h:23: error: ISO C++ forbids declarati
on of 'TDesC8' with no type
apps/ndk-socket/project/jni/rtp/RTPStream.h:23: error: expected ',' or '...' bef
ore '&' token
apps/ndk-socket/project/jni/rtp/RTPStream.h:24: error: ISO C++ forbids declarati
on of 'TDesC8' with no type
apps/ndk-socket/project/jni/rtp/RTPStream.h:24: error: expected ',' or '...' bef
ore '&' token
apps/ndk-socket/project/jni/rtp/RTPStream.h:24: error: 'virtual void MRTPStreamD
ataObserver::DataReceived(int)' cannot be overloaded
apps/ndk-socket/project/jni/rtp/RTPStream.h:23: error: with 'virtual void MRTPSt
reamDataObserver::DataReceived(int)'
apps/ndk-socket/project/jni/rtp/RTPStream.h:30: error: 'TInt' has not been deca
red

【问题讨论】:

  • 是的,这些都是非标准类型。您的代码似乎充满了 Symbian 特定的代码。不确定您的代码是做什么的,是业务逻辑吗?一些算法实现?用户界面?对于 ISO C++,请阅读关于 C++ en.wikipedia.org/wiki/C_plus_plus 的 wiki 文章。
  • 请注意,您可以通过单击左侧的小“c:”图标从菜单中选择“编辑 -> 标记”从 Windows 命令提示符窗口复制文本的菜单栏(或通过按 alt-space),用鼠标选择要复制的文本,然后按“enter”复制它。比屏幕截图更容易阅读,然后您可以选择其中的部分内容进行 Google 搜索。
  • 嗨 ivan,代码是一个 rtp 流实现,Brooks,感谢您的提示!
  • 为那段代码添加了代码 sn-p 和编译器输出

标签: c++ c java-native-interface compiler-errors android-ndk


【解决方案1】:

通过“ISO C++”,G++ 编译器意味着“C++ 标准”。

当它被混淆时,这看起来像是通常的 G++ 错误喷吐。通常只有最上面的错误信息是有意义的,剩下的就是编译器打印出来的,因为它被混淆了。奇怪的是,关于“'

另外,从谷歌搜索来看,关于 va_name 修改的初始注释似乎只是提供信息,在这种情况下不太可能导致问题 - 特别是,肯定不会导致这些编译器的其余部分错误。

编辑:根据您发布的修改后的错误输出和源代码,看起来错误只是该代码使用“TDesc8”数据类型而没有首先声明,并且其余的可能会随之而来。根据我在网上找到的in the Symbian documentation 的信息,使用该类型的代码应该有一个#include &lt;e32des8.h&gt; 行来包含相关的标题。您正在编译的代码是否包含该标头?

【讨论】:

  • 谢谢布鲁克斯,我自己在谷歌上搜索了 va_name mangling 警告,也得出了这个结论,对不起,我应该在最初的问题中发布。我添加了一个代码 sn-p 和尝试编译它的输出,看看是否有人能更理解这个问题
  • Donal:我在评论中添加了针对新信息的编辑;希望有帮助!
  • 谢谢 Brooks,看起来是这样的,我的代码不包含该标头,因为它不是 Android NDK 中构建环境的一部分,因此这意味着 Symbian 代码需要一个完全改写外观
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多