notify BoardCanvas when we're closing a game so that it won't try to

use, in callback on UI thread, a dict that may no longer be valid.
Theory is this is why I'm seeing odd crashes in the jni.
This commit is contained in:
Eric House 2013-11-26 08:06:38 -08:00
parent 8976d26f00
commit 66eb96dce2
3 changed files with 16 additions and 4 deletions

View file

@ -2095,6 +2095,7 @@ public class BoardActivity extends XWActivity
m_jniThread.waitToStop( save ); m_jniThread.waitToStop( save );
m_jniThread = null; m_jniThread = null;
} }
m_view.stopHandling();
clearThis(); clearThis();

View file

@ -165,10 +165,12 @@ public class BoardCanvas extends Canvas implements DrawCtx {
public void setJNIThread( JNIThread jniThread ) public void setJNIThread( JNIThread jniThread )
{ {
if ( ! jniThread.equals( m_jniThread ) ) { DbgUtils.assertOnUIThread();
if ( null == jniThread ) {
} else if ( ! jniThread.equals( m_jniThread ) ) {
DbgUtils.logf( "BoardCanvas changing threads" ); DbgUtils.logf( "BoardCanvas changing threads" );
m_jniThread = jniThread;
} }
m_jniThread = jniThread;
} }
public int getCurPlayer() public int getCurPlayer()
@ -538,9 +540,9 @@ public class BoardCanvas extends Canvas implements DrawCtx {
m_dictChars = null; m_dictChars = null;
m_activity.runOnUiThread( new Runnable() { m_activity.runOnUiThread( new Runnable() {
public void run() { public void run() {
if ( null != m_jniThread ) {
m_dictChars = XwJNI.dict_getChars( dictPtr ); m_dictChars = XwJNI.dict_getChars( dictPtr );
// draw again // draw again
if ( null != m_jniThread ) {
m_jniThread.handle( JNIThread.JNICmd m_jniThread.handle( JNIThread.JNICmd
.CMD_INVALALL ); .CMD_INVALALL );
} }

View file

@ -269,6 +269,15 @@ public class BoardView extends View implements BoardHandler, SyncedDraw {
invalidate(); invalidate();
} }
public void stopHandling()
{
m_jniThread = null;
m_jniGamePtr = 0;
if ( null != m_canvas ) {
m_canvas.setJNIThread( null );
}
}
// SyncedDraw interface implementation // SyncedDraw interface implementation
public void doJNIDraw() public void doJNIDraw()
{ {