【问题标题】:Android NDK problems related to stdarg.h与 stdarg.h 相关的 Android NDK 问题
【发布时间】:2013-04-13 00:05:44
【问题描述】:

我正在尝试为桌面和 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 项目设置中,我的包含目录包括:

${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 标准库的一部分。

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

${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/等。 任何帮助将不胜感激。

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

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

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

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

    正如您所注意到的,一些标头(如stdarg.h)是由 gcc 提供的,而不是仿生的,因此有必要深入挖掘一下。如果您有正确的#defines 集(可能是__need___va_list??),我希望在某处有一个将__va_list 等同于va_list 的定义。

    【讨论】:

    • 感谢您的回答。更新了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多