【问题标题】:Android NDK assert.h problemsAndroid NDK assert.h 问题
【发布时间】:2012-02-04 11:10:02
【问题描述】:

第一个 - 是 NDEBUG 以某种方式默认定义的,所以断言在你 #undef 之前不起作用。 第二个 - 他们确实有效,但我没有收到 DDMS 的登录信息。

如果有一些android特定的assert.h?

还是我做错了什么?

【问题讨论】:

  • 是否定义NDEBUG 应取决于编译器标志。如果您在发布模式下编译,则应该在调试模式下定义它,显然不应该。您可以检查(如果您的 IDE 设置没有回答该问题),方法是在源文件中放入类似 #ifdef NDEBUG\n#error Oops, NDEBUG is defined\n#endif(将 '\n' 替换为实际的换行符)并编译它。

标签: android c++ c android-ndk assert


【解决方案1】:

如果你想用断言编译你的代码,那么你可以通过三种方式来实现:

  • 在 ndk-build 命令行中使用 NDK_DEBUG=1 参数
  • 将android:debuggable="true"添加到AndroidManifest.xml中的标签
  • 将 APP_OPTIM := debug 添加到您的 Application.mk 文件 - 这也将禁用优化并使用调试符号进行编译

【讨论】:

    【解决方案2】:

    通常程序会在调用assert() 后由于SIGSEGV 信号而崩溃,默认情况下NDEBUG 是定义的,您可以在编译期间通过添加标志(LOCAL_CFLAGS += -UNDEBUG)来关闭但不适用于我的情况。

    我发现另一个解决方案是使用__android_log_assert,只需定义如下并将assert()替换为assert3

    #define assert3(e...) __android_log_assert(e, "TAG", #e)
    

    【讨论】:

    • -UNDEBUG 实际上对我有用.. 非常感谢
    • 但是为什么呢?为什么我在发布模式下构建时不能使用assert 语句?
    猜你喜欢
    • 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
    相关资源
    最近更新 更多