2016-10-13 5 views
1

У меня была проблема с тем, что WeakGlobalRef указал на собранный мусор объект, это разбитое приложение, когда я пытаюсь вызвать CallVoidMethod в этом ref. Чтобы исправить это, я следующее:JNI LocalRef от WeakGlobalRef

jobject javaObject = pEnv->NewLocalRef(m_pJavaObject); 

if (javaObject) 
{ 
    pEnv->CallVoidMethod(javaObject, method, object); 
} 

Это еще сбой в CallVoidMethod, это действует, чтобы сделать это так, или я должен также сделать проверку на местном исх IsSameObject

Последняя вещь, я получаю на свалку, выше ничего, что может указывать любой метод:

Crash reason: SIGSEGV 
Crash address: 0xdead4321 
Process uptime: not available 

Thread 0 (crashed) 
(...) 
41 libart.so + 0xba7df 
    sp = 0xbeed2dc0 pc = 0xb4eca7e1 
    Found by: stack scanning 
42 libxxx.so!_JNIEnv::CallVoidMethod(_jobject*, _jmethodID*, ...) [jni.h : 650 + 0x1] 
    sp = 0xbeed2dd8 pc = 0x9fabbeb9 
    Found by: stack scanning 
+0

_ «Это все еще сбой при вызове CallVoidMethod» _ Тогда вы, вероятно, должны добавить сообщение об ошибке/stacktrace в свой вопрос. – Michael

+0

@ Майкл Я добавил часть стека и ошибку –

ответ

1

должен я также проверить на местном исх IsSameObject

The documentation дает ответ:

рекомендуется, чтобы стандартная (сильный) локальной или глобальной ссылкой на тот же объект быть получены с использованием функции JNI NewLocalRef или NewGlobalRef, и что это сильное ссылки можно использовать для доступа предполагаемый объект. Эти функции возвращают NULL, если объект был освобожден, и в противном случае вернет сильную ссылку (что предотвратит освобождение объекта). Новая ссылка должна быть явно удалена, когда немедленный доступ к объекту больше не требуется, позволяя освободить объект.

Если объект был освобожден, вы получите NULL от NewLocalRef, следовательно, нет необходимости вызывать IsSameObject.