【发布时间】:2016-04-05 11:18:43
【问题描述】:
我的项目使用了一个捕获崩溃的模块并在android系统中发送。在处理本机崩溃时,本机代码会做一些事情,然后从 JNI 进行 java 调用。它在 Dalvik 上运行良好。但它在 5.0 以上的 android 版本中使用 ART 失败。因为 ART 在本机信号处理期间阻止来自 JNI 的任何 Java 调用。上面说ART信号处理使用了alternate signal stack,那么在信号处理的过程中,不能调用java方法吗?还有其他方法吗??
流量:
1. Java调用native方法,但是native方法崩溃。
2. Native crash handler捕捉信号处理crash。
3、crash处理过程中,调用JNI方法失败
12-31 20:36:02.516 7845-7957 A/art: art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: JNI IsSameObject called with pending exception 'java.lang.StackOverflowError' thrown in...
in call to IsSameObject
stack=0x9fff8000-0x9fffa000 stackSize=1036KB
参考:https://code.google.com/p/android/issues/detail?id=162663
如果有人使用 ART 和/或 Bionic 可以调查一下,那就太好了。
【问题讨论】:
-
您为什么使用术语“信号”?从表面上看,您是在询问exception handling in JNI。 ART 行为合法,见developer.android.com/training/articles/…
-
我使用signal handler来捕捉和记录native调用过程中的crash,而不是关注JNI的过程。
-
请注意,Crashlytics 确实保留了 (some) 本机崩溃的堆栈跟踪。他们尽最大努力展开调用堆栈(无需调用 JVM),这通常会提供有意义的信息,有助于解决未来的情况。他们在下一次调用应用程序时将转储发送到服务器,这在 Android 上非常有意义:在这里,系统将立即重新启动因任何原因崩溃的应用程序,至少一次。
标签: android exception-handling java-native-interface native-code