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_;