Android NDK与stdarg.h相关的问题

时间:2013-04-13 00:05:45

标签: android android-ndk

我正在尝试为桌面和Android进行本机(C ++)跨平台日志记录。为此,我创建了一个抽象的本机Logger类,以及相应的继承类(StdoutLogger,AndroidLogger等)和实现的日志方法。 因此,Android支持本机日志记录的是__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_list而不是无限数量的参数。它也存在于log.h中,被称为__android_log_vprint(int prio,const char * tag,const char * fmt,va_list ap),所以我只需要传递该方法的参数。

问题是,为了使所有这些工作,我需要stdarg.h,其中包含我需要的所有东西(如va_list的声明等),但默认情况下Eclipse无法找到它: 未解决的问题包括:

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

${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 *) '

我检查过,显然它想要一个__va_list(开头是__),而不是一个va_list,看起来它们显然不兼容(根据Eclipse)。这个vfprintf在stdio.h中,所以我开始搜索并在我找到stdarg.h的类似文件夹中找到另一个stdio.h,所以我将它添加到包含目录(并将其移到顶部):

${NDKROOT}/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.6/include-fixed

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

修改 法登:谢谢你的回答。这个评论太长了所以我把它放在这里。 是的,我使用$ {NDKROOT} /ndk-build.cmd来构建原生部分。

是的,我注意到Eclipse会指示错误的情况,所以它甚至不会让我开始构建应用程序,但是当我重新启动Eclipse而不打开错误所在的文件时,它实际上构建成功。但是当我打开它认为有错误的文件时,它不会让我再次开始构建。所以看起来Eclipse之间的错误与实际错误(阻止构建)之间存在很大的不一致。也许我应该找到一种方法来让它构建而不管指出的错误,虽然它可能是令人烦恼的项目中应该被忽略的错误,不知道什么是真实的,什么不是那么真实的错误......或者只是添加包含目录以保持Eclipse快乐所需的一切,到目前为止似乎都在工作,只是不确定这是否真的是正确的方法。谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

让Eclipse + CDT对Android感到高兴主要是试错。 (几天或者几周已经不可避免地失去了试图让size_t正常工作。)最终你应该使用NDK工具链而不是Eclipse构建,所以只要Eclipse 看起来开心你就是可能状态良好,因为最终它不会影响你的二进制文件。

正如你所注意到的,一些标题(如stdarg.h)是由gcc提供的,而不是仿生的,所以有必要挖掘一下。如果你设置了正确的#defines(也许__va_list ??),我希望有一个定义可以将va_list等同于__need___va_list