Pass the correct Thread* when calling back into Java.

Change-Id: I39ff5fdcd0d787a23db19c2e39f62472d84d467a
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index 9c2093c..23c8273 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -154,32 +154,30 @@
   return arg_array.release();
 }
 
-JValue InvokeWithArgArray(JNIEnv* env, Object* obj, jmethodID method_id,
+JValue InvokeWithArgArray(Thread* self, Object* obj, jmethodID method_id,
                           byte* args) {
   Method* method = reinterpret_cast<Method*>(method_id);  // TODO
   // Call the invoke stub associated with the method
   // Pass everything as arguments
   const Method::InvokeStub* stub = method->GetInvokeStub();
   CHECK(stub != NULL);
-  // TODO: get thread from env
-  Thread* thread = NULL;
   JValue result;
-  (*stub)(method, obj, thread, args, &result);
+  (*stub)(method, obj, self, args, &result);
   return result;
 }
 
-JValue InvokeWithJValues(JNIEnv* env, Object* obj, jmethodID method_id,
+JValue InvokeWithJValues(Thread* self, Object* obj, jmethodID method_id,
                          jvalue* args) {
   Method* method = reinterpret_cast<Method*>(method_id);
   scoped_array<byte> arg_array(CreateArgArray(method, args));
-  return InvokeWithArgArray(env, obj, method_id, arg_array.get());
+  return InvokeWithArgArray(self, obj, method_id, arg_array.get());
 }
 
-JValue InvokeWithVarArgs(JNIEnv* env, Object* obj, jmethodID method_id,
+JValue InvokeWithVarArgs(Thread* self, Object* obj, jmethodID method_id,
                          va_list args) {
   Method* method = reinterpret_cast<Method*>(method_id);
   scoped_array<byte> arg_array(CreateArgArray(method, args));
-  return InvokeWithArgArray(env, obj, method_id, arg_array.get());
+  return InvokeWithArgArray(self, obj, method_id, arg_array.get());
 }
 
 jint GetVersion(JNIEnv* env) {
@@ -924,7 +922,7 @@
   ScopedJniThreadState ts(env);
   va_list ap;
   va_start(ap, methodID);
-  JValue result = InvokeWithVarArgs(env, NULL, methodID, ap);
+  JValue result = InvokeWithVarArgs(ts.Self(), NULL, methodID, ap);
   jobject obj = reinterpret_cast<jobject>(result.l);  // TODO: local reference
   return obj;
 }
@@ -932,7 +930,7 @@
 jobject CallStaticObjectMethodV(JNIEnv* env,
     jclass clazz, jmethodID methodID, va_list args) {
   ScopedJniThreadState ts(env);
-  JValue result = InvokeWithVarArgs(env, NULL, methodID, args);
+  JValue result = InvokeWithVarArgs(ts.Self(), NULL, methodID, args);
   jobject obj = reinterpret_cast<jobject>(result.l);  // TODO: local reference
   return obj;
 }
@@ -940,7 +938,7 @@
 jobject CallStaticObjectMethodA(JNIEnv* env,
     jclass clazz, jmethodID methodID, jvalue* args) {
   ScopedJniThreadState ts(env);
-  JValue result = InvokeWithJValues(env, NULL, methodID, args);
+  JValue result = InvokeWithJValues(ts.Self(), NULL, methodID, args);
   jobject obj = reinterpret_cast<jobject>(result.l);  // TODO: local reference
   return obj;
 }
@@ -950,171 +948,171 @@
   ScopedJniThreadState ts(env);
   va_list ap;
   va_start(ap, methodID);
-  return InvokeWithVarArgs(env, NULL, methodID, ap).z;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).z;
 }
 
 jboolean CallStaticBooleanMethodV(JNIEnv* env,
     jclass clazz, jmethodID methodID, va_list args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithVarArgs(env, NULL, methodID, args).z;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).z;
 }
 
 jboolean CallStaticBooleanMethodA(JNIEnv* env,
     jclass clazz, jmethodID methodID, jvalue* args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithJValues(env, NULL, methodID, args).z;
+  return InvokeWithJValues(ts.Self(), NULL, methodID, args).z;
 }
 
 jbyte CallStaticByteMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
   ScopedJniThreadState ts(env);
   va_list ap;
   va_start(ap, methodID);
-  return InvokeWithVarArgs(env, NULL, methodID, ap).b;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).b;
 }
 
 jbyte CallStaticByteMethodV(JNIEnv* env,
     jclass clazz, jmethodID methodID, va_list args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithVarArgs(env, NULL, methodID, args).b;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).b;
 }
 
 jbyte CallStaticByteMethodA(JNIEnv* env,
     jclass clazz, jmethodID methodID, jvalue* args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithJValues(env, NULL, methodID, args).b;
+  return InvokeWithJValues(ts.Self(), NULL, methodID, args).b;
 }
 
 jchar CallStaticCharMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
   ScopedJniThreadState ts(env);
   va_list ap;
   va_start(ap, methodID);
-  return InvokeWithVarArgs(env, NULL, methodID, ap).c;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).c;
 }
 
 jchar CallStaticCharMethodV(JNIEnv* env,
     jclass clazz, jmethodID methodID, va_list args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithVarArgs(env, NULL, methodID, args).c;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).c;
 }
 
 jchar CallStaticCharMethodA(JNIEnv* env,
     jclass clazz, jmethodID methodID, jvalue* args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithJValues(env, NULL, methodID, args).c;
+  return InvokeWithJValues(ts.Self(), NULL, methodID, args).c;
 }
 
 jshort CallStaticShortMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
   ScopedJniThreadState ts(env);
   va_list ap;
   va_start(ap, methodID);
-  return InvokeWithVarArgs(env, NULL, methodID, ap).s;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).s;
 }
 
 jshort CallStaticShortMethodV(JNIEnv* env,
     jclass clazz, jmethodID methodID, va_list args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithVarArgs(env, NULL, methodID, args).s;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).s;
 }
 
 jshort CallStaticShortMethodA(JNIEnv* env,
     jclass clazz, jmethodID methodID, jvalue* args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithJValues(env, NULL, methodID, args).s;
+  return InvokeWithJValues(ts.Self(), NULL, methodID, args).s;
 }
 
 jint CallStaticIntMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
   ScopedJniThreadState ts(env);
   va_list ap;
   va_start(ap, methodID);
-  return InvokeWithVarArgs(env, NULL, methodID, ap).i;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).i;
 }
 
 jint CallStaticIntMethodV(JNIEnv* env,
     jclass clazz, jmethodID methodID, va_list args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithVarArgs(env, NULL, methodID, args).i;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).i;
 }
 
 jint CallStaticIntMethodA(JNIEnv* env,
     jclass clazz, jmethodID methodID, jvalue* args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithJValues(env, NULL, methodID, args).i;
+  return InvokeWithJValues(ts.Self(), NULL, methodID, args).i;
 }
 
 jlong CallStaticLongMethod(JNIEnv* env, jclass clazz, jmethodID methodID, ...) {
   ScopedJniThreadState ts(env);
   va_list ap;
   va_start(ap, methodID);
-  return InvokeWithVarArgs(env, NULL, methodID, ap).j;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).j;
 }
 
 jlong CallStaticLongMethodV(JNIEnv* env,
     jclass clazz, jmethodID methodID, va_list args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithVarArgs(env, NULL, methodID, args).j;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).j;
 }
 
 jlong CallStaticLongMethodA(JNIEnv* env,
     jclass clazz, jmethodID methodID, jvalue* args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithJValues(env, NULL, methodID, args).j;
+  return InvokeWithJValues(ts.Self(), NULL, methodID, args).j;
 }
 
 jfloat CallStaticFloatMethod(JNIEnv* env, jclass cls, jmethodID methodID, ...) {
   ScopedJniThreadState ts(env);
   va_list ap;
   va_start(ap, methodID);
-  return InvokeWithVarArgs(env, NULL, methodID, ap).f;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).f;
 }
 
 jfloat CallStaticFloatMethodV(JNIEnv* env,
     jclass clazz, jmethodID methodID, va_list args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithVarArgs(env, NULL, methodID, args).f;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).f;
 }
 
 jfloat CallStaticFloatMethodA(JNIEnv* env,
     jclass clazz, jmethodID methodID, jvalue* args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithJValues(env, NULL, methodID, args).f;
+  return InvokeWithJValues(ts.Self(), NULL, methodID, args).f;
 }
 
 jdouble CallStaticDoubleMethod(JNIEnv* env, jclass cls, jmethodID methodID, ...) {
   ScopedJniThreadState ts(env);
   va_list ap;
   va_start(ap, methodID);
-  return InvokeWithVarArgs(env, NULL, methodID, ap).d;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, ap).d;
 }
 
 jdouble CallStaticDoubleMethodV(JNIEnv* env,
     jclass clazz, jmethodID methodID, va_list args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithVarArgs(env, NULL, methodID, args).d;
+  return InvokeWithVarArgs(ts.Self(), NULL, methodID, args).d;
 }
 
 jdouble CallStaticDoubleMethodA(JNIEnv* env,
     jclass clazz, jmethodID methodID, jvalue* args) {
   ScopedJniThreadState ts(env);
-  return InvokeWithJValues(env, NULL, methodID, args).d;
+  return InvokeWithJValues(ts.Self(), NULL, methodID, args).d;
 }
 
 void CallStaticVoidMethod(JNIEnv* env, jclass cls, jmethodID methodID, ...) {
   ScopedJniThreadState ts(env);
   va_list ap;
   va_start(ap, methodID);
-  InvokeWithVarArgs(env, NULL, methodID, ap);
+  InvokeWithVarArgs(ts.Self(), NULL, methodID, ap);
 }
 
 void CallStaticVoidMethodV(JNIEnv* env,
     jclass cls, jmethodID methodID, va_list args) {
   ScopedJniThreadState ts(env);
-  InvokeWithVarArgs(env, NULL, methodID, args);
+  InvokeWithVarArgs(ts.Self(), NULL, methodID, args);
 }
 
 void CallStaticVoidMethodA(JNIEnv* env,
     jclass cls, jmethodID methodID, jvalue* args) {
   ScopedJniThreadState ts(env);
-  InvokeWithJValues(env, NULL, methodID, args);
+  InvokeWithJValues(ts.Self(), NULL, methodID, args);
 }
 
 jfieldID GetStaticFieldID(JNIEnv* env,