Revert "Reverts to track dalvik and libcore"
This reverts commit 53d6ff445706c390c541d10ef11f1b2f19ab14e8.
Change-Id: I7cfff5b532b0dd6ffef010732cd248f58236421b
diff --git a/src/dex_file.cc b/src/dex_file.cc
index 519cdc2..c532134 100644
--- a/src/dex_file.cc
+++ b/src/dex_file.cc
@@ -384,7 +384,44 @@
}
}
-DexFile::~DexFile() {}
+DexFile::~DexFile() {
+ if (dex_object_ != NULL) {
+ UNIMPLEMENTED(WARNING) << "leaked a global reference to an com.android.dex.Dex instance";
+ }
+}
+
+jobject DexFile::GetDexObject(JNIEnv* env) const {
+ MutexLock mu(dex_object_lock_);
+ if (dex_object_ != NULL) {
+ return dex_object_;
+ }
+
+ void* address = const_cast<void*>(reinterpret_cast<const void*>(base_));
+ jobject byte_buffer = env->NewDirectByteBuffer(address, length_);
+ if (byte_buffer == NULL) {
+ return NULL;
+ }
+
+ jclass c = env->FindClass("com/android/dex/Dex");
+ if (c == NULL) {
+ return NULL;
+ }
+
+ jmethodID mid = env->GetStaticMethodID(c, "create", "(Ljava/nio/ByteBuffer;)Lcom/android/dex/Dex;");
+ if (mid == NULL) {
+ return NULL;
+ }
+
+ jvalue args[1];
+ args[0].l = byte_buffer;
+ jobject local = env->CallStaticObjectMethodA(c, mid, args);
+ if (local == NULL) {
+ return NULL;
+ }
+
+ dex_object_ = env->NewGlobalRef(local);
+ return dex_object_;
+}
bool DexFile::Init() {
InitMembers();