我正在尝试处理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);
}