blob: aecfdb0b4fe8f07c77592bb2941d02674f86f9e4 [file] [log] [blame]
Brian Carlstromdd8af232012-05-13 23:56:07 -07001/*
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 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 */
40struct 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 characterClass;
49 static jclass charsetICUClass;
50 static jclass constructorClass;
51 static jclass deflaterClass;
52 static jclass doubleClass;
53 static jclass errnoExceptionClass;
54 static jclass fieldClass;
55 static jclass fieldPositionIteratorClass;
56 static jclass fileDescriptorClass;
57 static jclass floatClass;
58 static jclass gaiExceptionClass;
59 static jclass inet6AddressClass;
60 static jclass inetAddressClass;
61 static jclass inetSocketAddressClass;
62 static jclass inflaterClass;
63 static jclass integerClass;
64 static jclass localeDataClass;
65 static jclass longClass;
66 static jclass methodClass;
67 static jclass mutableIntClass;
68 static jclass mutableLongClass;
69 static jclass parsePositionClass;
70 static jclass patternSyntaxExceptionClass;
71 static jclass realToStringClass;
72 static jclass shortClass;
73 static jclass socketClass;
74 static jclass socketImplClass;
75 static jclass stringArrayClass;
76 static jclass stringClass;
77 static jclass structAddrinfoClass;
78 static jclass structFlockClass;
79 static jclass structGroupReqClass;
80 static jclass structLingerClass;
81 static jclass structPasswdClass;
82 static jclass structPollfdClass;
83 static jclass structStatClass;
84 static jclass structStatFsClass;
85 static jclass structTimevalClass;
86 static jclass structUtsnameClass;
87};
88
89#define NATIVE_METHOD(className, functionName, signature) \
90 { #functionName, signature, reinterpret_cast<void*>(className ## _ ## functionName) }
91
92#endif // JNI_CONSTANTS_H_included