安卓JNI:“;尝试使用过时的本地引用“;尝试从信号处理程序调用java方法时出错

安卓JNI:“;尝试使用过时的本地引用“;尝试从信号处理程序调用java方法时出错,java,android,c,java-native-interface,signals,Java,Android,C,Java Native Interface,Signals,我试图在JNI代码中处理本机signlas,这样我就可以“捕获”它们,并抛出java异常,而不是让信号使我的进程崩溃 我安装了正在调用的信号处理程序。 在信号处理程序中,我试图抛出java异常,但出现以下错误: JNI ERROR (app bug): attempt to use stale local reference 0x1 我已经测试了实际的throw方法调用,它在信号处理程序外部工作 在JNI_onLoad中,我保存JavaVM指针,如下所示: static JavaVM *sVm

我试图在JNI代码中处理本机signlas,这样我就可以“捕获”它们,并抛出java异常,而不是让信号使我的进程崩溃

我安装了正在调用的信号处理程序。 在信号处理程序中,我试图抛出java异常,但出现以下错误:

JNI ERROR (app bug): attempt to use stale local reference 0x1
我已经测试了实际的throw方法调用,它在信号处理程序外部工作

在JNI_onLoad中,我保存JavaVM指针,如下所示:

static JavaVM *sVm;

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
{
  sVm = jvm;
  ...install signal handler
}
以下是信号处理程序中的代码:

void android_sigaction(int signal, siginfo_t *info, void *reserved)
{
  JNIEnv *env;
  // Get JniEnv from the static JavaVM saved in JNI_OnLoad
  (*sVm)->GetEnv(sVm, (void **)&env, JNI_VERSION_1_6);
  jclass cls = (*env)->NewGlobalRef(env, (*env)->FindClass(env, "java/lang/Error"));
  (*env)->ThrowNew(env, cls, NULL);
};
还尝试使用
AttachCurrentThread
获取JniEnv,但也不起作用:

  jint rs = (*sVm)->AttachCurrentThread(sVm, &env, NULL);
  jclass cls = (*env)->NewGlobalRef(env, (*env)->FindClass(env, "java/lang/Error"));
   if (rs == JNI_OK) {
      (*env)->ThrowNew(env, cls, NULL);
  }

垃圾收集器正在删除您的variables@maven到哪个变量?我唯一使用的是我声明为全局的“cls”。不