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, so we do these lookups at startup. This means that code 26 * that never uses, say, java.util.zip.Deflater still has to pay for the lookup, but it means that 27 * on device the cost is paid during boot and amortized. A central cache also removes the temptation 28 * to dynamically call FindClass rather than add a small cache to each file that needs one. Another 29 * cost is that each class cached here requires a global reference, though in practice we save 30 * enough by not having a global reference for each file that uses a class such as java.lang.String 31 * which is used in several files. 32 * 33 * FindClass is still called in a couple of situations: when throwing exceptions, and in some of 34 * the serialization code. The former is clearly not a performance case, and we're currently 35 * assuming that neither is the latter. 36 * 37 * TODO: similar arguments hold for field and method IDs; we should cache them centrally too. 38 */ 39 struct JniConstants { 40 static void init(JNIEnv* env); 41 42 static jclass booleanClass; 43 static jclass byteArrayClass; 44 static jclass calendarClass; 45 static jclass charsetICUClass; 46 static jclass doubleClass; 47 static jclass errnoExceptionClass; 48 static jclass fileDescriptorClass; 49 static jclass gaiExceptionClass; 50 static jclass inet6AddressClass; 51 static jclass inet6AddressHolderClass; 52 static jclass inetAddressClass; 53 static jclass inetAddressHolderClass; 54 static jclass inetSocketAddressClass; 55 static jclass inetSocketAddressHolderClass; 56 static jclass integerClass; 57 static jclass localeDataClass; 58 static jclass longClass; 59 static jclass mutableIntClass; 60 static jclass mutableLongClass; 61 static jclass netlinkSocketAddressClass; 62 static jclass packetSocketAddressClass; 63 static jclass patternSyntaxExceptionClass; 64 static jclass referenceClass; 65 static jclass socketTaggerClass; 66 static jclass stringClass; 67 static jclass structAddrinfoClass; 68 static jclass structFlockClass; 69 static jclass structGroupReqClass; 70 static jclass structGroupSourceReqClass; 71 static jclass structIfaddrs; 72 static jclass structLingerClass; 73 static jclass structPasswdClass; 74 static jclass structPollfdClass; 75 static jclass structStatClass; 76 static jclass structStatVfsClass; 77 static jclass structTimevalClass; 78 static jclass structTimespecClass; 79 static jclass structUcredClass; 80 static jclass structUtsnameClass; 81 static jclass unixSocketAddressClass; 82 static jclass zipEntryClass; 83 }; 84 85 #define NATIVE_METHOD(className, functionName, signature) \ 86 { #functionName, signature, reinterpret_cast<void*>(className ## _ ## functionName) } 87 88 #endif // JNI_CONSTANTS_H_included 89