2013-09-05 3 views
0

Я столкнулся фатальную ошибку, когда я делаю обратный вызов JNI из нативного кода:Ошибка выполнения на JNI обратного вызова

SIGSEGV ..

Distribution: CentOS release 5.9 (Final), x64 

Problematic frame: 

V [libjvm.so+0x53499f] JNI_CreateJavaVM+0x20e6f 

И код важной проблеме:

JavaVM *JVM; 
JavaVMAttachArgs args; 

jobject jlistener; 
jmethodID callback; 


JNIEXPORT void JNICALL JNI_FUNC_NAME(open) (JNIEnv *env, jobject obj, jobject config) { 
    env->GetJavaVM(&JVM); 

    args.version = JNI_VERSION_1_6; 
    args.name = "notifyThread"; 
    args.group = NULL; 

    // ... 
} 

JNIEXPORT void JNICALL JNI_FUNC_NAME(setListener) (JNIEnv *env, jobject obj, jobject listener) { 
    jlistener = env->NewGlobalRef(listener); 
    jclass thisClass = env->GetObjectClass(listener); 

    jmethodID callback = env->GetMethodID(thisClass, "messageRx", "(B)V"); 
    // if (NULL == notifyMethod) return; 

    return; 
} 


void notify(jbyte x) { 
    JNIEnv *jniEnv; 
    int envState = JVM->GetEnv((void **)&jniEnv, 0x00010006); 

    if(envState == (-2)) { 
     if(JVM->AttachCurrentThread((void**)&jniEnv, &args) != 0) 
      jniEnv->ThrowNew(exc, "Could not attach current notifying thread."); 
    } 

    jniEnv->CallVoidMethod(jlistener, callback, x); // notify 

    JVM->DetachCurrentThread(); 
} 

Если я прокомментирую линию обратного вызова (jniEnv->CallVoidMethod ...), проблем нет, и все работает так, как ожидалось. Проблема связана с фактическим обратным вызовом и, что еще более странно, на некоторых JVM, он работает.

У вас есть какие-либо идеи по этому вопросу?

+0

Если вы сделаете исключение после присоединения, вы не должны ничего делать. Вы также не должны отсоединяться, если вы не прикрепляетесь. – technomage

+0

Это правильно, но это все еще не решает проблему. Поток подключается, но обратный вызов приводит к фатальной ошибке JNI_CreateJavaVM. –

ответ

0

Проблема заключалась в том, что обратный вызов используется до создания глобальной ссылки на объект-слушатель (jlistener не был инициализирован).

Смежные вопросы