1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef JNI_CONSTANTS_H_included 18 #define JNI_CONSTANTS_H_included 19 20 #include "JNIHelp.h" 21 22 /** 23 * A cache to avoid calling FindClass at runtime. 24 * 25 * Class lookup is relatively expensive (2.5us on passion-eng at the time of writing), so we do 26 * all such lookups eagerly at VM startup. This means that code that never uses, say, 27 * java.util.zip.Deflater still has to pay for the lookup, but it means that on a device the cost 28 * is definitely paid during boot and amortized. A central cache also removes the temptation to 29 * dynamically call FindClass rather than add a small cache to each file that needs one. Another 30 * cost is that each class cached here requires a global reference, though in practice we save 31 * enough by not having a global reference for each file that uses a class such as java.lang.String 32 * which is used in several files. 33 * 34 * FindClass is still called in a couple of situations: when throwing exceptions, and in some of 35 * the serialization code. The former is clearly not a performance case, and we're currently 36 * assuming that neither is the latter. 37 * 38 * TODO: similar arguments hold for field and method IDs; we should cache them centrally too. 39 */ 40 struct JniConstants { 41 static void init(JNIEnv* env); 42 43 static jclass bidiRunClass; 44 static jclass bigDecimalClass; 45 static jclass booleanClass; 46 static jclass byteArrayClass; 47 static jclass byteClass; 48 static jclass charsetICUClass; 49 static jclass constructorClass; 50 static jclass deflaterClass; 51 static jclass doubleClass; 52 static jclass errnoExceptionClass; 53 static jclass fieldClass; 54 static jclass fieldPositionIteratorClass; 55 static jclass fileDescriptorClass; 56 static jclass gaiExceptionClass; 57 static jclass inet6AddressClass; 58 static jclass inetAddressClass; 59 static jclass inetSocketAddressClass; 60 static jclass inflaterClass; 61 static jclass integerClass; 62 static jclass localeDataClass; 63 static jclass longClass; 64 static jclass methodClass; 65 static jclass mutableIntClass; 66 static jclass mutableLongClass; 67 static jclass parsePositionClass; 68 static jclass patternSyntaxExceptionClass; 69 static jclass realToStringClass; 70 static jclass socketClass; 71 static jclass socketImplClass; 72 static jclass stringArrayClass; 73 static jclass stringClass; 74 static jclass structAddrinfoClass; 75 static jclass structFlockClass; 76 static jclass structGroupReqClass; 77 static jclass structLingerClass; 78 static jclass structPasswdClass; 79 static jclass structPollfdClass; 80 static jclass structStatClass; 81 static jclass structStatFsClass; 82 static jclass structTimevalClass; 83 static jclass structUtsnameClass; 84 }; 85 86 #define NATIVE_METHOD(className, functionName, signature) \ 87 { #functionName, signature, reinterpret_cast<void*>(className ## _ ## functionName) } 88 89 #endif // JNI_CONSTANTS_H_included 90