If JNIEnvExt is-a JNIEnv, we can lose a bunch of reinterpret_casts.

Likewise with JavaVM.

Change-Id: I505e42e9197951b6c82e6dbf8dcc1fc4dd5aad31
diff --git a/src/jni_compiler.cc b/src/jni_compiler.cc
index b03a016..c277157 100644
--- a/src/jni_compiler.cc
+++ b/src/jni_compiler.cc
@@ -25,7 +25,7 @@
   JniCallingConvention jni_conv(native_method);
   ManagedRuntimeCallingConvention mr_conv(native_method);
   const bool is_static = native_method->IsStatic();
-  static Offset functions(OFFSETOF_MEMBER(JNIEnvExt, fns));
+  static Offset functions(OFFSETOF_MEMBER(JNIEnvExt, functions));
   static Offset monitor_enter(OFFSETOF_MEMBER(JNINativeInterface, MonitorEnter));
   static Offset monitor_exit(OFFSETOF_MEMBER(JNINativeInterface, MonitorExit));
 
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index 0458ceb..0845c0f 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -2084,7 +2084,7 @@
     ScopedJniThreadState ts(env);
     Runtime* runtime = Runtime::Current();
     if (runtime != NULL) {
-      *vm = reinterpret_cast<JavaVM*>(runtime->GetJavaVM());
+      *vm = runtime->GetJavaVM();
     } else {
       *vm = NULL;
     }
@@ -2383,12 +2383,12 @@
 static const size_t kLocalsMax = 512; // Arbitrary sanity check.
 
 JNIEnvExt::JNIEnvExt(Thread* self, bool check_jni)
-    : fns(&gNativeInterface),
-      self(self),
+    : self(self),
       check_jni(check_jni),
       critical(false),
       monitors("monitors", kMonitorsInitial, kMonitorsMax),
       locals(kLocalsInitial, kLocalsMax, kLocal) {
+  functions = &gNativeInterface;
 }
 
 // JNI Invocation interface.
@@ -2409,8 +2409,8 @@
   if (runtime == NULL) {
     return JNI_ERR;
   } else {
-    *p_env = reinterpret_cast<JNIEnv*>(Thread::Current()->GetJniEnv());
-    *p_vm = reinterpret_cast<JavaVM*>(runtime->GetJavaVM());
+    *p_env = Thread::Current()->GetJniEnv();
+    *p_vm = runtime->GetJavaVM();
     return JNI_OK;
   }
 }
@@ -2421,7 +2421,7 @@
     *vm_count = 0;
   } else {
     *vm_count = 1;
-    vms[0] = reinterpret_cast<JavaVM*>(runtime->GetJavaVM());
+    vms[0] = runtime->GetJavaVM();
   }
   return JNI_OK;
 }
@@ -2532,8 +2532,7 @@
 static const size_t kWeakGlobalsMax = 51200; // Arbitrary sanity check.
 
 JavaVMExt::JavaVMExt(Runtime* runtime, bool check_jni, bool verbose_jni)
-    : fns(&gInvokeInterface),
-      runtime(runtime),
+    : runtime(runtime),
       check_jni(check_jni),
       verbose_jni(verbose_jni),
       pin_table("pin table", kPinTableInitialSize, kPinTableMaxSize),
@@ -2541,6 +2540,7 @@
       globals(kGlobalsInitial, kGlobalsMax, kGlobal),
       weak_globals_lock(Mutex::Create("JNI weak global reference table lock")),
       weak_globals(kWeakGlobalsInitial, kWeakGlobalsMax, kWeakGlobal) {
+  functions = &gInvokeInterface;
 }
 
 JavaVMExt::~JavaVMExt() {
@@ -2668,7 +2668,7 @@
       if (verbose_jni) {
         LOG(INFO) << "[Calling JNI_OnLoad in \"" << path << "\"]";
       }
-      int version = (*jni_on_load)(reinterpret_cast<JavaVM*>(this), NULL);
+      int version = (*jni_on_load)(this, NULL);
       self->SetState(old_state);
 
       self->SetClassLoaderOverride(old_class_loader);;
diff --git a/src/jni_internal.h b/src/jni_internal.h
index d9a1832..98ce7c8 100644
--- a/src/jni_internal.h
+++ b/src/jni_internal.h
@@ -20,7 +20,7 @@
 class SharedLibrary;
 class Thread;
 
-struct JavaVMExt {
+struct JavaVMExt : public JavaVM {
   JavaVMExt(Runtime* runtime, bool check_jni, bool verbose_jni);
   ~JavaVMExt();
 
@@ -43,9 +43,6 @@
    */
   bool LoadNativeLibrary(const std::string& path, ClassLoader* class_loader, char** detail);
 
-  // Must be first to correspond with JNIEnv.
-  const struct JNIInvokeInterface* fns;
-
   Runtime* runtime;
 
   bool check_jni;
@@ -65,12 +62,9 @@
   std::map<std::string, SharedLibrary*> libraries;
 };
 
-struct JNIEnvExt {
+struct JNIEnvExt : public JNIEnv {
   JNIEnvExt(Thread* self, bool check_jni);
 
-  // Must be first to correspond with JavaVM.
-  const struct JNINativeInterface* fns;
-
   Thread* self;
 
   bool check_jni;
diff --git a/src/thread.cc b/src/thread.cc
index d730442..477b149 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -178,7 +178,7 @@
   JavaVMExt* vm = runtime->GetJavaVM();
   CHECK(vm != NULL);
   bool check_jni = vm->check_jni;
-  thread->jni_env_ = reinterpret_cast<JNIEnv*>(new JNIEnvExt(thread, check_jni));
+  thread->jni_env_ = new JNIEnvExt(thread, check_jni);
 
   return thread;
 }
@@ -240,8 +240,7 @@
   switch (kind) {
   case kLocal:
     {
-      JNIEnvExt* env = reinterpret_cast<JNIEnvExt*>(jni_env_);
-      IndirectReferenceTable& locals = env->locals;
+      IndirectReferenceTable& locals = jni_env_->locals;
       result = locals.Get(ref);
       break;
     }
diff --git a/src/thread.h b/src/thread.h
index 15781ff..f695df1 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -7,26 +7,26 @@
 #include <list>
 
 #include "globals.h"
+#include "jni_internal.h"
 #include "logging.h"
 #include "macros.h"
 #include "mem_map.h"
 #include "offsets.h"
 #include "runtime.h"
 
-#include "jni.h"
 
 namespace art {
 
+class Array;
 class Class;
 class ClassLoader;
+class JNIEnvExt;
 class Method;
 class Object;
 class Runtime;
 class Thread;
 class ThreadList;
 class Throwable;
-class Array;
-class Class;
 
 class Mutex {
  public:
@@ -310,7 +310,7 @@
   }
 
   // JNI methods
-  JNIEnv* GetJniEnv() const {
+  JNIEnvExt* GetJniEnv() const {
     return jni_env_;
   }
 
@@ -421,7 +421,7 @@
   StackIndirectReferenceTable* top_sirt_;
 
   // Every thread may have an associated JNI environment
-  JNIEnv* jni_env_;
+  JNIEnvExt* jni_env_;
 
   State state_;