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 #define LOG_TAG "JniConstants" 18 19 #include "ALog-priv.h" 20 #include "JniConstants.h" 21 #include "ScopedLocalRef.h" 22 23 #include <stdlib.h> 24 25 #include <atomic> 26 #include <mutex> 27 28 static std::atomic<bool> g_constants_initialized(false); 29 static std::mutex g_constants_mutex; 30 31 jclass JniConstants::booleanClass; 32 jclass JniConstants::byteArrayClass; 33 jclass JniConstants::calendarClass; 34 jclass JniConstants::charsetICUClass; 35 jclass JniConstants::doubleClass; 36 jclass JniConstants::errnoExceptionClass; 37 jclass JniConstants::fileDescriptorClass; 38 jclass JniConstants::gaiExceptionClass; 39 jclass JniConstants::inet6AddressClass; 40 jclass JniConstants::inet6AddressHolderClass; 41 jclass JniConstants::inetAddressClass; 42 jclass JniConstants::inetAddressHolderClass; 43 jclass JniConstants::inetSocketAddressClass; 44 jclass JniConstants::inetSocketAddressHolderClass; 45 jclass JniConstants::integerClass; 46 jclass JniConstants::localeDataClass; 47 jclass JniConstants::longClass; 48 jclass JniConstants::mutableIntClass; 49 jclass JniConstants::mutableLongClass; 50 jclass JniConstants::netlinkSocketAddressClass; 51 jclass JniConstants::packetSocketAddressClass; 52 jclass JniConstants::patternSyntaxExceptionClass; 53 jclass JniConstants::referenceClass; 54 jclass JniConstants::socketTaggerClass; 55 jclass JniConstants::stringClass; 56 jclass JniConstants::structAddrinfoClass; 57 jclass JniConstants::structFlockClass; 58 jclass JniConstants::structGroupReqClass; 59 jclass JniConstants::structGroupSourceReqClass; 60 jclass JniConstants::structIfaddrs; 61 jclass JniConstants::structLingerClass; 62 jclass JniConstants::structPasswdClass; 63 jclass JniConstants::structPollfdClass; 64 jclass JniConstants::structStatClass; 65 jclass JniConstants::structStatVfsClass; 66 jclass JniConstants::structTimevalClass; 67 jclass JniConstants::structTimespecClass; 68 jclass JniConstants::structUcredClass; 69 jclass JniConstants::structUtsnameClass; 70 jclass JniConstants::unixSocketAddressClass; 71 jclass JniConstants::zipEntryClass; 72 73 static jclass findClass(JNIEnv* env, const char* name) { 74 ScopedLocalRef<jclass> localClass(env, env->FindClass(name)); 75 jclass result = reinterpret_cast<jclass>(env->NewGlobalRef(localClass.get())); 76 if (result == NULL) { 77 ALOGE("failed to find class '%s'", name); 78 abort(); 79 } 80 return result; 81 } 82 83 void JniConstants::init(JNIEnv* env) { 84 // Fast check 85 if (g_constants_initialized) { 86 // already initialized 87 return; 88 } 89 90 // Slightly slower check 91 std::lock_guard<std::mutex> guard(g_constants_mutex); 92 if (g_constants_initialized) { 93 // already initialized 94 return; 95 } 96 97 booleanClass = findClass(env, "java/lang/Boolean"); 98 byteArrayClass = findClass(env, "[B"); 99 calendarClass = findClass(env, "java/util/Calendar"); 100 charsetICUClass = findClass(env, "java/nio/charset/CharsetICU"); 101 doubleClass = findClass(env, "java/lang/Double"); 102 errnoExceptionClass = findClass(env, "android/system/ErrnoException"); 103 fileDescriptorClass = findClass(env, "java/io/FileDescriptor"); 104 gaiExceptionClass = findClass(env, "android/system/GaiException"); 105 inet6AddressClass = findClass(env, "java/net/Inet6Address"); 106 inet6AddressHolderClass = findClass(env, "java/net/Inet6Address$Inet6AddressHolder"); 107 inetAddressClass = findClass(env, "java/net/InetAddress"); 108 inetAddressHolderClass = findClass(env, "java/net/InetAddress$InetAddressHolder"); 109 inetSocketAddressClass = findClass(env, "java/net/InetSocketAddress"); 110 inetSocketAddressHolderClass = findClass(env, "java/net/InetSocketAddress$InetSocketAddressHolder"); 111 integerClass = findClass(env, "java/lang/Integer"); 112 localeDataClass = findClass(env, "libcore/icu/LocaleData"); 113 longClass = findClass(env, "java/lang/Long"); 114 mutableIntClass = findClass(env, "android/util/MutableInt"); 115 mutableLongClass = findClass(env, "android/util/MutableLong"); 116 netlinkSocketAddressClass = findClass(env, "android/system/NetlinkSocketAddress"); 117 packetSocketAddressClass = findClass(env, "android/system/PacketSocketAddress"); 118 patternSyntaxExceptionClass = findClass(env, "java/util/regex/PatternSyntaxException"); 119 referenceClass = findClass(env, "java/lang/ref/Reference"); 120 socketTaggerClass = findClass(env, "dalvik/system/SocketTagger"); 121 stringClass = findClass(env, "java/lang/String"); 122 structAddrinfoClass = findClass(env, "android/system/StructAddrinfo"); 123 structFlockClass = findClass(env, "android/system/StructFlock"); 124 structGroupReqClass = findClass(env, "android/system/StructGroupReq"); 125 structGroupSourceReqClass = findClass(env, "android/system/StructGroupSourceReq"); 126 structIfaddrs = findClass(env, "android/system/StructIfaddrs"); 127 structLingerClass = findClass(env, "android/system/StructLinger"); 128 structPasswdClass = findClass(env, "android/system/StructPasswd"); 129 structPollfdClass = findClass(env, "android/system/StructPollfd"); 130 structStatClass = findClass(env, "android/system/StructStat"); 131 structStatVfsClass = findClass(env, "android/system/StructStatVfs"); 132 structTimevalClass = findClass(env, "android/system/StructTimeval"); 133 structTimespecClass = findClass(env, "android/system/StructTimespec"); 134 structUcredClass = findClass(env, "android/system/StructUcred"); 135 structUtsnameClass = findClass(env, "android/system/StructUtsname"); 136 unixSocketAddressClass = findClass(env, "android/system/UnixSocketAddress"); 137 zipEntryClass = findClass(env, "java/util/zip/ZipEntry"); 138 139 g_constants_initialized = true; 140 } 141