get/set enums from C; preserve device role setting from ui to saved

game.
This commit is contained in:
eehouse 2010-01-30 13:44:12 +00:00
parent c2e1e916b8
commit ee2fe9d193
2 changed files with 70 additions and 1 deletions

View file

@ -16,6 +16,65 @@
#include "anddict.h"
#include "andutils.h"
static jint
jenumFieldToInt( JNIEnv* env, jobject j_gi, const char* field,
const char* fieldSig )
{
LOG_FUNC();
jclass clazz = (*env)->GetObjectClass( env, j_gi );
XP_ASSERT( !!clazz );
char sig[128];
snprintf( sig, sizeof(sig), "L%s;", fieldSig );
jfieldID fid = (*env)->GetFieldID( env, clazz, field, sig );
XP_ASSERT( !!fid );
jobject jenum = (*env)->GetObjectField( env, j_gi, fid );
XP_ASSERT( !!jenum );
jmethodID mid = getMethodID( env, jenum, "ordinal", "()I" );
jint result = (*env)->CallIntMethod( env, jenum, mid );
(*env)->DeleteLocalRef( env, clazz );
(*env)->DeleteLocalRef( env, jenum );
LOG_RETURNF( "%d", result );
return result;
}
static void
intToJenumField( JNIEnv* env, jobject j_gi, int val, const char* field,
const char* fieldSig )
{
XP_LOGF( "IN %s(%d)", __func__, val );
jclass clazz = (*env)->GetObjectClass( env, j_gi );
XP_ASSERT( !!clazz );
char buf[128];
snprintf( buf, sizeof(buf), "L%s;", fieldSig );
jfieldID fid = (*env)->GetFieldID( env, clazz, field, buf );
XP_ASSERT( !!fid ); /* failed */
jobject jenum = (*env)->GetObjectField( env, j_gi, fid );
XP_ASSERT( !!jenum );
(*env)->DeleteLocalRef( env, clazz );
clazz = (*env)->GetObjectClass( env, jenum );
XP_ASSERT( !!clazz );
snprintf( buf, sizeof(buf), "()[L%s;", fieldSig );
jmethodID mid = (*env)->GetStaticMethodID( env, clazz, "values", buf );
XP_ASSERT( !!mid );
jobject jvalues = (*env)->CallStaticObjectMethod( env, clazz, mid );
XP_ASSERT( !!jvalues );
XP_ASSERT( val < (*env)->GetArrayLength( env, jvalues ) );
/* get the value we want */
jobject jval = (*env)->GetObjectArrayElement( env, jvalues, val );
XP_ASSERT( !!jval );
(*env)->SetObjectField( env, j_gi, fid, jval );
(*env)->DeleteLocalRef( env, jvalues );
(*env)->DeleteLocalRef( env, jval );
(*env)->DeleteLocalRef( env, clazz );
LOG_RETURN_VOID();
}
static CurGameInfo*
makeGI( MPFORMAL JNIEnv* env, jobject j_gi )
{
@ -36,7 +95,9 @@ makeGI( MPFORMAL JNIEnv* env, jobject j_gi )
gi->nPlayers = nPlayers;
gi->robotSmartness = robotSmartness;
gi->boardSize = boardSize;
gi->serverRole = SERVER_STANDALONE; /* figure out enums later */
gi->serverRole =
jenumFieldToInt( env, j_gi, "serverRole",
"org/eehouse/android/xw4/jni/CurGameInfo$DeviceRole");
getString( env, j_gi, "dictName", buf, VSIZE(buf) );
gi->dictName = copyString( mpool, buf );
@ -89,6 +150,9 @@ setJGI( JNIEnv* env, jobject jgi, const CurGameInfo* gi )
;
XP_ASSERT( success );
intToJenumField( env, jgi, gi->serverRole, "serverRole",
"org/eehouse/android/xw4/jni/CurGameInfo$DeviceRole" );
jobject jplayers;
if ( getObject( env, jgi, "players",
"[Lorg/eehouse/android/xw4/jni/LocalPlayer;",

View file

@ -131,6 +131,7 @@ public class GameConfig extends Activity implements View.OnClickListener {
player.setText( lp.name );
Utils.setChecked( m_curDialog, R.id.robot_check, lp.isRobot );
Utils.setChecked( m_curDialog, R.id.remote_check, ! lp.isLocal );
}
private void getPlayerSettings()
@ -141,6 +142,7 @@ public class GameConfig extends Activity implements View.OnClickListener {
lp.name = player.getText().toString();
lp.isRobot = Utils.getChecked( m_curDialog, R.id.robot_check );
lp.isLocal = !Utils.getChecked( m_curDialog, R.id.remote_check );
}
@Override
@ -292,6 +294,9 @@ public class GameConfig extends Activity implements View.OnClickListener {
m_gi.showColors = Utils.getChecked( this, R.id.color_tiles );
m_gi.robotSmartness
= Utils.getChecked( this, R.id.smart_robot ) ? 1 : 0;
int position = m_roleSpinner.getSelectedItemPosition();
Utils.logf( "setting serverrole: " + position );
m_gi.serverRole = CurGameInfo.DeviceRole.values()[position];
byte[] bytes = XwJNI.gi_to_stream( m_gi );
if ( null == bytes ) {