Enforce the use of accessors on JValue so we can ensure sign extension.

Change-Id: I34810af7661d8674c84707afe5cfdf9e2c233f8b
diff --git a/src/compiler_llvm/runtime_support_llvm.cc b/src/compiler_llvm/runtime_support_llvm.cc
index 224b902..d1994f1 100644
--- a/src/compiler_llvm/runtime_support_llvm.cc
+++ b/src/compiler_llvm/runtime_support_llvm.cc
@@ -682,19 +682,29 @@
     JValue val;
     switch (shorty[i+1]) {
       case 'Z':
+        val.SetZ(va_arg(ap, jint));
+        break;
       case 'B':
+        val.SetB(va_arg(ap, jint));
+        break;
       case 'C':
+        val.SetC(va_arg(ap, jint));
+        break;
       case 'S':
+        val.SetS(va_arg(ap, jint));
+        break;
       case 'I':
+        val.SetI(va_arg(ap, jint));
+        break;
       case 'F':
-        val.i = va_arg(ap, jint);
+        val.SetI(va_arg(ap, jint)); // TODO: is this right?
         break;
       case 'L':
-        val.l = va_arg(ap, Object*);
+        val.SetL(va_arg(ap, Object*));
         break;
       case 'D':
       case 'J':
-        val.j = va_arg(ap, jlong);
+        val.SetJ(va_arg(ap, jlong)); // TODO: is this right for double?
         break;
     }
     Class* param_type = param_types->Get(i);
diff --git a/src/debugger.cc b/src/debugger.cc
index fbcd420..553bfc7 100644
--- a/src/debugger.cc
+++ b/src/debugger.cc
@@ -2216,9 +2216,9 @@
   // Copy the result.
   *pResultTag = req->result_tag;
   if (IsPrimitiveTag(req->result_tag)) {
-    *pResultValue = req->result_value.j;
+    *pResultValue = req->result_value.GetJ();
   } else {
-    *pResultValue = gRegistry->Add(req->result_value.l);
+    *pResultValue = gRegistry->Add(req->result_value.GetL());
   }
   *pExceptionId = req->exception;
   return req->error;
@@ -2257,10 +2257,10 @@
     Object* exc = self->GetException();
     VLOG(jdwp) << "  JDWP invocation returning with exception=" << exc << " " << PrettyTypeOf(exc);
     self->ClearException();
-    pReq->result_value.j = 0;
+    pReq->result_value.SetJ(0);
   } else if (pReq->result_tag == JDWP::JT_OBJECT) {
     /* if no exception thrown, examine object result more closely */
-    JDWP::JdwpTag new_tag = TagFromObject(pReq->result_value.l);
+    JDWP::JdwpTag new_tag = TagFromObject(pReq->result_value.GetL());
     if (new_tag != pReq->result_tag) {
       VLOG(jdwp) << "  JDWP promoted result from " << pReq->result_tag << " to " << new_tag;
       pReq->result_tag = new_tag;
@@ -2275,7 +2275,7 @@
      * We can't use the "tracked allocation" mechanism here because
      * the object is going to be handed off to a different thread.
      */
-    gRegistry->Add(pReq->result_value.l);
+    gRegistry->Add(pReq->result_value.GetL());
   }
 
   if (old_exception.get() != NULL) {
diff --git a/src/heap.cc b/src/heap.cc
index 76a620e..e244cf1 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -791,7 +791,7 @@
       java_lang_ref_FinalizerReference_->FindDirectMethod("add", "(Ljava/lang/Object;)V");
   DCHECK(FinalizerReference_add != NULL);
   JValue args[1];
-  args[0].l = object;
+  args[0].SetL(object);
   FinalizerReference_add->Invoke(self, NULL, args, NULL);
 }
 
@@ -805,7 +805,7 @@
     Thread* self = Thread::Current();
     ScopedThreadStateChange tsc(self, kRunnable);
     JValue args[1];
-    args[0].l = *cleared;
+    args[0].SetL(*cleared);
     ReferenceQueue_add->Invoke(self, NULL, args, NULL);
     *cleared = NULL;
   }
diff --git a/src/java_lang_reflect_Field.cc b/src/java_lang_reflect_Field.cc
index 7cc4166..fe9f79c 100644
--- a/src/java_lang_reflect_Field.cc
+++ b/src/java_lang_reflect_Field.cc
@@ -25,41 +25,39 @@
 namespace art {
 
 static bool GetFieldValue(Object* o, Field* f, JValue& value, bool allow_references) {
-  DCHECK_EQ(value.j, 0LL);
+  DCHECK_EQ(value.GetJ(), 0LL);
   ScopedThreadStateChange tsc(Thread::Current(), kRunnable);
   if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(f->GetDeclaringClass(), true, true)) {
     return false;
   }
   switch (FieldHelper(f).GetTypeAsPrimitiveType()) {
   case Primitive::kPrimBoolean:
-    value.z = f->GetBoolean(o);
+    value.SetZ(f->GetBoolean(o));
     return true;
   case Primitive::kPrimByte:
-    // Read byte and ensure it is fully sign-extended to an int.
-    value.i = ((int32_t)f->GetByte(o) << 24) >> 24;
+    value.SetB(f->GetByte(o));
     return true;
   case Primitive::kPrimChar:
-    value.c = f->GetChar(o);
+    value.SetC(f->GetChar(o));
     return true;
   case Primitive::kPrimDouble:
-    value.d = f->GetDouble(o);
+    value.SetD(f->GetDouble(o));
     return true;
   case Primitive::kPrimFloat:
-    value.f = f->GetFloat(o);
+    value.SetF(f->GetFloat(o));
     return true;
   case Primitive::kPrimInt:
-    value.i = f->GetInt(o);
+    value.SetI(f->GetInt(o));
     return true;
   case Primitive::kPrimLong:
-    value.j = f->GetLong(o);
+    value.SetJ(f->GetLong(o));
     return true;
   case Primitive::kPrimShort:
-    // Read short and ensure it is fully sign-extended to an int.
-    value.i = ((int32_t)f->GetShort(o) << 16) >> 16;
+    value.SetS(f->GetShort(o));
     return true;
   case Primitive::kPrimNot:
     if (allow_references) {
-      value.l = f->GetObject(o);
+      value.SetL(f->GetObject(o));
       return true;
     }
     // Else break to report an error.
@@ -101,7 +99,7 @@
   }
   BoxPrimitive(FieldHelper(f).GetTypeAsPrimitiveType(), value);
 
-  return AddLocalReference<jobject>(env, value.l);
+  return AddLocalReference<jobject>(env, value.GetL());
 }
 
 static JValue GetPrimitiveField(JNIEnv* env, jobject javaField, jobject javaObj, char dst_descriptor) {
@@ -128,35 +126,35 @@
 }
 
 static jboolean Field_getBoolean(JNIEnv* env, jobject javaField, jobject javaObj) {
-  return GetPrimitiveField(env, javaField, javaObj, 'Z').z;
+  return GetPrimitiveField(env, javaField, javaObj, 'Z').GetZ();
 }
 
 static jbyte Field_getByte(JNIEnv* env, jobject javaField, jobject javaObj) {
-  return GetPrimitiveField(env, javaField, javaObj, 'B').b;
+  return GetPrimitiveField(env, javaField, javaObj, 'B').GetB();
 }
 
 static jchar Field_getChar(JNIEnv* env, jobject javaField, jobject javaObj) {
-  return GetPrimitiveField(env, javaField, javaObj, 'C').c;
+  return GetPrimitiveField(env, javaField, javaObj, 'C').GetC();
 }
 
 static jdouble Field_getDouble(JNIEnv* env, jobject javaField, jobject javaObj) {
-  return GetPrimitiveField(env, javaField, javaObj, 'D').d;
+  return GetPrimitiveField(env, javaField, javaObj, 'D').GetD();
 }
 
 static jfloat Field_getFloat(JNIEnv* env, jobject javaField, jobject javaObj) {
-  return GetPrimitiveField(env, javaField, javaObj, 'F').f;
+  return GetPrimitiveField(env, javaField, javaObj, 'F').GetF();
 }
 
 static jint Field_getInt(JNIEnv* env, jobject javaField, jobject javaObj) {
-  return GetPrimitiveField(env, javaField, javaObj, 'I').i;
+  return GetPrimitiveField(env, javaField, javaObj, 'I').GetI();
 }
 
 static jlong Field_getLong(JNIEnv* env, jobject javaField, jobject javaObj) {
-  return GetPrimitiveField(env, javaField, javaObj, 'J').j;
+  return GetPrimitiveField(env, javaField, javaObj, 'J').GetJ();
 }
 
 static jshort Field_getShort(JNIEnv* env, jobject javaField, jobject javaObj) {
-  return GetPrimitiveField(env, javaField, javaObj, 'S').s;
+  return GetPrimitiveField(env, javaField, javaObj, 'S').GetS();
 }
 
 static void SetFieldValue(Object* o, Field* f, const JValue& new_value, bool allow_references) {
@@ -165,32 +163,32 @@
   }
   switch (FieldHelper(f).GetTypeAsPrimitiveType()) {
   case Primitive::kPrimBoolean:
-    f->SetBoolean(o, new_value.z);
+    f->SetBoolean(o, new_value.GetZ());
     break;
   case Primitive::kPrimByte:
-    f->SetByte(o, new_value.b);
+    f->SetByte(o, new_value.GetB());
     break;
   case Primitive::kPrimChar:
-    f->SetChar(o, new_value.c);
+    f->SetChar(o, new_value.GetC());
     break;
   case Primitive::kPrimDouble:
-    f->SetDouble(o, new_value.d);
+    f->SetDouble(o, new_value.GetD());
     break;
   case Primitive::kPrimFloat:
-    f->SetFloat(o, new_value.f);
+    f->SetFloat(o, new_value.GetF());
     break;
   case Primitive::kPrimInt:
-    f->SetInt(o, new_value.i);
+    f->SetInt(o, new_value.GetI());
     break;
   case Primitive::kPrimLong:
-    f->SetLong(o, new_value.j);
+    f->SetLong(o, new_value.GetJ());
     break;
   case Primitive::kPrimShort:
-    f->SetShort(o, new_value.s);
+    f->SetShort(o, new_value.GetS());
     break;
   case Primitive::kPrimNot:
     if (allow_references) {
-      f->SetObject(o, new_value.l);
+      f->SetObject(o, new_value.GetL());
       break;
     }
     // Else fall through to report an error.
@@ -255,52 +253,52 @@
   SetFieldValue(o, f, wide_value, false);
 }
 
-static void Field_setBoolean(JNIEnv* env, jobject javaField, jobject javaObj, jboolean value) {
-  JValue v;
-  v.z = value;
-  SetPrimitiveField(env, javaField, javaObj, 'Z', v);
+static void Field_setBoolean(JNIEnv* env, jobject javaField, jobject javaObj, jboolean z) {
+  JValue value;
+  value.SetZ(z);
+  SetPrimitiveField(env, javaField, javaObj, 'Z', value);
 }
 
-static void Field_setByte(JNIEnv* env, jobject javaField, jobject javaObj, jbyte value) {
-  JValue v;
-  v.b = value;
-  SetPrimitiveField(env, javaField, javaObj, 'B', v);
+static void Field_setByte(JNIEnv* env, jobject javaField, jobject javaObj, jbyte b) {
+  JValue value;
+  value.SetB(b);
+  SetPrimitiveField(env, javaField, javaObj, 'B', value);
 }
 
-static void Field_setChar(JNIEnv* env, jobject javaField, jobject javaObj, jchar value) {
-  JValue v;
-  v.c = value;
-  SetPrimitiveField(env, javaField, javaObj, 'C', v);
+static void Field_setChar(JNIEnv* env, jobject javaField, jobject javaObj, jchar c) {
+  JValue value;
+  value.SetC(c);
+  SetPrimitiveField(env, javaField, javaObj, 'C', value);
 }
 
-static void Field_setDouble(JNIEnv* env, jobject javaField, jobject javaObj, jdouble value) {
-  JValue v;
-  v.d = value;
-  SetPrimitiveField(env, javaField, javaObj, 'D', v);
+static void Field_setDouble(JNIEnv* env, jobject javaField, jobject javaObj, jdouble d) {
+  JValue value;
+  value.SetD(d);
+  SetPrimitiveField(env, javaField, javaObj, 'D', value);
 }
 
-static void Field_setFloat(JNIEnv* env, jobject javaField, jobject javaObj, jfloat value) {
-  JValue v;
-  v.f = value;
-  SetPrimitiveField(env, javaField, javaObj, 'F', v);
+static void Field_setFloat(JNIEnv* env, jobject javaField, jobject javaObj, jfloat f) {
+  JValue value;
+  value.SetF(f);
+  SetPrimitiveField(env, javaField, javaObj, 'F', value);
 }
 
-static void Field_setInt(JNIEnv* env, jobject javaField, jobject javaObj, jint value) {
-  JValue v;
-  v.i = value;
-  SetPrimitiveField(env, javaField, javaObj, 'I', v);
+static void Field_setInt(JNIEnv* env, jobject javaField, jobject javaObj, jint i) {
+  JValue value;
+  value.SetI(i);
+  SetPrimitiveField(env, javaField, javaObj, 'I', value);
 }
 
-static void Field_setLong(JNIEnv* env, jobject javaField, jobject javaObj, jlong value) {
-  JValue v;
-  v.j = value;
-  SetPrimitiveField(env, javaField, javaObj, 'J', v);
+static void Field_setLong(JNIEnv* env, jobject javaField, jobject javaObj, jlong j) {
+  JValue value;
+  value.SetJ(j);
+  SetPrimitiveField(env, javaField, javaObj, 'J', value);
 }
 
-static void Field_setShort(JNIEnv* env, jobject javaField, jobject javaObj, jshort value) {
-  JValue v;
-  v.s = value;
-  SetPrimitiveField(env, javaField, javaObj, 'S', v);
+static void Field_setShort(JNIEnv* env, jobject javaField, jobject javaObj, jshort s) {
+  JValue value;
+  value.SetS(s);
+  SetPrimitiveField(env, javaField, javaObj, 'S', value);
 }
 
 static JNINativeMethod gMethods[] = {
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index 86135ab..80576a9 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -187,23 +187,31 @@
     for (size_t i = 1, offset = 0; i < shorty_len_; ++i, ++offset) {
       switch (shorty_[i]) {
         case 'Z':
+          arg_array_[offset].SetZ(va_arg(ap, jint));
+          break;
         case 'B':
+          arg_array_[offset].SetB(va_arg(ap, jint));
+          break;
         case 'C':
+          arg_array_[offset].SetC(va_arg(ap, jint));
+          break;
         case 'S':
+          arg_array_[offset].SetS(va_arg(ap, jint));
+          break;
         case 'I':
-          arg_array_[offset].i = va_arg(ap, jint);
+          arg_array_[offset].SetI(va_arg(ap, jint));
           break;
         case 'F':
-          arg_array_[offset].f = va_arg(ap, jdouble);
+          arg_array_[offset].SetF(va_arg(ap, jdouble));
           break;
         case 'L':
-          arg_array_[offset].l = DecodeObj(env, va_arg(ap, jobject));
+          arg_array_[offset].SetL(DecodeObj(env, va_arg(ap, jobject)));
           break;
         case 'D':
-          arg_array_[offset].d = va_arg(ap, jdouble);
+          arg_array_[offset].SetD(va_arg(ap, jdouble));
           break;
         case 'J':
-          arg_array_[offset].j = va_arg(ap, jlong);
+          arg_array_[offset].SetJ(va_arg(ap, jlong));
           break;
       }
     }
@@ -214,23 +222,31 @@
     for (size_t i = 1, offset = 0; i < shorty_len_; ++i, ++offset) {
       switch (shorty_[i]) {
         case 'Z':
+          arg_array_[offset].SetZ(args[offset].z);
+          break;
         case 'B':
+          arg_array_[offset].SetB(args[offset].b);
+          break;
         case 'C':
+          arg_array_[offset].SetC(args[offset].c);
+          break;
         case 'S':
+          arg_array_[offset].SetS(args[offset].s);
+          break;
         case 'I':
-          arg_array_[offset].i = args[offset].i;
+          arg_array_[offset].SetI(args[offset].i);
           break;
         case 'F':
-          arg_array_[offset].f = args[offset].f;
+          arg_array_[offset].SetF(args[offset].f);
           break;
         case 'L':
-          arg_array_[offset].l = DecodeObj(env, args[offset].l);
+          arg_array_[offset].SetL(DecodeObj(env, args[offset].l));
           break;
         case 'D':
-          arg_array_[offset].d = args[offset].d;
+          arg_array_[offset].SetD(args[offset].d);
           break;
         case 'J':
-          arg_array_[offset].j = args[offset].j;
+          arg_array_[offset].SetJ(args[offset].j);
           break;
       }
     }
@@ -272,7 +288,7 @@
   for (int i = 0; i < parameter_types->GetLength(); ++i) {
     Class* parameter_type = parameter_types->Get(i);
     if (!parameter_type->IsPrimitive()) {
-      Object* argument = args[i].l;
+      Object* argument = args[i].GetL();
       if (argument != NULL && !argument->InstanceOf(parameter_type)) {
         LOG(ERROR) << "JNI ERROR (app bug): attempt to pass an instance of "
                    << PrettyTypeOf(argument) << " as argument " << (i + 1) << " to " << PrettyMethod(m);
@@ -1065,19 +1081,19 @@
     va_start(ap, mid);
     JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return AddLocalReference<jobject>(env, result.l);
+    return AddLocalReference<jobject>(env, result.GetL());
   }
 
   static jobject CallObjectMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
     JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args));
-    return AddLocalReference<jobject>(env, result.l);
+    return AddLocalReference<jobject>(env, result.GetL());
   }
 
   static jobject CallObjectMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
     JValue result(InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args));
-    return AddLocalReference<jobject>(env, result.l);
+    return AddLocalReference<jobject>(env, result.GetL());
   }
 
   static jboolean CallBooleanMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
@@ -1086,17 +1102,17 @@
     va_start(ap, mid);
     JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.z;
+    return result.GetZ();
   }
 
   static jboolean CallBooleanMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).z;
+    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).GetZ();
   }
 
   static jboolean CallBooleanMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).z;
+    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).GetZ();
   }
 
   static jbyte CallByteMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
@@ -1105,17 +1121,17 @@
     va_start(ap, mid);
     JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.b;
+    return result.GetB();
   }
 
   static jbyte CallByteMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).b;
+    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).GetB();
   }
 
   static jbyte CallByteMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).b;
+    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).GetB();
   }
 
   static jchar CallCharMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
@@ -1124,17 +1140,17 @@
     va_start(ap, mid);
     JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.c;
+    return result.GetC();
   }
 
   static jchar CallCharMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).c;
+    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).GetC();
   }
 
   static jchar CallCharMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).c;
+    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).GetC();
   }
 
   static jdouble CallDoubleMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
@@ -1143,17 +1159,17 @@
     va_start(ap, mid);
     JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.d;
+    return result.GetD();
   }
 
   static jdouble CallDoubleMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).d;
+    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).GetD();
   }
 
   static jdouble CallDoubleMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).d;
+    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).GetD();
   }
 
   static jfloat CallFloatMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
@@ -1162,17 +1178,17 @@
     va_start(ap, mid);
     JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.f;
+    return result.GetF();
   }
 
   static jfloat CallFloatMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).f;
+    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).GetF();
   }
 
   static jfloat CallFloatMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).f;
+    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).GetF();
   }
 
   static jint CallIntMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
@@ -1181,17 +1197,17 @@
     va_start(ap, mid);
     JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.i;
+    return result.GetI();
   }
 
   static jint CallIntMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).i;
+    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).GetI();
   }
 
   static jint CallIntMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).i;
+    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).GetI();
   }
 
   static jlong CallLongMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
@@ -1200,17 +1216,17 @@
     va_start(ap, mid);
     JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.j;
+    return result.GetJ();
   }
 
   static jlong CallLongMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).j;
+    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).GetJ();
   }
 
   static jlong CallLongMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).j;
+    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).GetJ();
   }
 
   static jshort CallShortMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
@@ -1219,17 +1235,17 @@
     va_start(ap, mid);
     JValue result(InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.s;
+    return result.GetS();
   }
 
   static jshort CallShortMethodV(JNIEnv* env, jobject obj, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).s;
+    return InvokeVirtualOrInterfaceWithVarArgs(env, obj, mid, args).GetS();
   }
 
   static jshort CallShortMethodA(JNIEnv* env, jobject obj, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).s;
+    return InvokeVirtualOrInterfaceWithJValues(env, obj, mid, args).GetS();
   }
 
   static void CallVoidMethod(JNIEnv* env, jobject obj, jmethodID mid, ...) {
@@ -1255,7 +1271,7 @@
     va_list ap;
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, obj, mid, ap));
-    jobject local_result = AddLocalReference<jobject>(env, result.l);
+    jobject local_result = AddLocalReference<jobject>(env, result.GetL());
     va_end(ap);
     return local_result;
   }
@@ -1264,14 +1280,14 @@
       jobject obj, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
     JValue result(InvokeWithVarArgs(env, obj, mid, args));
-    return AddLocalReference<jobject>(env, result.l);
+    return AddLocalReference<jobject>(env, result.GetL());
   }
 
   static jobject CallNonvirtualObjectMethodA(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
     JValue result(InvokeWithJValues(env, obj, mid, args));
-    return AddLocalReference<jobject>(env, result.l);
+    return AddLocalReference<jobject>(env, result.GetL());
   }
 
   static jboolean CallNonvirtualBooleanMethod(JNIEnv* env,
@@ -1281,19 +1297,19 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.z;
+    return result.GetZ();
   }
 
   static jboolean CallNonvirtualBooleanMethodV(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, obj, mid, args).z;
+    return InvokeWithVarArgs(env, obj, mid, args).GetZ();
   }
 
   static jboolean CallNonvirtualBooleanMethodA(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, obj, mid, args).z;
+    return InvokeWithJValues(env, obj, mid, args).GetZ();
   }
 
   static jbyte CallNonvirtualByteMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
@@ -1302,19 +1318,19 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.b;
+    return result.GetB();
   }
 
   static jbyte CallNonvirtualByteMethodV(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, obj, mid, args).b;
+    return InvokeWithVarArgs(env, obj, mid, args).GetB();
   }
 
   static jbyte CallNonvirtualByteMethodA(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, obj, mid, args).b;
+    return InvokeWithJValues(env, obj, mid, args).GetB();
   }
 
   static jchar CallNonvirtualCharMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
@@ -1323,19 +1339,19 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.c;
+    return result.GetC();
   }
 
   static jchar CallNonvirtualCharMethodV(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, obj, mid, args).c;
+    return InvokeWithVarArgs(env, obj, mid, args).GetC();
   }
 
   static jchar CallNonvirtualCharMethodA(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, obj, mid, args).c;
+    return InvokeWithJValues(env, obj, mid, args).GetC();
   }
 
   static jshort CallNonvirtualShortMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
@@ -1344,19 +1360,19 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.s;
+    return result.GetS();
   }
 
   static jshort CallNonvirtualShortMethodV(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, obj, mid, args).s;
+    return InvokeWithVarArgs(env, obj, mid, args).GetS();
   }
 
   static jshort CallNonvirtualShortMethodA(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, obj, mid, args).s;
+    return InvokeWithJValues(env, obj, mid, args).GetS();
   }
 
   static jint CallNonvirtualIntMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
@@ -1365,19 +1381,19 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.i;
+    return result.GetI();
   }
 
   static jint CallNonvirtualIntMethodV(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, obj, mid, args).i;
+    return InvokeWithVarArgs(env, obj, mid, args).GetI();
   }
 
   static jint CallNonvirtualIntMethodA(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, obj, mid, args).i;
+    return InvokeWithJValues(env, obj, mid, args).GetI();
   }
 
   static jlong CallNonvirtualLongMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
@@ -1386,19 +1402,19 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.j;
+    return result.GetJ();
   }
 
   static jlong CallNonvirtualLongMethodV(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, obj, mid, args).j;
+    return InvokeWithVarArgs(env, obj, mid, args).GetJ();
   }
 
   static jlong CallNonvirtualLongMethodA(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, obj, mid, args).j;
+    return InvokeWithJValues(env, obj, mid, args).GetJ();
   }
 
   static jfloat CallNonvirtualFloatMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
@@ -1407,19 +1423,19 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.f;
+    return result.GetF();
   }
 
   static jfloat CallNonvirtualFloatMethodV(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, obj, mid, args).f;
+    return InvokeWithVarArgs(env, obj, mid, args).GetF();
   }
 
   static jfloat CallNonvirtualFloatMethodA(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, obj, mid, args).f;
+    return InvokeWithJValues(env, obj, mid, args).GetF();
   }
 
   static jdouble CallNonvirtualDoubleMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
@@ -1428,19 +1444,19 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, obj, mid, ap));
     va_end(ap);
-    return result.d;
+    return result.GetD();
   }
 
   static jdouble CallNonvirtualDoubleMethodV(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, obj, mid, args).d;
+    return InvokeWithVarArgs(env, obj, mid, args).GetD();
   }
 
   static jdouble CallNonvirtualDoubleMethodA(JNIEnv* env,
       jobject obj, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, obj, mid, args).d;
+    return InvokeWithJValues(env, obj, mid, args).GetD();
   }
 
   static void CallNonvirtualVoidMethod(JNIEnv* env, jobject obj, jclass, jmethodID mid, ...) {
@@ -1647,7 +1663,7 @@
     va_list ap;
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
-    jobject local_result = AddLocalReference<jobject>(env, result.l);
+    jobject local_result = AddLocalReference<jobject>(env, result.GetL());
     va_end(ap);
     return local_result;
   }
@@ -1655,13 +1671,13 @@
   static jobject CallStaticObjectMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
     JValue result(InvokeWithVarArgs(env, NULL, mid, args));
-    return AddLocalReference<jobject>(env, result.l);
+    return AddLocalReference<jobject>(env, result.GetL());
   }
 
   static jobject CallStaticObjectMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
     JValue result(InvokeWithJValues(env, NULL, mid, args));
-    return AddLocalReference<jobject>(env, result.l);
+    return AddLocalReference<jobject>(env, result.GetL());
   }
 
   static jboolean CallStaticBooleanMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
@@ -1670,17 +1686,17 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
-    return result.z;
+    return result.GetZ();
   }
 
   static jboolean CallStaticBooleanMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, NULL, mid, args).z;
+    return InvokeWithVarArgs(env, NULL, mid, args).GetZ();
   }
 
   static jboolean CallStaticBooleanMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, NULL, mid, args).z;
+    return InvokeWithJValues(env, NULL, mid, args).GetZ();
   }
 
   static jbyte CallStaticByteMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
@@ -1689,17 +1705,17 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
-    return result.b;
+    return result.GetB();
   }
 
   static jbyte CallStaticByteMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, NULL, mid, args).b;
+    return InvokeWithVarArgs(env, NULL, mid, args).GetB();
   }
 
   static jbyte CallStaticByteMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, NULL, mid, args).b;
+    return InvokeWithJValues(env, NULL, mid, args).GetB();
   }
 
   static jchar CallStaticCharMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
@@ -1708,17 +1724,17 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
-    return result.c;
+    return result.GetC();
   }
 
   static jchar CallStaticCharMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, NULL, mid, args).c;
+    return InvokeWithVarArgs(env, NULL, mid, args).GetC();
   }
 
   static jchar CallStaticCharMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, NULL, mid, args).c;
+    return InvokeWithJValues(env, NULL, mid, args).GetC();
   }
 
   static jshort CallStaticShortMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
@@ -1727,17 +1743,17 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
-    return result.s;
+    return result.GetS();
   }
 
   static jshort CallStaticShortMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, NULL, mid, args).s;
+    return InvokeWithVarArgs(env, NULL, mid, args).GetS();
   }
 
   static jshort CallStaticShortMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, NULL, mid, args).s;
+    return InvokeWithJValues(env, NULL, mid, args).GetS();
   }
 
   static jint CallStaticIntMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
@@ -1746,17 +1762,17 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
-    return result.i;
+    return result.GetI();
   }
 
   static jint CallStaticIntMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, NULL, mid, args).i;
+    return InvokeWithVarArgs(env, NULL, mid, args).GetI();
   }
 
   static jint CallStaticIntMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, NULL, mid, args).i;
+    return InvokeWithJValues(env, NULL, mid, args).GetI();
   }
 
   static jlong CallStaticLongMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
@@ -1765,17 +1781,17 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
-    return result.j;
+    return result.GetJ();
   }
 
   static jlong CallStaticLongMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, NULL, mid, args).j;
+    return InvokeWithVarArgs(env, NULL, mid, args).GetJ();
   }
 
   static jlong CallStaticLongMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, NULL, mid, args).j;
+    return InvokeWithJValues(env, NULL, mid, args).GetJ();
   }
 
   static jfloat CallStaticFloatMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
@@ -1784,17 +1800,17 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
-    return result.f;
+    return result.GetF();
   }
 
   static jfloat CallStaticFloatMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, NULL, mid, args).f;
+    return InvokeWithVarArgs(env, NULL, mid, args).GetF();
   }
 
   static jfloat CallStaticFloatMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, NULL, mid, args).f;
+    return InvokeWithJValues(env, NULL, mid, args).GetF();
   }
 
   static jdouble CallStaticDoubleMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
@@ -1803,17 +1819,17 @@
     va_start(ap, mid);
     JValue result(InvokeWithVarArgs(env, NULL, mid, ap));
     va_end(ap);
-    return result.d;
+    return result.GetD();
   }
 
   static jdouble CallStaticDoubleMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithVarArgs(env, NULL, mid, args).d;
+    return InvokeWithVarArgs(env, NULL, mid, args).GetD();
   }
 
   static jdouble CallStaticDoubleMethodA(JNIEnv* env, jclass, jmethodID mid, jvalue* args) {
     ScopedJniThreadState ts(env);
-    return InvokeWithJValues(env, NULL, mid, args).d;
+    return InvokeWithJValues(env, NULL, mid, args).GetD();
   }
 
   static void CallStaticVoidMethod(JNIEnv* env, jclass, jmethodID mid, ...) {
diff --git a/src/jni_internal_test.cc b/src/jni_internal_test.cc
index 8f7884d..b9bb257 100644
--- a/src/jni_internal_test.cc
+++ b/src/jni_internal_test.cc
@@ -97,25 +97,25 @@
     JValue args[1];
     JValue result;
 
-    args[0].i = 0;
-    result.b = -1;
+    args[0].SetB(0);
+    result.SetB(-1);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(0, result.b);
+    EXPECT_EQ(0, result.GetB());
 
-    args[0].i = -1;
-    result.b = 0;
+    args[0].SetB(-1);
+    result.SetB(0);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(-1, result.b);
+    EXPECT_EQ(-1, result.GetB());
 
-    args[0].i = SCHAR_MAX;
-    result.b = 0;
+    args[0].SetB(SCHAR_MAX);
+    result.SetB(0);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(SCHAR_MAX, result.b);
+    EXPECT_EQ(SCHAR_MAX, result.GetB());
 
-    args[0].i = SCHAR_MIN;
-    result.b = 0;
+    args[0].SetB(SCHAR_MIN);
+    result.SetB(0);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(SCHAR_MIN, result.b);
+    EXPECT_EQ(SCHAR_MIN, result.GetB());
   }
 
   void InvokeIdentityIntMethod(bool is_static) {
@@ -126,25 +126,25 @@
     JValue args[1];
     JValue result;
 
-    args[0].i = 0;
-    result.i = -1;
+    args[0].SetI(0);
+    result.SetI(-1);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(0, result.i);
+    EXPECT_EQ(0, result.GetI());
 
-    args[0].i = -1;
-    result.i = 0;
+    args[0].SetI(-1);
+    result.SetI(0);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(-1, result.i);
+    EXPECT_EQ(-1, result.GetI());
 
-    args[0].i = INT_MAX;
-    result.i = 0;
+    args[0].SetI(INT_MAX);
+    result.SetI(0);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(INT_MAX, result.i);
+    EXPECT_EQ(INT_MAX, result.GetI());
 
-    args[0].i = INT_MIN;
-    result.i = 0;
+    args[0].SetI(INT_MIN);
+    result.SetI(0);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(INT_MIN, result.i);
+    EXPECT_EQ(INT_MIN, result.GetI());
   }
 
   void InvokeIdentityDoubleMethod(bool is_static) {
@@ -155,25 +155,25 @@
     JValue args[1];
     JValue result;
 
-    args[0].d = 0.0;
-    result.d = -1.0;
+    args[0].SetD(0.0);
+    result.SetD(-1.0);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(0.0, result.d);
+    EXPECT_EQ(0.0, result.GetD());
 
-    args[0].d = -1.0;
-    result.d = 0.0;
+    args[0].SetD(-1.0);
+    result.SetD(0.0);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(-1.0, result.d);
+    EXPECT_EQ(-1.0, result.GetD());
 
-    args[0].d = DBL_MAX;
-    result.d = 0.0;
+    args[0].SetD(DBL_MAX);
+    result.SetD(0.0);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(DBL_MAX, result.d);
+    EXPECT_EQ(DBL_MAX, result.GetD());
 
-    args[0].d = DBL_MIN;
-    result.d = 0.0;
+    args[0].SetD(DBL_MIN);
+    result.SetD(0.0);
     (*stub)(method, receiver, Thread::Current(), args, &result);
-    EXPECT_EQ(DBL_MIN, result.d);
+    EXPECT_EQ(DBL_MIN, result.GetD());
   }
 
   void InvokeSumIntIntMethod(bool is_static) {
@@ -182,36 +182,36 @@
     Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(II)I");
 
     JValue result;
-    result.i = -1;
+    result.SetI(-1);
     JValue args[2];
-    args[0].i = 0;
-    args[1].i = 0;
+    args[0].SetI(0);
+    args[1].SetI(0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(0, result.i);
+    EXPECT_EQ(0, result.GetI());
 
-    result.i = 0;
-    args[0].i = 1;
-    args[1].i = 2;
+    result.SetI(0);
+    args[0].SetI(1);
+    args[1].SetI(2);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(3, result.i);
+    EXPECT_EQ(3, result.GetI());
 
-    result.i = 0;
-    args[0].i = -2;
-    args[1].i = 5;
+    result.SetI(0);
+    args[0].SetI(-2);
+    args[1].SetI(5);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(3, result.i);
+    EXPECT_EQ(3, result.GetI());
 
-    result.i = 1234;
-    args[0].i = INT_MAX;
-    args[1].i = INT_MIN;
+    result.SetI(1234);
+    args[0].SetI(INT_MAX);
+    args[1].SetI(INT_MIN);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(-1, result.i);
+    EXPECT_EQ(-1, result.GetI());
 
-    result.i = INT_MIN;
-    args[0].i = INT_MAX;
-    args[1].i = INT_MAX;
+    result.SetI(INT_MIN);
+    args[0].SetI(INT_MAX);
+    args[1].SetI(INT_MAX);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(-2, result.i);
+    EXPECT_EQ(-2, result.GetI());
   }
 
   void InvokeSumIntIntIntMethod(bool is_static) {
@@ -220,41 +220,41 @@
     Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(III)I");
 
     JValue result;
-    result.i = -1;
+    result.SetI(-1);
     JValue args[3];
-    args[0].i = 0;
-    args[1].i = 0;
-    args[2].i = 0;
+    args[0].SetI(0);
+    args[1].SetI(0);
+    args[2].SetI(0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(0, result.i);
+    EXPECT_EQ(0, result.GetI());
 
-    result.i = 0;
-    args[0].i = 1;
-    args[1].i = 2;
-    args[2].i = 3;
+    result.SetI(0);
+    args[0].SetI(1);
+    args[1].SetI(2);
+    args[2].SetI(3);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(6, result.i);
+    EXPECT_EQ(6, result.GetI());
 
-    result.i = 0;
-    args[0].i = -1;
-    args[1].i = 2;
-    args[2].i = -3;
+    result.SetI(0);
+    args[0].SetI(-1);
+    args[1].SetI(2);
+    args[2].SetI(-3);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(-2, result.i);
+    EXPECT_EQ(-2, result.GetI());
 
-    result.i = 1234;
-    args[0].i = INT_MAX;
-    args[1].i = INT_MIN;
-    args[2].i = INT_MAX;
+    result.SetI(1234);
+    args[0].SetI(INT_MAX);
+    args[1].SetI(INT_MIN);
+    args[2].SetI(INT_MAX);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(2147483646, result.i);
+    EXPECT_EQ(2147483646, result.GetI());
 
-    result.i = INT_MIN;
-    args[0].i = INT_MAX;
-    args[1].i = INT_MAX;
-    args[2].i = INT_MAX;
+    result.SetI(INT_MIN);
+    args[0].SetI(INT_MAX);
+    args[1].SetI(INT_MAX);
+    args[2].SetI(INT_MAX);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(2147483645, result.i);
+    EXPECT_EQ(2147483645, result.GetI());
   }
 
   void InvokeSumIntIntIntIntMethod(bool is_static) {
@@ -263,46 +263,46 @@
     Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(IIII)I");
 
     JValue result;
-    result.i = -1;
+    result.SetI(-1);
     JValue args[4];
-    args[0].i = 0;
-    args[1].i = 0;
-    args[2].i = 0;
-    args[3].i = 0;
+    args[0].SetI(0);
+    args[1].SetI(0);
+    args[2].SetI(0);
+    args[3].SetI(0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(0, result.i);
+    EXPECT_EQ(0, result.GetI());
 
-    result.i = 0;
-    args[0].i = 1;
-    args[1].i = 2;
-    args[2].i = 3;
-    args[3].i = 4;
+    result.SetI(0);
+    args[0].SetI(1);
+    args[1].SetI(2);
+    args[2].SetI(3);
+    args[3].SetI(4);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(10, result.i);
+    EXPECT_EQ(10, result.GetI());
 
-    result.i = 0;
-    args[0].i = -1;
-    args[1].i = 2;
-    args[2].i = -3;
-    args[3].i = 4;
+    result.SetI(0);
+    args[0].SetI(-1);
+    args[1].SetI(2);
+    args[2].SetI(-3);
+    args[3].SetI(4);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(2, result.i);
+    EXPECT_EQ(2, result.GetI());
 
-    result.i = 1234;
-    args[0].i = INT_MAX;
-    args[1].i = INT_MIN;
-    args[2].i = INT_MAX;
-    args[3].i = INT_MIN;
+    result.SetI(1234);
+    args[0].SetI(INT_MAX);
+    args[1].SetI(INT_MIN);
+    args[2].SetI(INT_MAX);
+    args[3].SetI(INT_MIN);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(-2, result.i);
+    EXPECT_EQ(-2, result.GetI());
 
-    result.i = INT_MIN;
-    args[0].i = INT_MAX;
-    args[1].i = INT_MAX;
-    args[2].i = INT_MAX;
-    args[3].i = INT_MAX;
+    result.SetI(INT_MIN);
+    args[0].SetI(INT_MAX);
+    args[1].SetI(INT_MAX);
+    args[2].SetI(INT_MAX);
+    args[3].SetI(INT_MAX);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(-4, result.i);
+    EXPECT_EQ(-4, result.GetI());
   }
 
   void InvokeSumIntIntIntIntIntMethod(bool is_static) {
@@ -311,51 +311,51 @@
     Method::InvokeStub* stub = DoCompile(method, receiver, is_static, "sum", "(IIIII)I");
 
     JValue result;
-    result.i = -1.0;
+    result.SetI(-1.0);
     JValue args[5];
-    args[0].i = 0;
-    args[1].i = 0;
-    args[2].i = 0;
-    args[3].i = 0;
-    args[4].i = 0;
+    args[0].SetI(0);
+    args[1].SetI(0);
+    args[2].SetI(0);
+    args[3].SetI(0);
+    args[4].SetI(0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(0, result.i);
+    EXPECT_EQ(0, result.GetI());
 
-    result.i = 0;
-    args[0].i = 1;
-    args[1].i = 2;
-    args[2].i = 3;
-    args[3].i = 4;
-    args[4].i = 5;
+    result.SetI(0);
+    args[0].SetI(1);
+    args[1].SetI(2);
+    args[2].SetI(3);
+    args[3].SetI(4);
+    args[4].SetI(5);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(15, result.i);
+    EXPECT_EQ(15, result.GetI());
 
-    result.i = 0;
-    args[0].i = -1;
-    args[1].i = 2;
-    args[2].i = -3;
-    args[3].i = 4;
-    args[4].i = -5;
+    result.SetI(0);
+    args[0].SetI(-1);
+    args[1].SetI(2);
+    args[2].SetI(-3);
+    args[3].SetI(4);
+    args[4].SetI(-5);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(-3, result.i);
+    EXPECT_EQ(-3, result.GetI());
 
-    result.i = 1234;
-    args[0].i = INT_MAX;
-    args[1].i = INT_MIN;
-    args[2].i = INT_MAX;
-    args[3].i = INT_MIN;
-    args[4].i = INT_MAX;
+    result.SetI(1234);
+    args[0].SetI(INT_MAX);
+    args[1].SetI(INT_MIN);
+    args[2].SetI(INT_MAX);
+    args[3].SetI(INT_MIN);
+    args[4].SetI(INT_MAX);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(2147483645, result.i);
+    EXPECT_EQ(2147483645, result.GetI());
 
-    result.i = INT_MIN;
-    args[0].i = INT_MAX;
-    args[1].i = INT_MAX;
-    args[2].i = INT_MAX;
-    args[3].i = INT_MAX;
-    args[4].i = INT_MAX;
+    result.SetI(INT_MIN);
+    args[0].SetI(INT_MAX);
+    args[1].SetI(INT_MAX);
+    args[2].SetI(INT_MAX);
+    args[3].SetI(INT_MAX);
+    args[4].SetI(INT_MAX);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(2147483643, result.i);
+    EXPECT_EQ(2147483643, result.GetI());
   }
 
   void InvokeSumDoubleDoubleMethod(bool is_static) {
@@ -366,35 +366,35 @@
     JValue args[2];
     JValue result;
 
-    args[0].d = 0.0;
-    args[1].d = 0.0;
-    result.d = -1.0;
+    args[0].SetD(0.0);
+    args[1].SetD(0.0);
+    result.SetD(-1.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(0.0, result.d);
+    EXPECT_EQ(0.0, result.GetD());
 
-    args[0].d = 1.0;
-    args[1].d = 2.0;
-    result.d = 0.0;
+    args[0].SetD(1.0);
+    args[1].SetD(2.0);
+    result.SetD(0.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(3.0, result.d);
+    EXPECT_EQ(3.0, result.GetD());
 
-    args[0].d = 1.0;
-    args[1].d = -2.0;
-    result.d = 0.0;
+    args[0].SetD(1.0);
+    args[1].SetD(-2.0);
+    result.SetD(0.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(-1.0, result.d);
+    EXPECT_EQ(-1.0, result.GetD());
 
-    args[0].d = DBL_MAX;
-    args[1].d = DBL_MIN;
-    result.d = 0.0;
+    args[0].SetD(DBL_MAX);
+    args[1].SetD(DBL_MIN);
+    result.SetD(0.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(1.7976931348623157e308, result.d);
+    EXPECT_EQ(1.7976931348623157e308, result.GetD());
 
-    args[0].d = DBL_MAX;
-    args[1].d = DBL_MAX;
-    result.d = 0.0;
+    args[0].SetD(DBL_MAX);
+    args[1].SetD(DBL_MAX);
+    result.SetD(0.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(INFINITY, result.d);
+    EXPECT_EQ(INFINITY, result.GetD());
   }
 
   void InvokeSumDoubleDoubleDoubleMethod(bool is_static) {
@@ -405,26 +405,26 @@
     JValue args[3];
     JValue result;
 
-    args[0].d = 0.0;
-    args[1].d = 0.0;
-    args[2].d = 0.0;
-    result.d = -1.0;
+    args[0].SetD(0.0);
+    args[1].SetD(0.0);
+    args[2].SetD(0.0);
+    result.SetD(-1.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(0.0, result.d);
+    EXPECT_EQ(0.0, result.GetD());
 
-    args[0].d = 1.0;
-    args[1].d = 2.0;
-    args[2].d = 3.0;
-    result.d = 0.0;
+    args[0].SetD(1.0);
+    args[1].SetD(2.0);
+    args[2].SetD(3.0);
+    result.SetD(0.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(6.0, result.d);
+    EXPECT_EQ(6.0, result.GetD());
 
-    args[0].d = 1.0;
-    args[1].d = -2.0;
-    args[2].d = 3.0;
-    result.d = 0.0;
+    args[0].SetD(1.0);
+    args[1].SetD(-2.0);
+    args[2].SetD(3.0);
+    result.SetD(0.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(2.0, result.d);
+    EXPECT_EQ(2.0, result.GetD());
   }
 
   void InvokeSumDoubleDoubleDoubleDoubleMethod(bool is_static) {
@@ -435,29 +435,29 @@
     JValue args[4];
     JValue result;
 
-    args[0].d = 0.0;
-    args[1].d = 0.0;
-    args[2].d = 0.0;
-    args[3].d = 0.0;
-    result.d = -1.0;
+    args[0].SetD(0.0);
+    args[1].SetD(0.0);
+    args[2].SetD(0.0);
+    args[3].SetD(0.0);
+    result.SetD(-1.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(0.0, result.d);
+    EXPECT_EQ(0.0, result.GetD());
 
-    args[0].d = 1.0;
-    args[1].d = 2.0;
-    args[2].d = 3.0;
-    args[3].d = 4.0;
-    result.d = 0.0;
+    args[0].SetD(1.0);
+    args[1].SetD(2.0);
+    args[2].SetD(3.0);
+    args[3].SetD(4.0);
+    result.SetD(0.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(10.0, result.d);
+    EXPECT_EQ(10.0, result.GetD());
 
-    args[0].d = 1.0;
-    args[1].d = -2.0;
-    args[2].d = 3.0;
-    args[3].d = -4.0;
-    result.d = 0.0;
+    args[0].SetD(1.0);
+    args[1].SetD(-2.0);
+    args[2].SetD(3.0);
+    args[3].SetD(-4.0);
+    result.SetD(0.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(-2.0, result.d);
+    EXPECT_EQ(-2.0, result.GetD());
   }
 
   void InvokeSumDoubleDoubleDoubleDoubleDoubleMethod(bool is_static) {
@@ -468,32 +468,32 @@
     JValue args[5];
     JValue result;
 
-    args[0].d = 0.0;
-    args[1].d = 0.0;
-    args[2].d = 0.0;
-    args[3].d = 0.0;
-    args[4].d = 0.0;
-    result.d = -1.0;
+    args[0].SetD(0.0);
+    args[1].SetD(0.0);
+    args[2].SetD(0.0);
+    args[3].SetD(0.0);
+    args[4].SetD(0.0);
+    result.SetD(-1.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(0.0, result.d);
+    EXPECT_EQ(0.0, result.GetD());
 
-    args[0].d = 1.0;
-    args[1].d = 2.0;
-    args[2].d = 3.0;
-    args[3].d = 4.0;
-    args[4].d = 5.0;
-    result.d = 0.0;
+    args[0].SetD(1.0);
+    args[1].SetD(2.0);
+    args[2].SetD(3.0);
+    args[3].SetD(4.0);
+    args[4].SetD(5.0);
+    result.SetD(0.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(15.0, result.d);
+    EXPECT_EQ(15.0, result.GetD());
 
-    args[0].d = 1.0;
-    args[1].d = -2.0;
-    args[2].d = 3.0;
-    args[3].d = -4.0;
-    args[4].d = 5.0;
-    result.d = 0.0;
+    args[0].SetD(1.0);
+    args[1].SetD(-2.0);
+    args[2].SetD(3.0);
+    args[3].SetD(-4.0);
+    args[4].SetD(5.0);
+    result.SetD(0.0);
     (*stub)(method, NULL, Thread::Current(), args, &result);
-    EXPECT_EQ(3.0, result.d);
+    EXPECT_EQ(3.0, result.GetD());
   }
 
   JavaVMExt* vm_;
@@ -1353,7 +1353,7 @@
   Method::InvokeStub* stub = method->GetInvokeStub();
 
   JValue args[1];
-  args[0].l = NULL;
+  args[0].SetL(NULL);
 
   (*stub)(method, NULL, Thread::Current(), args, NULL);
 }
diff --git a/src/oat/runtime/support_proxy.cc b/src/oat/runtime/support_proxy.cc
index 25cafc2..46f2313 100644
--- a/src/oat/runtime/support_proxy.cc
+++ b/src/oat/runtime/support_proxy.cc
@@ -118,13 +118,13 @@
       if (cur_arg == 1 && (param_type->IsPrimitiveLong() || param_type->IsPrimitiveDouble())) {
         // long/double split over regs and stack, mask in high half from stack arguments
         uint64_t high_half = *reinterpret_cast<uint32_t*>(stack_args + (13 * kPointerSize));
-        val.j = (val.j & 0xffffffffULL) | (high_half << 32);
+        val.SetJ((val.GetJ() & 0xffffffffULL) | (high_half << 32));
       }
       BoxPrimitive(param_type->GetPrimitiveType(), val);
       if (self->IsExceptionPending()) {
         return;
       }
-      obj = val.l;
+      obj = val.GetL();
     }
     args->Set(param_index, obj);
     cur_arg = cur_arg + (param_type->IsPrimitiveLong() || param_type->IsPrimitiveDouble() ? 2 : 1);
@@ -143,7 +143,7 @@
       if (self->IsExceptionPending()) {
         return;
       }
-      obj = val.l;
+      obj = val.GetL();
     }
     args->Set(param_index, obj);
     cur_arg = cur_arg + (param_type->IsPrimitiveLong() || param_type->IsPrimitiveDouble() ? 2 : 1);
diff --git a/src/object.cc b/src/object.cc
index f863a39..158f0e6 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -570,7 +570,7 @@
                               PrettyMethod(this).c_str(), GetCode(), stub,
                               Runtime::Current()->IsStarted() ? "true" : "false");
     if (result != NULL) {
-      result->j = 0;
+      result->SetJ(0);
     }
   }
 
diff --git a/src/object.h b/src/object.h
index 7413bf9..00492f0 100644
--- a/src/object.h
+++ b/src/object.h
@@ -63,6 +63,38 @@
   // We default initialize JValue instances to all-zeros.
   JValue() : j(0) {}
 
+  int8_t GetB() const { return b; }
+  void SetB(int8_t new_b) {
+    i = ((static_cast<int32_t>(new_b) << 24) >> 24); // Sign-extend.
+  }
+
+  uint16_t GetC() const { return c; }
+  void SetC(uint16_t new_c) { c = new_c; }
+
+  double GetD() const { return d; }
+  void SetD(double new_d) { d = new_d; }
+
+  float GetF() const { return f; }
+  void SetF(float new_f) { f = new_f; }
+
+  int32_t GetI() const { return i; }
+  void SetI(int32_t new_i) { i = new_i; }
+
+  int64_t GetJ() const { return j; }
+  void SetJ(int64_t new_j) { j = new_j; }
+
+  Object* GetL() const { return l; }
+  void SetL(Object* new_l) { l = new_l; }
+
+  int16_t GetS() const { return s; }
+  void SetS(int16_t new_s) {
+    i = ((static_cast<int32_t>(new_s) << 16) >> 16); // Sign-extend.
+  }
+
+  uint8_t GetZ() const { return z; }
+  void SetZ(uint8_t new_z) { z = new_z; }
+
+ private:
   uint8_t z;
   int8_t b;
   uint16_t c;
diff --git a/src/reflection.cc b/src/reflection.cc
index aba930c..e919ef1 100644
--- a/src/reflection.cc
+++ b/src/reflection.cc
@@ -116,7 +116,7 @@
 
   // Box if necessary and return.
   BoxPrimitive(mh.GetReturnType()->GetPrimitiveType(), value);
-  return AddLocalReference<jobject>(env, value.l);
+  return AddLocalReference<jobject>(env, value.GetL());
 }
 
 bool VerifyObjectInClass(JNIEnv* env, Object* o, Class* c) {
@@ -136,86 +136,77 @@
   return true;
 }
 
-/*
- * Convert primitive, boxed data from "srcPtr" to "dstPtr".
- *
- * Section v2 2.6 lists the various conversions and promotions.  We
- * allow the "widening" and "identity" conversions, but don't allow the
- * "narrowing" conversions.
- *
- * Allowed:
- *  byte to short, int, long, float, double
- *  short to int, long, float double
- *  char to int, long, float, double
- *  int to long, float, double
- *  long to float, double
- *  float to double
- * Values of types byte, char, and short are "internally" widened to int.
- *
- * Returns the width in 32-bit words of the destination primitive, or
- * -1 if the conversion is not allowed.
- */
 bool ConvertPrimitiveValue(Primitive::Type srcType, Primitive::Type dstType,
                            const JValue& src, JValue& dst) {
   CHECK(srcType != Primitive::kPrimNot && dstType != Primitive::kPrimNot);
   switch (dstType) {
   case Primitive::kPrimBoolean:
+    if (srcType == Primitive::kPrimBoolean) {
+      dst.SetZ(src.GetZ());
+      return true;
+    }
+    break;
   case Primitive::kPrimChar:
+    if (srcType == Primitive::kPrimChar) {
+      dst.SetC(src.GetC());
+      return true;
+    }
+    break;
   case Primitive::kPrimByte:
-    if (srcType == dstType) {
-      dst.i = src.i;
+    if (srcType == Primitive::kPrimByte) {
+      dst.SetB(src.GetB());
       return true;
     }
     break;
   case Primitive::kPrimShort:
     if (srcType == Primitive::kPrimByte || srcType == Primitive::kPrimShort) {
-      dst.i = src.i;
+      dst.SetS(src.GetI());
       return true;
     }
     break;
   case Primitive::kPrimInt:
     if (srcType == Primitive::kPrimByte || srcType == Primitive::kPrimChar ||
         srcType == Primitive::kPrimShort || srcType == Primitive::kPrimInt) {
-      dst.i = src.i;
+      dst.SetI(src.GetI());
       return true;
     }
     break;
   case Primitive::kPrimLong:
     if (srcType == Primitive::kPrimByte || srcType == Primitive::kPrimChar ||
         srcType == Primitive::kPrimShort || srcType == Primitive::kPrimInt) {
-      dst.j = src.i;
+      dst.SetJ(src.GetI());
       return true;
     } else if (srcType == Primitive::kPrimLong) {
-      dst.j = src.j;
+      dst.SetJ(src.GetJ());
       return true;
     }
     break;
   case Primitive::kPrimFloat:
     if (srcType == Primitive::kPrimByte || srcType == Primitive::kPrimChar ||
         srcType == Primitive::kPrimShort || srcType == Primitive::kPrimInt) {
-      dst.f = src.i;
+      dst.SetF(src.GetI());
       return true;
     } else if (srcType == Primitive::kPrimLong) {
-      dst.f = src.j;
+      dst.SetF(src.GetJ());
       return true;
     } else if (srcType == Primitive::kPrimFloat) {
-      dst.i = src.i;
+      dst.SetF(src.GetF());
       return true;
     }
     break;
   case Primitive::kPrimDouble:
     if (srcType == Primitive::kPrimByte || srcType == Primitive::kPrimChar ||
         srcType == Primitive::kPrimShort || srcType == Primitive::kPrimInt) {
-      dst.d = src.i;
+      dst.SetD(src.GetI());
       return true;
     } else if (srcType == Primitive::kPrimLong) {
-      dst.d = src.j;
+      dst.SetD(src.GetJ());
       return true;
     } else if (srcType == Primitive::kPrimFloat) {
-      dst.d = src.f;
+      dst.SetD(src.GetF());
       return true;
     } else if (srcType == Primitive::kPrimDouble) {
-      dst.j = src.j;
+      dst.SetJ(src.GetJ());
       return true;
     }
     break;
@@ -262,7 +253,7 @@
     break;
   case Primitive::kPrimVoid:
     // There's no such thing as a void field, and void methods invoked via reflection return null.
-    value.l = NULL;
+    value.SetL(NULL);
     return;
   default:
     LOG(FATAL) << static_cast<int>(src_class);
@@ -284,7 +275,7 @@
                                             PrettyTypeOf(o).c_str());
       return false;
     }
-    unboxed_value.l = o;
+    unboxed_value.SetL(o);
     return true;
   } else if (dst_class->GetPrimitiveType() == Primitive::kPrimVoid) {
     Thread::Current()->ThrowNewExceptionF("Ljava/lang/IllegalArgumentException;",
@@ -308,28 +299,28 @@
   Field* primitive_field = o->GetClass()->GetIFields()->Get(0);
   if (src_descriptor == "Ljava/lang/Boolean;") {
     src_class = class_linker->FindPrimitiveClass('Z');
-    boxed_value.i = primitive_field->GetBoolean(o);  // and extend read value to 32bits
+    boxed_value.SetZ(primitive_field->GetBoolean(o));
   } else if (src_descriptor == "Ljava/lang/Byte;") {
     src_class = class_linker->FindPrimitiveClass('B');
-    boxed_value.i = primitive_field->GetByte(o);  // and extend read value to 32bits
+    boxed_value.SetB(primitive_field->GetByte(o));
   } else if (src_descriptor == "Ljava/lang/Character;") {
     src_class = class_linker->FindPrimitiveClass('C');
-    boxed_value.i = primitive_field->GetChar(o);  // and extend read value to 32bits
+    boxed_value.SetC(primitive_field->GetChar(o));
   } else if (src_descriptor == "Ljava/lang/Float;") {
     src_class = class_linker->FindPrimitiveClass('F');
-    boxed_value.f = primitive_field->GetFloat(o);
+    boxed_value.SetF(primitive_field->GetFloat(o));
   } else if (src_descriptor == "Ljava/lang/Double;") {
     src_class = class_linker->FindPrimitiveClass('D');
-    boxed_value.d = primitive_field->GetDouble(o);
+    boxed_value.SetD(primitive_field->GetDouble(o));
   } else if (src_descriptor == "Ljava/lang/Integer;") {
     src_class = class_linker->FindPrimitiveClass('I');
-    boxed_value.i = primitive_field->GetInt(o);
+    boxed_value.SetI(primitive_field->GetInt(o));
   } else if (src_descriptor == "Ljava/lang/Long;") {
     src_class = class_linker->FindPrimitiveClass('J');
-    boxed_value.j = primitive_field->GetLong(o);
+    boxed_value.SetJ(primitive_field->GetLong(o));
   } else if (src_descriptor == "Ljava/lang/Short;") {
     src_class = class_linker->FindPrimitiveClass('S');
-    boxed_value.i = primitive_field->GetShort(o);  // and extend read value to 32bits
+    boxed_value.SetS(primitive_field->GetShort(o));
   } else {
     Thread::Current()->ThrowNewExceptionF("Ljava/lang/IllegalArgumentException;",
                                           "%s should have type %s, got %s",
diff --git a/src/thread.cc b/src/thread.cc
index a4194b1..1a39d99 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -878,8 +878,8 @@
   // Call the handler.
   Method* m = handler->GetClass()->FindVirtualMethodForVirtualOrInterface(gUncaughtExceptionHandler_uncaughtException);
   JValue args[2];
-  args[0].l = peer_;
-  args[1].l = exception;
+  args[0].SetL(peer_);
+  args[1].SetL(exception);
   m->Invoke(this, handler, args, NULL);
 
   // If the handler threw, clear that exception too.
@@ -897,7 +897,7 @@
   if (group != NULL) {
     Method* m = group->GetClass()->FindVirtualMethodForVirtualOrInterface(gThreadGroup_removeThread);
     JValue args[1];
-    args[0].l = peer_;
+    args[0].SetL(peer_);
     m->Invoke(this, group, args, NULL);
   }
 }