Android JNI:尝试从信号处理程序调用java方法时“尝试使用过时的本地引用”错误

时间:2014-09-09 08:31:16

标签: java android c java-native-interface signals

我正在尝试处理JNI代码中的原生signlas,所以我可以" Catch"它们,并抛出一个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);
  }

0 个答案:

没有答案