安卓JNI:“;尝试使用过时的本地引用“;尝试从信号处理程序调用java方法时出错
我试图在JNI代码中处理本机signlas,这样我就可以“捕获”它们,并抛出java异常,而不是让信号使我的进程崩溃 我安装了正在调用的信号处理程序。 在信号处理程序中,我试图抛出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 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”。不