dalvik_system_VMRuntime.cpp revision e58a9b5d443cd3fcc22abc887cf0739a4b6bc145
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dalvik.system.VMRuntime 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "Dalvik.h" 2189383030aca8f77aeab73540404ba332ce5ac035Elliott Hughes#include "ScopedPthreadMutexLock.h" 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "native/InternalNativePriv.h" 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2449dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes#include <cutils/array.h> 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <limits.h> 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public native float getTargetHeapUtilization() 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the current ideal heap utilization, represented as a number 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * between zero and one. 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_dalvik_system_VMRuntime_getTargetHeapUtilization( 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project UNUSED_PARAMETER(args); 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_FLOAT(dvmGetTargetHeapUtilization()); 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * native float nativeSetTargetHeapUtilization() 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sets the current ideal heap utilization, represented as a number 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * between zero and one. Returns the old utilization. 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note that this is NOT static. 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_dalvik_system_VMRuntime_nativeSetTargetHeapUtilization( 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmSetTargetHeapUtilization(dvmU4ToFloat(args[1])); 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_VOID(); 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 59a97ed1382c4e74704b44d366cf464bef5757c6b0Ben Cheng * public native void startJitCompilation() 606bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng * 616bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng * Callback function from the framework to indicate that an app has gone 626bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng * through the startup phase and it is time to enable the JIT compiler. 636bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng */ 64a97ed1382c4e74704b44d366cf464bef5757c6b0Ben Chengstatic void Dalvik_dalvik_system_VMRuntime_startJitCompilation(const u4* args, 656bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng JValue* pResult) 666bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng{ 676bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng#if defined(WITH_JIT) 6889383030aca8f77aeab73540404ba332ce5ac035Elliott Hughes if (gDvm.executionMode == kExecutionModeJit && gDvmJit.disableJit == false) { 6989383030aca8f77aeab73540404ba332ce5ac035Elliott Hughes ScopedPthreadMutexLock lock(&gDvmJit.compilerLock); 70f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng gDvmJit.alreadyEnabledViaFramework = true; 7196cfe6c39b91dabc78182e2f7676b27b4012886aBill Buzbee pthread_cond_signal(&gDvmJit.compilerQueueActivity); 7296cfe6c39b91dabc78182e2f7676b27b4012886aBill Buzbee } 7394d89f8016b6c305ab0df491874dcedb252ecfccBill Buzbee#endif 746bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng RETURN_VOID(); 756bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng} 766bad6a2d77bcfeebf1f5a24406f49bda88503353Ben Cheng 77f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng/* 78f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng * public native void disableJitCompilation() 79f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng * 80f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng * Callback function from the framework to indicate that a VM instance wants to 81f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng * permanently disable the JIT compiler. Currently only the system server uses 82f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng * this interface when it detects system-wide safe mode is enabled. 83f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng */ 84f30acbb249b137b049500f136d2bb273c0b6221aBen Chengstatic void Dalvik_dalvik_system_VMRuntime_disableJitCompilation(const u4* args, 85f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng JValue* pResult) 86f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng{ 87f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng#if defined(WITH_JIT) 88f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng if (gDvm.executionMode == kExecutionModeJit) { 89f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng gDvmJit.disableJit = true; 90f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng } 91f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng#endif 92f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng RETURN_VOID(); 93f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng} 94f30acbb249b137b049500f136d2bb273c0b6221aBen Cheng 95f5949168d4142cde1582117173b03c614b632938Elliott Hughesstatic void Dalvik_dalvik_system_VMRuntime_newNonMovableArray(const u4* args, 96f5949168d4142cde1582117173b03c614b632938Elliott Hughes JValue* pResult) 97f5949168d4142cde1582117173b03c614b632938Elliott Hughes{ 98f5949168d4142cde1582117173b03c614b632938Elliott Hughes ClassObject* elementClass = (ClassObject*) args[1]; 99f5949168d4142cde1582117173b03c614b632938Elliott Hughes int length = args[2]; 100f5949168d4142cde1582117173b03c614b632938Elliott Hughes 101f5949168d4142cde1582117173b03c614b632938Elliott Hughes if (elementClass == NULL) { 102d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein dvmThrowNullPointerException(NULL); 103f5949168d4142cde1582117173b03c614b632938Elliott Hughes RETURN_VOID(); 104f5949168d4142cde1582117173b03c614b632938Elliott Hughes } 105f5949168d4142cde1582117173b03c614b632938Elliott Hughes if (length < 0) { 1062c8e25b2010d1bba4dca0148691bc6e1a4ee7616Dan Bornstein dvmThrowNegativeArraySizeException(length); 107f5949168d4142cde1582117173b03c614b632938Elliott Hughes RETURN_VOID(); 108f5949168d4142cde1582117173b03c614b632938Elliott Hughes } 109f5949168d4142cde1582117173b03c614b632938Elliott Hughes 110f5949168d4142cde1582117173b03c614b632938Elliott Hughes // TODO: right now, we don't have a copying collector, so there's no need 111f5949168d4142cde1582117173b03c614b632938Elliott Hughes // to do anything special here, but we ought to pass the non-movability 112f5949168d4142cde1582117173b03c614b632938Elliott Hughes // through to the allocator. 113c233f165a425ce44c7e5e75b14bc4fc018288345Carl Shapiro ClassObject* arrayClass = dvmFindArrayClassForElement(elementClass); 114c233f165a425ce44c7e5e75b14bc4fc018288345Carl Shapiro ArrayObject* newArray = dvmAllocArrayByClass(arrayClass, 115c233f165a425ce44c7e5e75b14bc4fc018288345Carl Shapiro length, 11652e2626eb3bf620c53459a90d912733de2ce0369Carl Shapiro ALLOC_NON_MOVING); 117f5949168d4142cde1582117173b03c614b632938Elliott Hughes if (newArray == NULL) { 118f5949168d4142cde1582117173b03c614b632938Elliott Hughes assert(dvmCheckException(dvmThreadSelf())); 119f5949168d4142cde1582117173b03c614b632938Elliott Hughes RETURN_VOID(); 120f5949168d4142cde1582117173b03c614b632938Elliott Hughes } 121f5949168d4142cde1582117173b03c614b632938Elliott Hughes dvmReleaseTrackedAlloc((Object*) newArray, NULL); 122f5949168d4142cde1582117173b03c614b632938Elliott Hughes 123f5949168d4142cde1582117173b03c614b632938Elliott Hughes RETURN_PTR(newArray); 124f5949168d4142cde1582117173b03c614b632938Elliott Hughes} 125f5949168d4142cde1582117173b03c614b632938Elliott Hughes 126f5949168d4142cde1582117173b03c614b632938Elliott Hughesstatic void Dalvik_dalvik_system_VMRuntime_addressOf(const u4* args, 127f5949168d4142cde1582117173b03c614b632938Elliott Hughes JValue* pResult) 128f5949168d4142cde1582117173b03c614b632938Elliott Hughes{ 129f5949168d4142cde1582117173b03c614b632938Elliott Hughes ArrayObject* array = (ArrayObject*) args[1]; 13019f4f02d096e549c1aaabdb5e8fa317588ab0bfdElliott Hughes if (!dvmIsArray(array)) { 131d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein dvmThrowIllegalArgumentException(NULL); 13219f4f02d096e549c1aaabdb5e8fa317588ab0bfdElliott Hughes RETURN_VOID(); 13319f4f02d096e549c1aaabdb5e8fa317588ab0bfdElliott Hughes } 13419f4f02d096e549c1aaabdb5e8fa317588ab0bfdElliott Hughes // TODO: we should also check that this is a non-movable array. 135f5949168d4142cde1582117173b03c614b632938Elliott Hughes s8 result = (uintptr_t) array->contents; 136f5949168d4142cde1582117173b03c614b632938Elliott Hughes RETURN_LONG(result); 137f5949168d4142cde1582117173b03c614b632938Elliott Hughes} 138f5949168d4142cde1582117173b03c614b632938Elliott Hughes 139df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapirostatic void Dalvik_dalvik_system_VMRuntime_clearGrowthLimit(const u4* args, 140df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro JValue* pResult) 141df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro{ 142df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro dvmClearGrowthLimit(); 143df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro RETURN_VOID(); 144df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro} 145df9f08b877ecfd8ebadea822bb9e066ee7d30433Carl Shapiro 146e58a9b5d443cd3fcc22abc887cf0739a4b6bc145Jesse Wilsonstatic void Dalvik_dalvik_system_VMRuntime_isDebuggerActive( 147e58a9b5d443cd3fcc22abc887cf0739a4b6bc145Jesse Wilson const u4* args, JValue* pResult) 148e58a9b5d443cd3fcc22abc887cf0739a4b6bc145Jesse Wilson{ 149e58a9b5d443cd3fcc22abc887cf0739a4b6bc145Jesse Wilson RETURN_BOOLEAN(gDvm.debuggerActive || gDvm.nativeDebuggerActive); 150e58a9b5d443cd3fcc22abc887cf0739a4b6bc145Jesse Wilson} 151e58a9b5d443cd3fcc22abc887cf0739a4b6bc145Jesse Wilson 15249dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughesstatic void Dalvik_dalvik_system_VMRuntime_properties(const u4* args, 15349dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes JValue* pResult) 15449dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes{ 155db0c9549818d9f6e508d26e45ff9d886802aa1daCarl Shapiro const char** strings = (const char**) arrayUnwrap(gDvm.properties); 15649dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes int count = arraySize(gDvm.properties); 15749dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes ArrayObject* result = dvmCreateStringArray(strings, count); 15849dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes dvmReleaseTrackedAlloc((Object*) result, dvmThreadSelf()); 15949dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes RETURN_PTR(result); 16049dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes} 16149dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes 16249dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughesstatic void returnCString(JValue* pResult, const char* s) 16349dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes{ 16449dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes Object* result = (Object*) dvmCreateStringFromCstr(s); 16549dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes dvmReleaseTrackedAlloc(result, dvmThreadSelf()); 16649dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes RETURN_PTR(result); 16749dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes} 16849dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes 16949dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughesstatic void Dalvik_dalvik_system_VMRuntime_bootClassPath(const u4* args, 17049dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes JValue* pResult) 17149dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes{ 17249dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes returnCString(pResult, gDvm.bootClassPathStr); 17349dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes} 17449dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes 17549dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughesstatic void Dalvik_dalvik_system_VMRuntime_classPath(const u4* args, 17649dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes JValue* pResult) 17749dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes{ 17849dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes returnCString(pResult, gDvm.classPathStr); 17949dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes} 18049dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes 18149dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughesstatic void Dalvik_dalvik_system_VMRuntime_vmVersion(const u4* args, 18249dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes JValue* pResult) 18349dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes{ 18449dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes char buf[64]; 18549dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes sprintf(buf, "%d.%d.%d", 18649dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes DALVIK_MAJOR_VERSION, DALVIK_MINOR_VERSION, DALVIK_BUG_VERSION); 18749dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes returnCString(pResult, buf); 18849dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes} 18949dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst DalvikNativeMethod dvm_dalvik_system_VMRuntime[] = { 19149dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes { "addressOf", "(Ljava/lang/Object;)J", 19249dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes Dalvik_dalvik_system_VMRuntime_addressOf }, 19349dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes { "bootClassPath", "()Ljava/lang/String;", 19449dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes Dalvik_dalvik_system_VMRuntime_bootClassPath }, 19549dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes { "classPath", "()Ljava/lang/String;", 19649dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes Dalvik_dalvik_system_VMRuntime_classPath }, 19749dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes { "clearGrowthLimit", "()V", 19849dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes Dalvik_dalvik_system_VMRuntime_clearGrowthLimit }, 19949dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes { "disableJitCompilation", "()V", 20049dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes Dalvik_dalvik_system_VMRuntime_disableJitCompilation }, 201e58a9b5d443cd3fcc22abc887cf0739a4b6bc145Jesse Wilson { "isDebuggerActive", "()Z", 202e58a9b5d443cd3fcc22abc887cf0739a4b6bc145Jesse Wilson Dalvik_dalvik_system_VMRuntime_isDebuggerActive }, 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getTargetHeapUtilization", "()F", 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_dalvik_system_VMRuntime_getTargetHeapUtilization }, 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "nativeSetTargetHeapUtilization", "(F)V", 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_dalvik_system_VMRuntime_nativeSetTargetHeapUtilization }, 20749dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes { "newNonMovableArray", "(Ljava/lang/Class;I)Ljava/lang/Object;", 20849dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes Dalvik_dalvik_system_VMRuntime_newNonMovableArray }, 20949dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes { "properties", "()[Ljava/lang/String;", 21049dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes Dalvik_dalvik_system_VMRuntime_properties }, 211a97ed1382c4e74704b44d366cf464bef5757c6b0Ben Cheng { "startJitCompilation", "()V", 212a97ed1382c4e74704b44d366cf464bef5757c6b0Ben Cheng Dalvik_dalvik_system_VMRuntime_startJitCompilation }, 21349dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes { "vmVersion", "()Ljava/lang/String;", 21449dc060d5ae9bbcc78e570ec0dd244973e920fb6Elliott Hughes Dalvik_dalvik_system_VMRuntime_vmVersion }, 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { NULL, NULL, NULL }, 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 217