与stdarg.h相关的Android NDK问题

与stdarg.h相关的Android NDK问题,android,android-ndk,Android,Android Ndk,我正在尝试为桌面和Android创建本机(C++)跨平台日志记录。为此,我创建了一个抽象的本机Logger类,并使用实现的log方法创建了相应的继承类(StdoutLogger、AndroidLogger等)。 因此,由于Android对本机日志记录的支持是uuu Android_log_print(int prio,const char*tag,const char*fmt,…)方法,该方法使用类似printf的语法,参数数量不定,因此我将抽象日志方法用于类似的语法: virtual void

我正在尝试为桌面和Android创建本机(C++)跨平台日志记录。为此,我创建了一个抽象的本机Logger类,并使用实现的log方法创建了相应的继承类(StdoutLogger、AndroidLogger等)。 因此,由于Android对本机日志记录的支持是uuu Android_log_print(int prio,const char*tag,const char*fmt,…)方法,该方法使用类似printf的语法,参数数量不定,因此我将抽象日志方法用于类似的语法:

virtual void log(int aLogLevel, const char *tag, const char *format, ...)=0;
嗯,为了将这些不确定数量的参数传递给Android日志方法,我发现我需要使用另一种方法,该方法也可以这样做,但需要一个va_列表,而不是不确定数量的参数。它也存在于log.h中,名为uuu android_log_vprint(int prio,const char*tag,const char*fmt,va_list ap),因此我只需传递该方法的参数即可

问题是,要使所有这些都起作用,我需要stdarg.h,它包含了我需要的所有东西(比如va_列表的声明等),但是默认情况下Eclipse找不到它: 未解决的包括:

在Eclipse项目设置中,我的包含目录包括:

${NDKROOT}/platforms/android-9/arch-arm/usr/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include
很奇怪,它竟然丢失了,因为stdarg.h是C标准库的一部分

所以我在这里搜索并找到了它,所以我将它添加到了include目录中:

${NDKROOT}/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.6/include
在这之后,我让它工作得很好,但我不确定这是否是正确的方法

无论如何,后来(在另一个继承类中实现log方法时)我遇到了另一个关于vfprintf方法的问题:

virtual void Log(int aLogLevel, const char *tag, const char *format, ...)
{
    if (aLogLevel >= loglevel)
    {
        va_list args;
        va_start (args, format);
        vfprintf (stdout, format, args);
        va_end (args);
    }
}
Eclipse显示了一个错误:

Invalid arguments ' Candidates are: int vfprintf(__sFILE *, const char *, char *) '
我检查了一下,很明显它想要一个uu-va_列表(开头有uu),而不是一个va_列表,而且看起来它们显然不兼容(根据Eclipse)。这个vfprintf在stdio.h中,所以我开始搜索,并在一个类似的文件夹中找到另一个stdio.h,我找到了stdarg.h,所以我将它添加到包含目录中(并将其移动到顶部):

现在所有的错误都消失了,一切似乎都正常,但我真的不确定这是否是正确的方法。 我有最新的Eclipse/CDT/NDK/etc。 任何帮助都将不胜感激

编辑: 法登:谢谢你的回答。这个评论太长了,所以我把它放在这里。 是的,我使用${NDKROOT}/ndk-build.cmd构建本机部件


是的,我注意到Eclipse会显示错误,因此它甚至不允许我开始构建应用程序,但是当我在没有打开错误所在文件的情况下重新启动Eclipse时,它实际上成功构建了应用程序。但是当我打开它认为有错误的文件时,它不会让我重新开始构建。因此,Eclipse指示的错误和实际错误(阻止构建)之间看起来确实存在一些不一致性。也许我应该找到一种方法,让它不管指示的错误如何构建,尽管在项目中出现应该忽略的错误可能会让人恼火,不知道什么是真实的错误,什么不是真实的错误。。。或者只是添加所有需要包含目录的内容以使Eclipse满意,到目前为止,它似乎正在工作,只是不确定这是否真的是正确的方法。感谢您的帮助。

让Eclipse+CDT对Android感到满意在很大程度上是一个反复试验的问题。(为了使大小正常工作,几天甚至几周的时间都无法挽回地浪费了。)最终,您应该使用NDK工具链而不是Eclipse进行构建,所以只要Eclipse看起来满意,您就可能处于良好状态,因为它最终不会影响您的二进制文件


正如您所注意到的,一些标题(如
stdarg.h
)是由gcc提供的,而不是仿生的,因此有必要仔细研究一下。如果您有正确的定义集(可能是
\uuu need\uu va\u list
),我希望有一个定义将
\uu va\u list
等同于
va\u list

谢谢您的回答。更新了问题。
${NDKROOT}/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.6/include-fixed