【问题标题】:How to use memset_s in Android NDK?如何在 Android NDK 中使用 memset_s?
【发布时间】:2016-02-02 23:14:09
【问题描述】:
android.ndk {
        moduleName = "hello-jni"
        stl = "stlport_static"
        CFlags.add("-std=iso9899:2011") // I have also used "-std=c11"
        ldLibs.addAll(["android", "log"])
    }

我仍然看不到 jni C 代码中的 memset_s。它说未定义的引用。

在我的 c 代码中,我还包含了 string.h、stdlib.h 和 stdio.h 以及

#define STDC_WANT_LIB_EXT1 1

仍然无法摆脱错误未定义的引用错误。

如果我添加标志 Allow_Undefined_symbols 它会编译,但是当我调用函数 memset_s 时它会崩溃。

我想问的问题如下:

1) C11 memset_s api可以在哪些Android NDK工具链中获取?

2) 我的另一个问题是我们如何在最新的带有实验性 gradle alpha5 的 android studio 中更改 android 的默认工具链?

【问题讨论】:

    标签: android android-studio android-ndk android-gradle-plugin c11


    【解决方案1】:

    C11 标准中“Annex K”的这个功能是可选的。它没有在许多 C 库中实现。

    您可以通过宏 __STDC_LIB_EXT1__ 测试是否符合附件 K。

    【讨论】:

    • 感谢@Jens 的回复,正如我在问题中提到的那样,我已经尝试过宏,我知道它是 C11 的一部分,这就是我已经添加标签的原因。可能是我问的方式不对,让我改写一下。我们可以在哪些 Android NDK 工具链中获取 C11 memset_s api?我的另一个问题是我们如何在最新的带有实验性抓取 alpha5 的 android studio 中更改 android 的默认工具链?
    • 如果有的话我会很惊讶。我还没有听说过在 Linux 世界中实现了 Annex K 的 C 库实现,也没有听说过有计划的。
    【解决方案2】:

    我找不到任何支持 C11 for NDK 的工具链。因此,我从以下链接使用了符合 c99 的解决方案:

    https://www.securecoding.cert.org/confluence/display/c/MSC06-C.+Beware+of+compiler+optimizations

    您可以根据自己的目的进行自定义。我正在为任何有需要的人添加此解决方案。

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 2014-06-09
      • 2019-11-08
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多