【发布时间】:2018-08-14 12:40:34
【问题描述】:
我有以下 CPP 代码。我想要做的是,当我的本地端发生错误时,我会通知 Java 错误。我使用How can I catch SIGSEGV (segmentation fault) and get a stack trace under JNI on Android? 作为参考。
static JavaVM* g_JVM = NULL;
static jobject g_thejavaobject = NULL;
void InitializeNativeSide(JNIEnv *env, jclass, jobject object)
{
env->GetJavaVM(&g_JVM);
g_thejavaobject = env->NewGlobalRef(object);
}
// this executes in another thread running in parallel with UI thread
void StartExecuting(JNIEnv *_env, jclass) {
struct sigaction sa;
memset(&sa, 0, sizeof(struct sigaction));
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = SignalErrorHandler;
sa.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV, &sa, NULL);
// native starts executing here. after a while, a SEGFAULT is encountered
// triggering SignalErrorHandler()
...
}
void SignalErrorHandler(int signal, siginfo_t *si, void *arg)
{
JNIEnv *env;
g_JVM->GetEnv((void**)&env, JNI_VERSION_1_6);
jclass myClass = env->FindClass("com/company/MyClass");
jmethodID myMethod = env->GetMethodID(myClass, "nativeCrashed", "()V" );
env->CallVoidMethod(g_thejavaobject, myMethod);
env->DeleteLocalRef(myClass);
}
一切正常,但对 myClass.nativeCrashed() 的调用不起作用。我做错了什么?
【问题讨论】:
-
您真的认为在信号处理程序中进行 Java 调用是安全的吗?那是行不通的。 唯一 可以从信号处理程序安全地进行的函数调用是在pubs.opengroup.org/onlinepubs/9699919799/functions/… 中列出的异步信号安全函数调用
标签: android c++ java-native-interface