【问题标题】:throwing c++ exception from android native code hangs thread从android本机代码抛出c ++异常挂起线程
【发布时间】:2017-10-24 22:21:11
【问题描述】:

似乎当我从 JNICALL 函数外部抛出异常时,任何抛出的异常都会挂起线程。

也就是说,如果我直接在 JNICALL 函数(java 本机函数)内部抛出异常,它可以被正确捕获。如果它是从 JNICALL 函数调用的函数或方法中抛出的,即使只是一次深度调用,它也会挂起线程。

我很困惑,我找不到任何其他有此问题的人的参考资料。

我的项目使用的是最新稳定的ndk,APP_STL设置为c++_shared,语言std设置为gnuc++11。

任何帮助将不胜感激。

【问题讨论】:

  • 在从 C++ 返回到 Java 之前,您是否捕获并处理了所有 C++ 异常?
  • 这种行为是预期的。您必须通过调用 describe 来处理 java 端在 C++ 中抛出的异常。否则JVM会无限等待iirc。
  • 在通过 env->ThrowNew 将 C++ 异常交还给 java 之前,我正在捕获或尝试捕获它们。代码流只在 throw 语句处停止,永远不会返回或终止。
  • 我只是尝试从 c++_shared 切换到 gnustl_shared,而不是挂起,而是在调用 throw 时崩溃并出现堆栈损坏错误(我启用了 sanitizer)。现在正试图追踪它。

标签: java android c++ android-ndk java-native-interface


【解决方案1】:

看起来它可能与 AddressSanitizer 冲突。一旦我从手机上卸载它并禁用 asan 编译器标志,它现在就可以工作了。

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2022-08-14
    相关资源
    最近更新 更多