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