【发布时间】: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