dalvik_system_DexFile.cc revision c252c3eacd83a0c110dd065690a7f652be35b0e7
1f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom/* 2f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * Copyright (C) 2008 The Android Open Source Project 3f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * 4f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 5f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * you may not use this file except in compliance with the License. 6f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * You may obtain a copy of the License at 7f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * 8f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 9f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * 10f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * Unless required by applicable law or agreed to in writing, software 11f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 12f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * See the License for the specific language governing permissions and 14f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom * limitations under the License. 15f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom */ 16f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 171d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom#include <unistd.h> 181d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom 19aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom#include "class_loader.h" 20aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom#include "class_linker.h" 21aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom#include "dex_file.h" 22f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom#include "logging.h" 231d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom#include "os.h" 24aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom#include "runtime.h" 2503a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom#include "toStringArray.h" 26f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom#include "ScopedUtfChars.h" 27f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 28f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom#include "JniConstants.h" // Last to avoid problems with LOG redefinition. 29f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 30f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstromnamespace art { 31f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 32f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstromnamespace { 33f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 34f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom// A smart pointer that provides read-only access to a Java string's UTF chars. 35f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom// Unlike libcore's NullableScopedUtfChars, this will *not* throw NullPointerException if 36f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom// passed a null jstring. The correct idiom is: 37f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom// 38f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom// NullableScopedUtfChars name(env, javaName); 39c252c3eacd83a0c110dd065690a7f652be35b0e7Brian Carlstrom// if (env->ExceptionCheck()) { 40f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom// return NULL; 41f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom// } 42f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom// // ... use name.c_str() 43f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom// 44f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom// TODO: rewrite to get rid of this, or change ScopedUtfChars to offer this option. 45f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstromclass NullableScopedUtfChars { 46f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrompublic: 47f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom NullableScopedUtfChars(JNIEnv* env, jstring s) 48f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom : mEnv(env), mString(s) 49f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom { 50f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom mUtfChars = (s != NULL) ? env->GetStringUTFChars(s, NULL) : NULL; 51f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom } 52f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 53f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom ~NullableScopedUtfChars() { 54f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom if (mUtfChars) { 55f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom mEnv->ReleaseStringUTFChars(mString, mUtfChars); 56f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom } 57f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom } 58f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 59f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom const char* c_str() const { 60f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom return mUtfChars; 61f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom } 62f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 63f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom size_t size() const { 64f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom return strlen(mUtfChars); 65f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom } 66f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 67f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom // Element access. 68f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom const char& operator[](size_t n) const { 69f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom return mUtfChars[n]; 70f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom } 71f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 72f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstromprivate: 73f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom JNIEnv* mEnv; 74f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom jstring mString; 75f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom const char* mUtfChars; 76f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 77f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom // Disallow copy and assignment. 78f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom NullableScopedUtfChars(const NullableScopedUtfChars&); 79f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom void operator=(const NullableScopedUtfChars&); 80f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom}; 81f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 82f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstromstatic jint DexFile_openDexFile(JNIEnv* env, jclass, jstring javaSourceName, jstring javaOutputName) { 83f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom ScopedUtfChars sourceName(env, javaSourceName); 84f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom if (sourceName.c_str() == NULL) { 85f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom return 0; 86f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom } 87f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom NullableScopedUtfChars outputName(env, javaOutputName); 88c252c3eacd83a0c110dd065690a7f652be35b0e7Brian Carlstrom if (env->ExceptionCheck()) { 89f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom return 0; 90f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom } 91c252c3eacd83a0c110dd065690a7f652be35b0e7Brian Carlstrom if (outputName.c_str() != NULL) { 92c252c3eacd83a0c110dd065690a7f652be35b0e7Brian Carlstrom // TODO: extract dex and run dex2oat like oatopt 93c252c3eacd83a0c110dd065690a7f652be35b0e7Brian Carlstrom UNIMPLEMENTED(FATAL) << sourceName.c_str() << " " << outputName.c_str(); 94c252c3eacd83a0c110dd065690a7f652be35b0e7Brian Carlstrom } 95aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom const DexFile* dex_file = DexFile::Open(sourceName.c_str(), ""); 96aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom if (dex_file == NULL) { 97aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom jniThrowExceptionFmt(env, "java/io/IOException", "unable to open DEX file: %s", 98aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom sourceName.c_str()); 99aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom return NULL; 100aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom } 101aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom return static_cast<jint>(reinterpret_cast<uintptr_t>(dex_file)); 102aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom} 103aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 104aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstromstatic const DexFile* toDexFile(JNIEnv* env, int dex_file_address) { 105aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom const DexFile* dex_file = reinterpret_cast<const DexFile*>(static_cast<uintptr_t>(dex_file_address)); 106aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom if ((dex_file == NULL)) { 107aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom jniThrowNullPointerException(env, "dex_file == null"); 108aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom } 109aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom return dex_file; 110f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom} 111f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 112f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstromvoid DexFile_closeDexFile(JNIEnv* env, jclass, jint cookie) { 113aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom const DexFile* dex_file = toDexFile(env, cookie); 114aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom if (dex_file == NULL) { 115aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom return; 116aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom } 117aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom if (Runtime::Current()->GetClassLinker()->IsDexFileRegistered(*dex_file)) { 118aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom return; 119aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom } 120aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom delete dex_file; 121f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom} 122f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 123f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstromjclass DexFile_defineClass(JNIEnv* env, jclass, jstring javaName, jobject javaLoader, jint cookie) { 124aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom const DexFile* dex_file = toDexFile(env, cookie); 125aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom if (dex_file == NULL) { 126aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom return NULL; 127aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom } 128df143242f4beaad4cc9fbabebfc033b68c40964eBrian Carlstrom ScopedUtfChars class_name(env, javaName); 129df143242f4beaad4cc9fbabebfc033b68c40964eBrian Carlstrom if (class_name.c_str() == NULL) { 130df143242f4beaad4cc9fbabebfc033b68c40964eBrian Carlstrom return NULL; 131df143242f4beaad4cc9fbabebfc033b68c40964eBrian Carlstrom } 132df143242f4beaad4cc9fbabebfc033b68c40964eBrian Carlstrom const std::string descriptor = DotToDescriptor(class_name.c_str()); 133aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom const DexFile::ClassDef* dex_class_def = dex_file->FindClassDef(descriptor); 134aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom if (dex_class_def == NULL) { 135aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom return NULL; 136aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom } 137aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 138aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom Object* class_loader_object = Decode<Object*>(env, javaLoader); 139aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom ClassLoader* class_loader = down_cast<ClassLoader*>(class_loader_object); 140aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 141aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom class_linker->RegisterDexFile(*dex_file); 142aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom Class* result = class_linker->DefineClass(descriptor, class_loader, *dex_file, *dex_class_def); 14341ec477bc70f51716b08b4a0ced18efc9e99b564Brian Carlstrom if (env->ExceptionCheck()) { 14441ec477bc70f51716b08b4a0ced18efc9e99b564Brian Carlstrom env->ExceptionClear(); 14541ec477bc70f51716b08b4a0ced18efc9e99b564Brian Carlstrom return NULL; 14641ec477bc70f51716b08b4a0ced18efc9e99b564Brian Carlstrom } 147aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom return AddLocalReference<jclass>(env, result); 148f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom} 149f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 150f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian CarlstromjobjectArray DexFile_getClassNameList(JNIEnv* env, jclass, jint cookie) { 151aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom const DexFile* dex_file = toDexFile(env, cookie); 152aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom if (dex_file == NULL) { 153aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom return NULL; 154aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom } 15503a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom 15603a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom std::vector<std::string> class_names; 15703a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom for (size_t i = 0; i < dex_file->NumClassDefs(); ++i) { 15803a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom const DexFile::ClassDef& class_def = dex_file->GetClassDef(i); 15903a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom const char* descriptor = dex_file->GetClassDescriptor(class_def); 16003a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom class_names.push_back(DescriptorToDot(descriptor)); 16103a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom } 16203a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom return toStringArray(env, class_names); 163f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom} 164f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 165f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstromjboolean DexFile_isDexOptNeeded(JNIEnv* env, jclass, jstring javaFilename) { 16603a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom ScopedUtfChars filename(env, javaFilename); 16703a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom if (filename.c_str() == NULL) { 1681d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom return JNI_TRUE; 1691d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom } 1701d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom 1711d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom if (!OS::FileExists(filename.c_str())) { 1721d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom jniThrowExceptionFmt(env, "java/io/FileNotFoundException", "%s", filename.c_str()); 1731d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom return JNI_TRUE; 1741d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom } 1751d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom 1761d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom // Always treat elements of the bootclasspath as up-to-date. The 1771d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom // fact that code is running at all means that this should be true. 1781d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 1791d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom const std::vector<const DexFile*>& boot_class_path = class_linker->GetBootClassPath(); 1801d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom for (size_t i = 0; i < boot_class_path.size(); i++) { 1811d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom if (boot_class_path[i]->GetLocation() == filename.c_str()) { 1821d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom return JNI_FALSE; 1831d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom } 1841d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom } 1851d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom 1861d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom UniquePtr<const DexFile> dex_file(DexFile::Open(filename.c_str(), "")); 1871d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom if (dex_file.get() == NULL) { 1881d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom return JNI_TRUE; 18903a20ba67cfdc46f5ad8d77242a666a4cb0512f2Brian Carlstrom } 1901d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom 191fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom const OatFile* oat_file = class_linker->FindOatFile(*dex_file.get()); 192fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom if (oat_file == NULL) { 193fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom return JNI_TRUE; 194fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom } 195fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom const OatFile::OatDexFile* oat_dex_file = oat_file->GetOatDexFile(dex_file->GetLocation()); 196fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom if (oat_dex_file == NULL) { 197fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom return JNI_TRUE; 198fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom } 199fad714344ca81a21e775ef45ae09d9a035723cafBrian Carlstrom if (oat_dex_file->GetDexFileChecksum() != dex_file->GetHeader().checksum_) { 2001d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom return JNI_TRUE; 2011d9f52b7ca91c6d30b7acfac1c9ab24d93fff470Brian Carlstrom } 202f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom return JNI_FALSE; 203f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom} 204f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 205f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstromstatic JNINativeMethod gMethods[] = { 206f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom NATIVE_METHOD(DexFile, closeDexFile, "(I)V"), 207f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom NATIVE_METHOD(DexFile, defineClass, "(Ljava/lang/String;Ljava/lang/ClassLoader;I)Ljava/lang/Class;"), 208f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom NATIVE_METHOD(DexFile, getClassNameList, "(I)[Ljava/lang/String;"), 209f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom NATIVE_METHOD(DexFile, isDexOptNeeded, "(Ljava/lang/String;)Z"), 210f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom NATIVE_METHOD(DexFile, openDexFile, "(Ljava/lang/String;Ljava/lang/String;I)I"), 211f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom}; 212f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 213f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom} // namespace 214f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 215f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstromvoid register_dalvik_system_DexFile(JNIEnv* env) { 216f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom jniRegisterNativeMethods(env, "dalvik/system/DexFile", gMethods, NELEM(gMethods)); 217f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom} 218f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom 219f91c8c328c922ecd522e1d3508d2603e78de8a7bBrian Carlstrom} // namespace art 220