summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2010-06-16 16:32:18 -0700
committerElliott Hughes <enh@google.com>2010-06-16 16:32:18 -0700
commita9f5c16a864ff63ba63f810410f8a27c086d5d52 (patch)
tree2dd4b885c23ada270ca59bff053ffc2f16577eab
parentd93bf0f076628f52c56610853435f04ce9983a15 (diff)
downloadlibcore-a9f5c16a864ff63ba63f810410f8a27c086d5d52.zip
libcore-a9f5c16a864ff63ba63f810410f8a27c086d5d52.tar.gz
libcore-a9f5c16a864ff63ba63f810410f8a27c086d5d52.tar.bz2
Remove dynamic calls to FindClass.
Initially, I was just fixing a threading bug in NativeDecimalFormat.cpp where we were bypassing GCC's built-in static initializer thread safety. This led me to the question of how expensive FindClass is, which led me to creating a new canonical cache of jclasses. Here's the motivating benchmark, showing the cost of calling an empty regular (non-native) method, an empty native method, a native method that calls FindClass, a native method that calls FindClass and GetFieldID, and a native method that calls FindClass and GetMethodID: benchmark ns logarithmic runtime NoArgsRegular 74 |||||||||||||| NoArgsNative 428 XX||||||||||||||||||| FindClass 3064 XXXXXXXXXXXXXXXX||||||||||| FindClassGetField 3654 XXXXXXXXXXXXXXXXXXX||||||||| FindClassGetMethod 5634 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Change-Id: I41ab2b347895f043a7e21d8fa19e4541e198c3fc
-rw-r--r--luni/src/main/native/BidiWrapper.cpp11
-rw-r--r--luni/src/main/native/ICU.cpp31
-rw-r--r--luni/src/main/native/JniConstants.cpp86
-rw-r--r--luni/src/main/native/JniConstants.h54
-rw-r--r--luni/src/main/native/NativeConverter.cpp13
-rw-r--r--luni/src/main/native/NativeDecimalFormat.cpp25
-rw-r--r--luni/src/main/native/NativeRegEx.cpp20
-rw-r--r--luni/src/main/native/NetworkUtilities.cpp9
-rw-r--r--luni/src/main/native/Register.cpp9
-rw-r--r--luni/src/main/native/java_io_File.cpp7
-rw-r--r--luni/src/main/native/java_io_FileDescriptor.c12
-rw-r--r--luni/src/main/native/java_io_ObjectStreamClass.cpp83
-rw-r--r--luni/src/main/native/java_lang_ProcessManager.cpp9
-rw-r--r--luni/src/main/native/java_net_InetAddress.cpp19
-rw-r--r--luni/src/main/native/java_net_NetworkInterface.cpp17
-rw-r--r--luni/src/main/native/java_util_zip_Deflater.cpp6
-rw-r--r--luni/src/main/native/java_util_zip_Inflater.cpp8
-rw-r--r--luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp69
-rw-r--r--luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp67
-rw-r--r--luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp8
-rw-r--r--luni/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp27
-rw-r--r--luni/src/main/native/sub.mk1
-rw-r--r--luni/src/main/native/valueOf.cpp23
23 files changed, 306 insertions, 308 deletions
diff --git a/luni/src/main/native/BidiWrapper.cpp b/luni/src/main/native/BidiWrapper.cpp
index 59dcfaa..f703586 100644
--- a/luni/src/main/native/BidiWrapper.cpp
+++ b/luni/src/main/native/BidiWrapper.cpp
@@ -16,11 +16,13 @@
*/
#define LOG_TAG "BidiWrapper"
-#include <JNIHelp.h>
#include "ErrorCode.h"
+#include "JNIHelp.h"
+#include "JniConstants.h"
#include "ScopedPrimitiveArray.h"
#include "UniquePtr.h"
#include "unicode/ubidi.h"
+
#include <stdlib.h>
#include <string.h>
@@ -135,15 +137,14 @@ static jobjectArray BidiWrapper_ubidi_getRuns(JNIEnv* env, jclass, jlong ptr) {
if (icu4jni_error(env, err)) {
return NULL;
}
- jclass bidiRunClass = env->FindClass("org/apache/harmony/text/BidiRun");
- jmethodID bidiRunConstructor = env->GetMethodID(bidiRunClass, "<init>", "(III)V");
- jobjectArray runs = env->NewObjectArray(runCount, bidiRunClass, NULL);
+ jmethodID bidiRunConstructor = env->GetMethodID(JniConstants::bidiRunClass, "<init>", "(III)V");
+ jobjectArray runs = env->NewObjectArray(runCount, JniConstants::bidiRunClass, NULL);
UBiDiLevel level = 0;
int start = 0;
int limit = 0;
for (int i = 0; i < runCount; ++i) {
ubidi_getLogicalRun(ubidi, start, &limit, &level);
- jobject run = env->NewObject(bidiRunClass, bidiRunConstructor, start, limit, level);
+ jobject run = env->NewObject(JniConstants::bidiRunClass, bidiRunConstructor, start, limit, level);
env->SetObjectArrayElement(runs, i, run);
start = limit;
}
diff --git a/luni/src/main/native/ICU.cpp b/luni/src/main/native/ICU.cpp
index 329b494..8df7c7e 100644
--- a/luni/src/main/native/ICU.cpp
+++ b/luni/src/main/native/ICU.cpp
@@ -18,6 +18,7 @@
#include "ErrorCode.h"
#include "JNIHelp.h"
+#include "JniConstants.h"
#include "ScopedLocalRef.h"
#include "ScopedUtfChars.h"
#include "UniquePtr.h"
@@ -47,8 +48,6 @@
#include <time.h>
#include <sys/time.h>
-static jclass string_class;
-
class ScopedResourceBundle {
public:
ScopedResourceBundle(UResourceBundle* bundle) : mBundle(bundle) {
@@ -213,7 +212,7 @@ static jobjectArray toStringArray(JNIEnv* env, const char* const* strings) {
while (strings[count] != NULL) {
++count;
}
- jobjectArray result = env->NewObjectArray(count, string_class, NULL);
+ jobjectArray result = env->NewObjectArray(count, JniConstants::stringClass, NULL);
for (size_t i = 0; i < count; ++i) {
ScopedLocalRef<jstring> s(env, env->NewStringUTF(strings[i]));
env->SetObjectArrayElement(result, i, s.get());
@@ -232,7 +231,7 @@ static jobjectArray getISOLanguagesNative(JNIEnv* env, jclass) {
template <typename Counter, typename Getter>
static jobjectArray getAvailableLocales(JNIEnv* env, Counter* counter, Getter* getter) {
size_t count = (*counter)();
- jobjectArray result = env->NewObjectArray(count, string_class, NULL);
+ jobjectArray result = env->NewObjectArray(count, JniConstants::stringClass, NULL);
for (size_t i = 0; i < count; ++i) {
ScopedLocalRef<jstring> s(env, env->NewStringUTF((*getter)(i)));
env->SetObjectArrayElement(result, i, s.get());
@@ -386,7 +385,7 @@ static jobjectArray getAmPmMarkers(JNIEnv* env, UResourceBundle* gregorian) {
return NULL;
}
- jobjectArray amPmMarkers = env->NewObjectArray(2, string_class, NULL);
+ jobjectArray amPmMarkers = env->NewObjectArray(2, JniConstants::stringClass, NULL);
ScopedLocalRef<jstring> amU(env, env->NewString(am, lengthAm));
env->SetObjectArrayElement(amPmMarkers, 0, amU.get());
ScopedLocalRef<jstring> pmU(env, env->NewString(pm, lengthPm));
@@ -408,7 +407,7 @@ static jobjectArray getEras(JNIEnv* env, UResourceBundle* gregorian) {
}
int eraCount = ures_getSize(eraElems.get());
- jobjectArray eras = env->NewObjectArray(eraCount, string_class, NULL);
+ jobjectArray eras = env->NewObjectArray(eraCount, JniConstants::stringClass, NULL);
for (int i = 0; i < eraCount; ++i) {
int eraLength;
const jchar* era = ures_getStringByIndex(eraElems.get(), i, &eraLength, &status);
@@ -435,7 +434,7 @@ static jobjectArray getNames(JNIEnv* env, UResourceBundle* namesBundle, bool mon
// The months array has a trailing empty string. The days array has a leading empty string.
int count = ures_getSize(valuesBundle.get());
- jobjectArray result = env->NewObjectArray(count + 1, string_class, NULL);
+ jobjectArray result = env->NewObjectArray(count + 1, JniConstants::stringClass, NULL);
env->SetObjectArrayElement(result, months ? count : 0, env->NewStringUTF(""));
int arrayOffset = months ? 0 : 1;
for (int i = 0; i < count; ++i) {
@@ -467,20 +466,17 @@ static jstring getIntCurrencyCode(JNIEnv* env, jstring locale) {
static void setIntegerField(JNIEnv* env, jobject obj, const char* fieldName, int value) {
ScopedLocalRef<jobject> integerValue(env, integerValueOf(env, value));
- jclass localeDataClass = env->FindClass("com/ibm/icu4jni/util/LocaleData");
- jfieldID fid = env->GetFieldID(localeDataClass, fieldName, "Ljava/lang/Integer;");
+ jfieldID fid = env->GetFieldID(JniConstants::localeDataClass, fieldName, "Ljava/lang/Integer;");
env->SetObjectField(obj, fid, integerValue.get());
}
static void setStringField(JNIEnv* env, jobject obj, const char* fieldName, jstring value) {
- jclass localeDataClass = env->FindClass("com/ibm/icu4jni/util/LocaleData");
- jfieldID fid = env->GetFieldID(localeDataClass, fieldName, "Ljava/lang/String;");
+ jfieldID fid = env->GetFieldID(JniConstants::localeDataClass, fieldName, "Ljava/lang/String;");
env->SetObjectField(obj, fid, value);
}
static void setStringArrayField(JNIEnv* env, jobject obj, const char* fieldName, jobjectArray value) {
- jclass localeDataClass = env->FindClass("com/ibm/icu4jni/util/LocaleData");
- jfieldID fid = env->GetFieldID(localeDataClass, fieldName, "[Ljava/lang/String;");
+ jfieldID fid = env->GetFieldID(JniConstants::localeDataClass, fieldName, "[Ljava/lang/String;");
env->SetObjectField(obj, fid, value);
}
@@ -500,8 +496,7 @@ static void setCharField(JNIEnv* env, jobject obj, const char* fieldName, UResou
int charCount;
const UChar* chars = ures_getStringByIndex(bundle, index, &charCount, &status);
if (U_SUCCESS(status)) {
- jclass localeDataClass = env->FindClass("com/ibm/icu4jni/util/LocaleData");
- jfieldID fid = env->GetFieldID(localeDataClass, fieldName, "C");
+ jfieldID fid = env->GetFieldID(JniConstants::localeDataClass, fieldName, "C");
env->SetCharField(obj, fid, chars[0]);
} else {
LOGE("Error setting char field %s from ICU resource: %s", fieldName, u_errorName(status));
@@ -653,11 +648,5 @@ static JNINativeMethod gMethods[] = {
{"initLocaleDataImpl", "(Ljava/lang/String;Lcom/ibm/icu4jni/util/LocaleData;)Z", (void*) initLocaleDataImpl},
};
int register_com_ibm_icu4jni_util_Resources(JNIEnv* env) {
- jclass stringclass = env->FindClass("java/lang/String");
- if (stringclass == NULL) {
- return -1;
- }
- string_class = (jclass) env->NewGlobalRef(stringclass);
-
return jniRegisterNativeMethods(env, "com/ibm/icu4jni/util/ICU", gMethods, NELEM(gMethods));
}
diff --git a/luni/src/main/native/JniConstants.cpp b/luni/src/main/native/JniConstants.cpp
new file mode 100644
index 0000000..0292357
--- /dev/null
+++ b/luni/src/main/native/JniConstants.cpp
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "JniConstants.h"
+
+#include <stdlib.h>
+
+jclass JniConstants::bidiRunClass;
+jclass JniConstants::bigDecimalClass;
+jclass JniConstants::booleanClass;
+jclass JniConstants::byteClass;
+jclass JniConstants::byteArrayClass;
+jclass JniConstants::charsetICUClass;
+jclass JniConstants::constructorClass;
+jclass JniConstants::datagramPacketClass;
+jclass JniConstants::deflaterClass;
+jclass JniConstants::doubleClass;
+jclass JniConstants::fieldClass;
+jclass JniConstants::fieldPositionIteratorClass;
+jclass JniConstants::fileDescriptorClass;
+jclass JniConstants::genericIPMreqClass;
+jclass JniConstants::inetAddressClass;
+jclass JniConstants::inflaterClass;
+jclass JniConstants::integerClass;
+jclass JniConstants::interfaceAddressClass;
+jclass JniConstants::localeDataClass;
+jclass JniConstants::longClass;
+jclass JniConstants::methodClass;
+jclass JniConstants::parsePositionClass;
+jclass JniConstants::patternSyntaxExceptionClass;
+jclass JniConstants::socketClass;
+jclass JniConstants::socketImplClass;
+jclass JniConstants::stringClass;
+jclass JniConstants::vmRuntimeClass;
+
+static jclass findClass(JNIEnv* env, const char* name) {
+ jclass result = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass(name)));
+ if (result == NULL) {
+ LOGE("failed to find class '%s'", name);
+ abort();
+ }
+ return result;
+}
+
+void JniConstants::init(JNIEnv* env) {
+ bidiRunClass = findClass(env, "org/apache/harmony/text/BidiRun");
+ bigDecimalClass = findClass(env, "java/math/BigDecimal");
+ booleanClass = findClass(env, "java/lang/Boolean");
+ byteClass = findClass(env, "java/lang/Byte");
+ byteArrayClass = findClass(env, "[B");
+ charsetICUClass = findClass(env, "com/ibm/icu4jni/charset/CharsetICU");
+ constructorClass = findClass(env, "java/lang/reflect/Constructor");
+ datagramPacketClass = findClass(env, "java/net/DatagramPacket");
+ deflaterClass = findClass(env, "java/util/zip/Deflater");
+ doubleClass = findClass(env, "java/lang/Double");
+ fieldClass = findClass(env, "java/lang/reflect/Field");
+ fieldPositionIteratorClass = findClass(env, "com/ibm/icu4jni/text/NativeDecimalFormat$FieldPositionIterator");
+ fileDescriptorClass = findClass(env, "java/io/FileDescriptor");
+ genericIPMreqClass = findClass(env, "org/apache/harmony/luni/net/GenericIPMreq");
+ inetAddressClass = findClass(env, "java/net/InetAddress");
+ inflaterClass = findClass(env, "java/util/zip/Inflater");
+ integerClass = findClass(env, "java/lang/Integer");
+ interfaceAddressClass = findClass(env, "java/net/InterfaceAddress");
+ localeDataClass = findClass(env, "com/ibm/icu4jni/util/LocaleData");
+ longClass = findClass(env, "java/lang/Long");
+ methodClass = findClass(env, "java/lang/reflect/Method");
+ parsePositionClass = findClass(env, "java/text/ParsePosition");
+ patternSyntaxExceptionClass = findClass(env, "java/util/regex/PatternSyntaxException");
+ socketClass = findClass(env, "java/net/Socket");
+ socketImplClass = findClass(env, "java/net/SocketImpl");
+ stringClass = findClass(env, "java/lang/String");
+ vmRuntimeClass = findClass(env, "dalvik/system/VMRuntime");
+}
diff --git a/luni/src/main/native/JniConstants.h b/luni/src/main/native/JniConstants.h
new file mode 100644
index 0000000..e5898f2
--- /dev/null
+++ b/luni/src/main/native/JniConstants.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef JNI_CONSTANTS_H_included
+#define JNI_CONSTANTS_H_included
+
+#include "JNIHelp.h"
+
+struct JniConstants {
+ static void init(JNIEnv* env);
+
+ static jclass bidiRunClass;
+ static jclass bigDecimalClass;
+ static jclass booleanClass;
+ static jclass byteClass;
+ static jclass byteArrayClass;
+ static jclass charsetICUClass;
+ static jclass constructorClass;
+ static jclass datagramPacketClass;
+ static jclass deflaterClass;
+ static jclass doubleClass;
+ static jclass fieldClass;
+ static jclass fieldPositionIteratorClass;
+ static jclass fileDescriptorClass;
+ static jclass genericIPMreqClass;
+ static jclass inetAddressClass;
+ static jclass inflaterClass;
+ static jclass integerClass;
+ static jclass interfaceAddressClass;
+ static jclass localeDataClass;
+ static jclass longClass;
+ static jclass methodClass;
+ static jclass parsePositionClass;
+ static jclass patternSyntaxExceptionClass;
+ static jclass socketClass;
+ static jclass socketImplClass;
+ static jclass stringClass;
+ static jclass vmRuntimeClass;
+};
+
+#endif // JNI_CONSTANTS_H_included
diff --git a/luni/src/main/native/NativeConverter.cpp b/luni/src/main/native/NativeConverter.cpp
index 35fcf6f..2d99383 100644
--- a/luni/src/main/native/NativeConverter.cpp
+++ b/luni/src/main/native/NativeConverter.cpp
@@ -19,6 +19,7 @@
#include "ErrorCode.h"
#include "JNIHelp.h"
+#include "JniConstants.h"
#include "ScopedLocalRef.h"
#include "ScopedPrimitiveArray.h"
#include "ScopedUtfChars.h"
@@ -300,7 +301,7 @@ static jstring getJavaCanonicalName(JNIEnv* env, const char* icuCanonicalName) {
static jobjectArray NativeConverter_getAvailableCharsetNames(JNIEnv* env, jclass) {
int32_t num = ucnv_countAvailable();
- jobjectArray result = env->NewObjectArray(num, env->FindClass("java/lang/String"), NULL);
+ jobjectArray result = env->NewObjectArray(num, JniConstants::stringClass, NULL);
for (int i = 0; i < num; ++i) {
const char* name = ucnv_getAvailableName(i);
ScopedLocalRef<jstring> javaCanonicalName(env, getJavaCanonicalName(env, name));
@@ -337,7 +338,7 @@ static jobjectArray getAliases(JNIEnv* env, const char* icuCanonicalName) {
}
// Convert our C++ char*[] into a Java String[]...
- jobjectArray result = env->NewObjectArray(actualAliasCount, env->FindClass("java/lang/String"), NULL);
+ jobjectArray result = env->NewObjectArray(actualAliasCount, JniConstants::stringClass, NULL);
for (int i = 0; i < actualAliasCount; ++i) {
ScopedLocalRef<jstring> alias(env, env->NewStringUTF(aliasArray[i]));
env->SetObjectArrayElement(result, i, alias.get());
@@ -622,16 +623,12 @@ static jobject NativeConverter_charsetForName(JNIEnv* env, jclass, jstring chars
}
// Construct the CharsetICU object.
- jclass charsetClass = env->FindClass("com/ibm/icu4jni/charset/CharsetICU");
- if (env->ExceptionOccurred()) {
- return NULL;
- }
- jmethodID charsetConstructor = env->GetMethodID(charsetClass, "<init>",
+ jmethodID charsetConstructor = env->GetMethodID(JniConstants::charsetICUClass, "<init>",
"(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V");
if (env->ExceptionOccurred()) {
return NULL;
}
- return env->NewObject(charsetClass, charsetConstructor,
+ return env->NewObject(JniConstants::charsetICUClass, charsetConstructor,
javaCanonicalName, env->NewStringUTF(icuCanonicalName), aliases);
}
diff --git a/luni/src/main/native/NativeDecimalFormat.cpp b/luni/src/main/native/NativeDecimalFormat.cpp
index 759a271..6fda6b1 100644
--- a/luni/src/main/native/NativeDecimalFormat.cpp
+++ b/luni/src/main/native/NativeDecimalFormat.cpp
@@ -18,6 +18,7 @@
#include "ErrorCode.h"
#include "JNIHelp.h"
+#include "JniConstants.h"
#include "ScopedJavaUnicodeString.h"
#include "ScopedPrimitiveArray.h"
#include "ScopedUtfChars.h"
@@ -229,8 +230,7 @@ static jstring toPatternImpl(JNIEnv* env, jclass, jint addr, jboolean localized)
}
static jstring formatResult(JNIEnv* env, const UnicodeString &str, FieldPositionIterator *fpi, jobject fpIter) {
- static jclass gFPIClass = env->FindClass("com/ibm/icu4jni/text/NativeDecimalFormat$FieldPositionIterator");
- static jmethodID gFPI_setData = env->GetMethodID(gFPIClass, "setData", "([I)V");
+ static jmethodID gFPI_setData = env->GetMethodID(JniConstants::fieldPositionIteratorClass, "setData", "([I)V");
if (fpi != NULL) {
int len = fpi->getData(NULL, 0);
@@ -279,8 +279,7 @@ static jstring formatDigitList(JNIEnv* env, jclass, jint addr, jstring value, jo
}
static jobject newBigDecimal(JNIEnv* env, const char* value, jsize len) {
- static jclass gBigDecimalClass = (jclass) env->NewGlobalRef(env->FindClass("java/math/BigDecimal"));
- static jmethodID gBigDecimal_init = env->GetMethodID(gBigDecimalClass, "<init>", "(Ljava/lang/String;)V");
+ static jmethodID gBigDecimal_init = env->GetMethodID(JniConstants::bigDecimalClass, "<init>", "(Ljava/lang/String;)V");
// this is painful...
// value is a UTF-8 string of invariant characters, but isn't guaranteed to be
@@ -288,29 +287,21 @@ static jobject newBigDecimal(JNIEnv* env, const char* value, jsize len) {
// data to jchars using UnicodeString, and call NewString instead.
UnicodeString tmp(value, len, UnicodeString::kInvariant);
jobject str = env->NewString(tmp.getBuffer(), tmp.length());
- return env->NewObject(gBigDecimalClass, gBigDecimal_init, str);
+ return env->NewObject(JniConstants::bigDecimalClass, gBigDecimal_init, str);
}
-static jmethodID gPP_getIndex = NULL;
-static jmethodID gPP_setIndex = NULL;
-static jmethodID gPP_setErrorIndex = NULL;
-
static jobject parse(JNIEnv* env, jclass, jint addr, jstring text,
jobject position, jboolean parseBigDecimal) {
- if (gPP_getIndex == NULL) {
- jclass ppClass = env->FindClass("java/text/ParsePosition");
- gPP_getIndex = env->GetMethodID(ppClass, "getIndex", "()I");
- gPP_setIndex = env->GetMethodID(ppClass, "setIndex", "(I)V");
- gPP_setErrorIndex = env->GetMethodID(ppClass, "setErrorIndex", "(I)V");
- }
+ static jmethodID gPP_getIndex = env->GetMethodID(JniConstants::parsePositionClass, "getIndex", "()I");
+ static jmethodID gPP_setIndex = env->GetMethodID(JniConstants::parsePositionClass, "setIndex", "(I)V");
+ static jmethodID gPP_setErrorIndex = env->GetMethodID(JniConstants::parsePositionClass, "setErrorIndex", "(I)V");
// make sure the ParsePosition is valid. Actually icu4c would parse a number
// correctly even if the parsePosition is set to -1, but since the RI fails
// for that case we have to fail too
int parsePos = env->CallIntMethod(position, gPP_getIndex, NULL);
- const int strlength = env->GetStringLength(text);
- if (parsePos < 0 || parsePos > strlength) {
+ if (parsePos < 0 || parsePos > env->GetStringLength(text)) {
return NULL;
}
diff --git a/luni/src/main/native/NativeRegEx.cpp b/luni/src/main/native/NativeRegEx.cpp
index d85270d..0f31204 100644
--- a/luni/src/main/native/NativeRegEx.cpp
+++ b/luni/src/main/native/NativeRegEx.cpp
@@ -20,13 +20,13 @@
#include <stdio.h>
#include <string.h>
+#include "JNIHelp.h"
+#include "JniConstants.h"
#include "ScopedPrimitiveArray.h"
+#include "jni.h"
+#include "unicode/parseerr.h"
#include "unicode/uregex.h"
#include "unicode/utypes.h"
-#include "unicode/parseerr.h"
-
-#include <jni.h>
-#include <JNIHelp.h>
static jchar EMPTY_STRING = 0;
@@ -45,14 +45,12 @@ struct RegExData {
static void throwPatternSyntaxException(JNIEnv* env, UErrorCode status,
jstring pattern, UParseError error)
{
- jclass clazz = env->FindClass("java/util/regex/PatternSyntaxException");
- jmethodID method = env->GetMethodID(clazz, "<init>",
- "(Ljava/lang/String;Ljava/lang/String;I)V");
-
+ jmethodID method = env->GetMethodID(JniConstants::patternSyntaxExceptionClass,
+ "<init>", "(Ljava/lang/String;Ljava/lang/String;I)V");
jstring message = env->NewStringUTF(u_errorName(status));
- jthrowable except = (jthrowable)(env->NewObject(clazz, method, message,
- pattern, error.offset));
- env->Throw(except);
+ jobject exception = env->NewObject(JniConstants::patternSyntaxExceptionClass, method,
+ message, pattern, error.offset);
+ env->Throw(reinterpret_cast<jthrowable>(exception));
}
static void throwRuntimeException(JNIEnv* env, UErrorCode status) {
diff --git a/luni/src/main/native/NetworkUtilities.cpp b/luni/src/main/native/NetworkUtilities.cpp
index ca0e122..3af30be 100644
--- a/luni/src/main/native/NetworkUtilities.cpp
+++ b/luni/src/main/native/NetworkUtilities.cpp
@@ -18,6 +18,7 @@
#include "NetworkUtilities.h"
#include "JNIHelp.h"
+#include "JniConstants.h"
#include <arpa/inet.h>
#include <stdio.h>
@@ -89,16 +90,12 @@ jobject byteArrayToInetAddress(JNIEnv* env, jbyteArray byteArray) {
if (byteArray == NULL) {
return NULL;
}
- jclass inetAddressClass = env->FindClass("java/net/InetAddress");
- if (inetAddressClass == NULL) {
- return NULL;
- }
- jmethodID getByAddressMethod = env->GetStaticMethodID(inetAddressClass,
+ jmethodID getByAddressMethod = env->GetStaticMethodID(JniConstants::inetAddressClass,
"getByAddress", "([B)Ljava/net/InetAddress;");
if (getByAddressMethod == NULL) {
return NULL;
}
- return env->CallStaticObjectMethod(inetAddressClass, getByAddressMethod, byteArray);
+ return env->CallStaticObjectMethod(JniConstants::inetAddressClass, getByAddressMethod, byteArray);
}
jobject socketAddressToInetAddress(JNIEnv* env, sockaddr_storage* ss) {
diff --git a/luni/src/main/native/Register.cpp b/luni/src/main/native/Register.cpp
index ee996c3..c2ca8ea 100644
--- a/luni/src/main/native/Register.cpp
+++ b/luni/src/main/native/Register.cpp
@@ -1,12 +1,12 @@
/*
* Copyright (C) 2010 The Android Open Source Project
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+#include "JniConstants.h"
#include "ScopedLocalFrame.h"
namespace android {
@@ -62,6 +63,8 @@ extern int register_org_openssl_NativeBN(JNIEnv* env);
extern "C" int registerCoreLibrariesJni(JNIEnv* env) {
ScopedLocalFrame localFrame(env);
+ JniConstants::init(env);
+
bool result =
register_com_ibm_icu4jni_converters_NativeConverter(env) != -1 &&
register_com_ibm_icu4jni_lang_UCharacter(env) != -1 &&
diff --git a/luni/src/main/native/java_io_File.cpp b/luni/src/main/native/java_io_File.cpp
index fa41ad2..8b5434e 100644
--- a/luni/src/main/native/java_io_File.cpp
+++ b/luni/src/main/native/java_io_File.cpp
@@ -18,6 +18,7 @@
#define LOG_TAG "File"
#include "JNIHelp.h"
+#include "JniConstants.h"
#include "LocalArray.h"
#include "ScopedFd.h"
#include "ScopedLocalRef.h"
@@ -353,11 +354,7 @@ static jobjectArray java_io_File_listImpl(JNIEnv* env, jobject, jbyteArray pathB
return NULL;
}
// Translate the intermediate form into a Java String[].
- jclass stringClass = env->FindClass("java/lang/String");
- if (stringClass == NULL) {
- return NULL;
- }
- jobjectArray result = env->NewObjectArray(files.size(), stringClass, NULL);
+ jobjectArray result = env->NewObjectArray(files.size(), JniConstants::stringClass, NULL);
for (int i = 0; files.size() != 0; files.pop_front(), ++i) {
ScopedLocalRef<jstring> javaFilename(env, env->NewStringUTF(files.front()));
if (env->ExceptionCheck()) {
diff --git a/luni/src/main/native/java_io_FileDescriptor.c b/luni/src/main/native/java_io_FileDescriptor.c
index 075e19b..878e836 100644
--- a/luni/src/main/native/java_io_FileDescriptor.c
+++ b/luni/src/main/native/java_io_FileDescriptor.c
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+
#include "JNIHelp.h"
#include <stdlib.h>
@@ -117,16 +117,16 @@ static int checkClassInit (JNIEnv *env) {
jclass clazz;
clazz = (*env)->FindClass(env, "java/io/FileDescriptor");
if(clazz == NULL) {
- jniThrowException(env, "java/lang/ClassNotFoundException",
+ jniThrowException(env, "java/lang/ClassNotFoundException",
"java.io.FileDescriptor");
return -1;
}
jfieldID readWriteId;
- readWriteId = (*env)->GetStaticFieldID(env, clazz, "in",
+ readWriteId = (*env)->GetStaticFieldID(env, clazz, "in",
"Ljava/io/FileDescriptor;");
if(readWriteId == NULL) {
- jniThrowException(env, "java/lang/NoSuchFieldException",
+ jniThrowException(env, "java/lang/NoSuchFieldException",
"FileDescriptor.readOnly(Z)");
return -1;
}
@@ -153,13 +153,13 @@ jobject jniCreateFileDescriptor (JNIEnv *env, int fd) {
ret = (*env)->NewObject(env, gCachedFields.clazz,
gCachedFields.constructorInt);
-
+
(*env)->SetIntField(env, ret, gCachedFields.descriptor, fd);
return ret;
}
-/*
+/*
* For JNIHelp.c
* Get an int file descriptor from a java.io.FileDescriptor
*/
diff --git a/luni/src/main/native/java_io_ObjectStreamClass.cpp b/luni/src/main/native/java_io_ObjectStreamClass.cpp
index 395e39f..3799f3a 100644
--- a/luni/src/main/native/java_io_ObjectStreamClass.cpp
+++ b/luni/src/main/native/java_io_ObjectStreamClass.cpp
@@ -18,87 +18,40 @@
#define LOG_TAG "ObjectStreamClass"
#include "JNIHelp.h"
+#include "JniConstants.h"
-static jobject java_io_osc_getFieldSignature(JNIEnv* env, jclass,
- jobject reflectField) {
- jclass lookupClass;
- jmethodID mid;
-
- lookupClass = env->FindClass("java/lang/reflect/Field");
- if(!lookupClass) {
+static jobject getSignature(JNIEnv* env, jclass c, jobject object) {
+ jmethodID mid = env->GetMethodID(c, "getSignature", "()Ljava/lang/String;");
+ if (!mid) {
return NULL;
}
-
- mid = env->GetMethodID(lookupClass, "getSignature",
- "()Ljava/lang/String;");
- if(!mid)
- {
- return NULL;
- }
-
- jclass fieldClass = env->GetObjectClass(reflectField);
-
- return env->CallNonvirtualObjectMethod(reflectField,
- fieldClass, mid);
+ jclass objectClass = env->GetObjectClass(object);
+ return env->CallNonvirtualObjectMethod(object, objectClass, mid);
}
-static jobject java_io_osc_getMethodSignature(JNIEnv* env, jclass,
- jobject reflectMethod)
-{
- jclass lookupClass;
- jmethodID mid;
-
- lookupClass = env->FindClass("java/lang/reflect/Method");
- if(!lookupClass) {
- return NULL;
- }
-
- mid = env->GetMethodID(lookupClass, "getSignature",
- "()Ljava/lang/String;");
- if(!mid) {
- return NULL;
- }
-
- jclass methodClass = env->GetObjectClass(reflectMethod);
- return env->CallNonvirtualObjectMethod(reflectMethod,
- methodClass, mid);
+static jobject ObjectStreamClass_getFieldSignature(JNIEnv* env, jclass, jobject field) {
+ return getSignature(env, JniConstants::fieldClass, field);
}
-static jobject java_io_osc_getConstructorSignature(JNIEnv* env,
- jclass,
- jobject
- reflectConstructor)
-{
- jclass lookupClass;
- jmethodID mid;
-
- lookupClass = env->FindClass("java/lang/reflect/Constructor");
- if(!lookupClass) {
- return NULL;
- }
-
- mid = env->GetMethodID(lookupClass, "getSignature",
- "()Ljava/lang/String;");
- if(!mid) {
- return NULL;
- }
+static jobject ObjectStreamClass_getMethodSignature(JNIEnv* env, jclass, jobject method) {
+ return getSignature(env, JniConstants::methodClass, method);
+}
- jclass constructorClass = env->GetObjectClass(reflectConstructor);
- return env->CallNonvirtualObjectMethod(reflectConstructor,
- constructorClass, mid);
+static jobject ObjectStreamClass_getConstructorSignature(JNIEnv* env, jclass, jobject constructor) {
+ return getSignature(env, JniConstants::constructorClass, constructor);
}
-static jboolean java_io_osc_hasClinit(JNIEnv * env, jclass, jclass targetClass) {
+static jboolean ObjectStreamClass_hasClinit(JNIEnv * env, jclass, jclass targetClass) {
jmethodID mid = env->GetStaticMethodID(targetClass, "<clinit>", "()V");
env->ExceptionClear();
return (mid != 0);
}
static JNINativeMethod gMethods[] = {
- { "getConstructorSignature", "(Ljava/lang/reflect/Constructor;)Ljava/lang/String;", (void*) java_io_osc_getConstructorSignature },
- { "getFieldSignature", "(Ljava/lang/reflect/Field;)Ljava/lang/String;", (void*) java_io_osc_getFieldSignature },
- { "getMethodSignature", "(Ljava/lang/reflect/Method;)Ljava/lang/String;", (void*) java_io_osc_getMethodSignature },
- { "hasClinit", "(Ljava/lang/Class;)Z", (void*) java_io_osc_hasClinit },
+ { "getConstructorSignature", "(Ljava/lang/reflect/Constructor;)Ljava/lang/String;", (void*) ObjectStreamClass_getConstructorSignature },
+ { "getFieldSignature", "(Ljava/lang/reflect/Field;)Ljava/lang/String;", (void*) ObjectStreamClass_getFieldSignature },
+ { "getMethodSignature", "(Ljava/lang/reflect/Method;)Ljava/lang/String;", (void*) ObjectStreamClass_getMethodSignature },
+ { "hasClinit", "(Ljava/lang/Class;)Z", (void*) ObjectStreamClass_hasClinit },
};
int register_java_io_ObjectStreamClass(JNIEnv* env) {
return jniRegisterNativeMethods(env, "java/io/ObjectStreamClass", gMethods, NELEM(gMethods));
diff --git a/luni/src/main/native/java_lang_ProcessManager.cpp b/luni/src/main/native/java_lang_ProcessManager.cpp
index c113c0f..e828342 100644
--- a/luni/src/main/native/java_lang_ProcessManager.cpp
+++ b/luni/src/main/native/java_lang_ProcessManager.cpp
@@ -28,6 +28,7 @@
#include "jni.h"
#include "JNIHelp.h"
+#include "JniConstants.h"
#include "utils/Log.h"
/** Environment variables. */
@@ -353,7 +354,7 @@ static pid_t java_lang_ProcessManager_exec(
char** environment = convertStrings(env, javaEnvironment);
pid_t result = executeProcess(
- env, commands, environment, workingDirectory,
+ env, commands, environment, workingDirectory,
inDescriptor, outDescriptor, errDescriptor, redirectErrorStream);
// Temporarily clear exception so we can clean up.
@@ -396,11 +397,7 @@ static void java_lang_ProcessManager_staticInitialize(JNIEnv* env,
return;
}
- jclass fileDescriptorClass = env->FindClass("java/io/FileDescriptor");
- if (fileDescriptorClass == NULL) {
- return;
- }
- descriptorField = env->GetFieldID(fileDescriptorClass, "descriptor", "I");
+ descriptorField = env->GetFieldID(JniConstants::fileDescriptorClass, "descriptor", "I");
if (descriptorField == NULL) {
return;
}
diff --git a/luni/src/main/native/java_net_InetAddress.cpp b/luni/src/main/native/java_net_InetAddress.cpp
index 304c8d4..64c6764 100644
--- a/luni/src/main/native/java_net_InetAddress.cpp
+++ b/luni/src/main/native/java_net_InetAddress.cpp
@@ -19,12 +19,13 @@
#define LOG_DNS 0
#include "JNIHelp.h"
+#include "JniConstants.h"
#include "LocalArray.h"
#include "NetworkUtilities.h"
#include "ScopedLocalRef.h"
#include "ScopedUtfChars.h"
-#include "utils/Log.h"
#include "jni.h"
+#include "utils/Log.h"
#include <stdio.h>
#include <string.h>
@@ -35,9 +36,6 @@
#include <arpa/inet.h>
#include <sys/socket.h>
-
-static jclass byteArrayClass = NULL;
-
static jstring InetAddress_gethostname(JNIEnv* env, jclass)
{
char name[256];
@@ -98,7 +96,7 @@ static jobjectArray InetAddress_getaddrinfo(JNIEnv* env, jclass, jstring javaNam
}
// Prepare output array.
- addressArray = env->NewObjectArray(addressCount, byteArrayClass, NULL);
+ addressArray = env->NewObjectArray(addressCount, JniConstants::byteArrayClass, NULL);
if (addressArray == NULL) {
// Appropriate exception will be thrown.
LOGE("getaddrinfo: could not allocate array of size %i", addressCount);
@@ -335,14 +333,5 @@ static JNINativeMethod gMethods[] = {
{ "ipStringToByteArray", "(Ljava/lang/String;)[B", (void*) InetAddress_ipStringToByteArray },
};
int register_java_net_InetAddress(JNIEnv* env) {
- jclass tempClass = env->FindClass("[B");
- if (tempClass) {
- byteArrayClass = (jclass) env->NewGlobalRef(tempClass);
- }
- if (!byteArrayClass) {
- LOGE("register_java_net_InetAddress: cannot allocate byte array class");
- return -1;
- }
- return jniRegisterNativeMethods(env, "java/net/InetAddress",
- gMethods, NELEM(gMethods));
+ return jniRegisterNativeMethods(env, "java/net/InetAddress", gMethods, NELEM(gMethods));
}
diff --git a/luni/src/main/native/java_net_NetworkInterface.cpp b/luni/src/main/native/java_net_NetworkInterface.cpp
index 6a0d342..71e59e7 100644
--- a/luni/src/main/native/java_net_NetworkInterface.cpp
+++ b/luni/src/main/native/java_net_NetworkInterface.cpp
@@ -18,6 +18,7 @@
#define LOG_TAG "NetworkInterface"
#include "JNIHelp.h"
+#include "JniConstants.h"
#include "jni.h"
#include "NetworkUtilities.h"
#include "ScopedFd.h"
@@ -69,11 +70,7 @@ static void jniThrowSocketException(JNIEnv* env) {
}
static jobject makeInterfaceAddress(JNIEnv* env, jint interfaceIndex, ifaddrs* ifa) {
- jclass clazz = env->FindClass("java/net/InterfaceAddress");
- if (clazz == NULL) {
- return NULL;
- }
- jmethodID constructor = env->GetMethodID(clazz, "<init>",
+ jmethodID constructor = env->GetMethodID(JniConstants::interfaceAddressClass, "<init>",
"(ILjava/lang/String;Ljava/net/InetAddress;Ljava/net/InetAddress;)V");
if (constructor == NULL) {
return NULL;
@@ -92,7 +89,8 @@ static jobject makeInterfaceAddress(JNIEnv* env, jint interfaceIndex, ifaddrs* i
if (javaMask == NULL) {
return NULL;
}
- return env->NewObject(clazz, constructor, interfaceIndex, javaName, javaAddress, javaMask);
+ return env->NewObject(JniConstants::interfaceAddressClass, constructor,
+ interfaceIndex, javaName, javaAddress, javaMask);
}
static jobjectArray getAllInterfaceAddressesImpl(JNIEnv* env, jclass) {
@@ -110,11 +108,8 @@ static jobjectArray getAllInterfaceAddressesImpl(JNIEnv* env, jclass) {
}
// Build the InterfaceAddress[]...
- jclass interfaceAddressClass = env->FindClass("java/net/InterfaceAddress");
- if (interfaceAddressClass == NULL) {
- return NULL;
- }
- jobjectArray result = env->NewObjectArray(interfaceAddressCount, interfaceAddressClass, NULL);
+ jobjectArray result =
+ env->NewObjectArray(interfaceAddressCount, JniConstants::interfaceAddressClass, NULL);
if (result == NULL) {
return NULL;
}
diff --git a/luni/src/main/native/java_util_zip_Deflater.cpp b/luni/src/main/native/java_util_zip_Deflater.cpp
index 924cd61..7255bcd 100644
--- a/luni/src/main/native/java_util_zip_Deflater.cpp
+++ b/luni/src/main/native/java_util_zip_Deflater.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "Deflater"
+#include "JniConstants.h"
#include "ScopedPrimitiveArray.h"
#include "zip.h"
@@ -143,8 +144,7 @@ static JNINativeMethod gMethods[] = {
{ "setLevelsImpl", "(IIJ)V", (void*) Deflater_setLevelsImpl },
};
int register_java_util_zip_Deflater(JNIEnv* env) {
- jclass deflaterClass = env->FindClass("java/util/zip/Deflater");
- gCachedFields.finished = env->GetFieldID(deflaterClass, "finished", "Z");
- gCachedFields.inRead = env->GetFieldID(deflaterClass, "inRead", "I");
+ gCachedFields.finished = env->GetFieldID(JniConstants::deflaterClass, "finished", "Z");
+ gCachedFields.inRead = env->GetFieldID(JniConstants::deflaterClass, "inRead", "I");
return jniRegisterNativeMethods(env, "java/util/zip/Deflater", gMethods, NELEM(gMethods));
}
diff --git a/luni/src/main/native/java_util_zip_Inflater.cpp b/luni/src/main/native/java_util_zip_Inflater.cpp
index 4fb884e..63a0140 100644
--- a/luni/src/main/native/java_util_zip_Inflater.cpp
+++ b/luni/src/main/native/java_util_zip_Inflater.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "Inflater"
+#include "JniConstants.h"
#include "ScopedPrimitiveArray.h"
#include "zip.h"
#include <errno.h>
@@ -179,9 +180,8 @@ static JNINativeMethod gMethods[] = {
{ "setInputImpl", "([BIIJ)V", (void*) Inflater_setInputImpl },
};
int register_java_util_zip_Inflater(JNIEnv* env) {
- jclass inflaterClass = env->FindClass("java/util/zip/Inflater");
- gCachedFields.finished = env->GetFieldID(inflaterClass, "finished", "Z");
- gCachedFields.inRead = env->GetFieldID(inflaterClass, "inRead", "I");
- gCachedFields.needsDictionary = env->GetFieldID(inflaterClass, "needsDictionary", "Z");
+ gCachedFields.finished = env->GetFieldID(JniConstants::inflaterClass, "finished", "Z");
+ gCachedFields.inRead = env->GetFieldID(JniConstants::inflaterClass, "inRead", "I");
+ gCachedFields.needsDictionary = env->GetFieldID(JniConstants::inflaterClass, "needsDictionary", "Z");
return jniRegisterNativeMethods(env, "java/util/zip/Inflater", gMethods, NELEM(gMethods));
}
diff --git a/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp b/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp
index 8c8a864..edfaba0 100644
--- a/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp
+++ b/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "OSMemory"
#include "JNIHelp.h"
+#include "JniConstants.h"
#include "utils/misc.h"
#include "utils/Log.h"
#include <sys/mman.h>
@@ -107,7 +108,7 @@ static void harmony_nio_freeImpl(JNIEnv* _env, jobject, jint pointer) {
* Method: memset
* Signature: (IBJ)V
*/
-static void harmony_nio_memset(JNIEnv*, jobject, jint address,
+static void harmony_nio_memset(JNIEnv*, jobject, jint address,
jbyte value, jlong length) {
memset ((void *) ((jint) address), (jbyte) value, (jlong) length);
}
@@ -117,9 +118,9 @@ static void harmony_nio_memset(JNIEnv*, jobject, jint address,
* Method: memmove
* Signature: (IIJ)V
*/
-static void harmony_nio_memmove(JNIEnv*, jobject, jint destAddress,
+static void harmony_nio_memmove(JNIEnv*, jobject, jint destAddress,
jint srcAddress, jlong length) {
- memmove ((void *) ((jint) destAddress), (const void *) ((jint) srcAddress),
+ memmove ((void *) ((jint) destAddress), (const void *) ((jint) srcAddress),
(jlong) length);
}
@@ -128,7 +129,7 @@ static void harmony_nio_memmove(JNIEnv*, jobject, jint destAddress,
* Method: getByteImpl
* Signature: (I)B
*/
-static jbyte harmony_nio_getByteImpl(JNIEnv*, jobject,
+static jbyte harmony_nio_getByteImpl(JNIEnv*, jobject,
jint pointer) {
jbyte returnValue = *((jbyte *)pointer);
return returnValue;
@@ -139,7 +140,7 @@ static jbyte harmony_nio_getByteImpl(JNIEnv*, jobject,
* Method: getBytesImpl
* Signature: (I[BII)V
*/
-static void harmony_nio_getBytesImpl(JNIEnv* _env, jobject, jint pointer,
+static void harmony_nio_getBytesImpl(JNIEnv* _env, jobject, jint pointer,
jbyteArray dst, jint offset, jint length) {
jbyte* src = reinterpret_cast<jbyte*>(static_cast<uintptr_t>(pointer));
_env->SetByteArrayRegion(dst, offset, length, src);
@@ -227,7 +228,7 @@ static void harmony_nio_setIntArrayImpl(JNIEnv* _env, jobject,
* Method: getShortImpl
* Signature: (I)S
*/
-static jshort harmony_nio_getShortImpl(JNIEnv*, jobject,
+static jshort harmony_nio_getShortImpl(JNIEnv*, jobject,
jint pointer) {
if ((pointer & 0x1) == 0) {
jshort returnValue = *((jshort *)pointer);
@@ -248,7 +249,7 @@ static jshort harmony_nio_getShortImpl(JNIEnv*, jobject,
* Method: petShortImpl
* Signature: (IS)V
*/
-static void harmony_nio_putShortImpl(JNIEnv*, jobject, jint pointer,
+static void harmony_nio_putShortImpl(JNIEnv*, jobject, jint pointer,
jshort value) {
if ((pointer & 0x1) == 0) {
*((jshort *)pointer) = value;
@@ -288,7 +289,7 @@ static jint harmony_nio_getIntImpl(JNIEnv*, jobject, jint pointer) {
* Method: putIntImpl
* Signature: (II)V
*/
-static void harmony_nio_putIntImpl(JNIEnv*, jobject, jint pointer,
+static void harmony_nio_putIntImpl(JNIEnv*, jobject, jint pointer,
jint value) {
if ((pointer & 0x3) == 0) {
*((jint *)pointer) = value;
@@ -308,7 +309,7 @@ static void harmony_nio_putIntImpl(JNIEnv*, jobject, jint pointer,
* Method: getLongImpl
* Signature: (I)Ljava/lang/Long;
*/
-static jlong harmony_nio_getLongImpl(JNIEnv*, jobject,
+static jlong harmony_nio_getLongImpl(JNIEnv*, jobject,
jint pointer) {
if ((pointer & 0x7) == 0) {
jlong returnValue = *((jlong *)pointer);
@@ -326,7 +327,7 @@ static jlong harmony_nio_getLongImpl(JNIEnv*, jobject,
* Method: putLongImpl
* Signature: (IJ)V
*/
-static void harmony_nio_putLongImpl(JNIEnv*, jobject, jint pointer,
+static void harmony_nio_putLongImpl(JNIEnv*, jobject, jint pointer,
jlong value) {
if ((pointer & 0x7) == 0) {
*((jlong *)pointer) = value;
@@ -341,7 +342,7 @@ static void harmony_nio_putLongImpl(JNIEnv*, jobject, jint pointer,
* Method: getFloatImpl
* Signature: (I)F
*/
-static jfloat harmony_nio_getFloatImpl(JNIEnv*, jobject,
+static jfloat harmony_nio_getFloatImpl(JNIEnv*, jobject,
jint pointer) {
if ((pointer & 0x3) == 0) {
jfloat returnValue = *((jfloat *)pointer);
@@ -359,7 +360,7 @@ static jfloat harmony_nio_getFloatImpl(JNIEnv*, jobject,
* Method: setFloatImpl
* Signature: (IF)V
*/
-static void harmony_nio_putFloatImpl(JNIEnv*, jobject, jint pointer,
+static void harmony_nio_putFloatImpl(JNIEnv*, jobject, jint pointer,
jfloat value) {
if ((pointer & 0x3) == 0) {
*((jfloat *)pointer) = value;
@@ -374,7 +375,7 @@ static void harmony_nio_putFloatImpl(JNIEnv*, jobject, jint pointer,
* Method: getDoubleImpl
* Signature: (I)D
*/
-static jdouble harmony_nio_getDoubleImpl(JNIEnv*, jobject,
+static jdouble harmony_nio_getDoubleImpl(JNIEnv*, jobject,
jint pointer) {
if ((pointer & 0x7) == 0) {
jdouble returnValue = *((jdouble *)pointer);
@@ -392,7 +393,7 @@ static jdouble harmony_nio_getDoubleImpl(JNIEnv*, jobject,
* Method: putDoubleImpl
* Signature: (ID)V
*/
-static void harmony_nio_putDoubleImpl(JNIEnv*, jobject, jint pointer,
+static void harmony_nio_putDoubleImpl(JNIEnv*, jobject, jint pointer,
jdouble value) {
if ((pointer & 0x7) == 0) {
*((jdouble *)pointer) = value;
@@ -416,7 +417,7 @@ static jint harmony_nio_getAddress(JNIEnv*, jobject, jint pointer) {
* Method: setAddress
* Signature: (II)V
*/
-static void harmony_nio_setAddress(JNIEnv*, jobject, jint pointer,
+static void harmony_nio_setAddress(JNIEnv*, jobject, jint pointer,
jint value) {
*(int *) pointer = (int) value;
}
@@ -426,7 +427,7 @@ static void harmony_nio_setAddress(JNIEnv*, jobject, jint pointer,
* Method: mmapImpl
* Signature: (IJJI)I
*/
-static jint harmony_nio_mmapImpl(JNIEnv* env, jobject, jint fd,
+static jint harmony_nio_mmapImpl(JNIEnv* env, jobject, jint fd,
jlong offset, jlong size, jint mapMode) {
int prot, flags;
switch (mapMode) {
@@ -460,7 +461,7 @@ static jint harmony_nio_mmapImpl(JNIEnv* env, jobject, jint fd,
* Method: unmapImpl
* Signature: (IJ)V
*/
-static void harmony_nio_unmapImpl(JNIEnv*, jobject, jint address,
+static void harmony_nio_unmapImpl(JNIEnv*, jobject, jint address,
jlong size) {
munmap((void *)address, (size_t)size);
}
@@ -470,7 +471,7 @@ static void harmony_nio_unmapImpl(JNIEnv*, jobject, jint address,
* Method: loadImpl
* Signature: (IJ)I
*/
-static jint harmony_nio_loadImpl(JNIEnv*, jobject, jint address,
+static jint harmony_nio_loadImpl(JNIEnv*, jobject, jint address,
jlong size) {
if(mlock((void *)address, (size_t)size)!=-1) {
@@ -484,7 +485,7 @@ static jint harmony_nio_loadImpl(JNIEnv*, jobject, jint address,
return 0;
}
}
-
+
return -1;
}
@@ -493,20 +494,20 @@ static jint harmony_nio_loadImpl(JNIEnv*, jobject, jint address,
* Method: isLoadedImpl
* Signature: (IJ)Z
*/
-static jboolean harmony_nio_isLoadedImpl(JNIEnv*, jobject,
+static jboolean harmony_nio_isLoadedImpl(JNIEnv*, jobject,
jint address, jlong size) {
static int page_size = getpagesize();
jboolean result = 0;
jint m_addr = (jint)address;
-
+
int align_offset = m_addr%page_size;// addr should align with the boundary of a page.
m_addr -= align_offset;
size += align_offset;
int page_count = (size+page_size-1)/page_size;
-
+
unsigned char* vec = (unsigned char *) malloc(page_count*sizeof(char));
-
+
if (mincore((void *)m_addr, size, (MINCORE_POINTER_TYPE) vec)==0) {
// or else there is error about the mincore and return false;
int i;
@@ -519,9 +520,9 @@ static jboolean harmony_nio_isLoadedImpl(JNIEnv*, jobject,
result = 1;
}
}
-
+
free(vec);
-
+
return result;
}
@@ -570,20 +571,12 @@ int register_org_apache_harmony_luni_platform_OSMemory(JNIEnv* env) {
* We need to call VMRuntime.trackExternal{Allocation,Free}. Cache
* method IDs and a reference to the singleton.
*/
- static const char* kVMRuntimeName = "dalvik/system/VMRuntime";
- jmethodID method_getRuntime;
- jclass clazz;
-
- clazz = env->FindClass(kVMRuntimeName);
- if (clazz == NULL) {
- LOGE("Unable to find class %s\n", kVMRuntimeName);
- return -1;
- }
- gIDCache.method_trackExternalAllocation = env->GetMethodID(clazz,
+ gIDCache.method_trackExternalAllocation = env->GetMethodID(JniConstants::vmRuntimeClass,
"trackExternalAllocation", "(J)Z");
- gIDCache.method_trackExternalFree = env->GetMethodID(clazz,
+ gIDCache.method_trackExternalFree = env->GetMethodID(JniConstants::vmRuntimeClass,
"trackExternalFree", "(J)V");
- method_getRuntime = env->GetStaticMethodID(clazz,
+
+ jmethodID method_getRuntime = env->GetStaticMethodID(JniConstants::vmRuntimeClass,
"getRuntime", "()Ldalvik/system/VMRuntime;");
if (gIDCache.method_trackExternalAllocation == NULL ||
@@ -594,7 +587,7 @@ int register_org_apache_harmony_luni_platform_OSMemory(JNIEnv* env) {
return -1;
}
- jobject instance = env->CallStaticObjectMethod(clazz, method_getRuntime);
+ jobject instance = env->CallStaticObjectMethod(JniConstants::vmRuntimeClass, method_getRuntime);
if (instance == NULL) {
LOGE("Unable to obtain VMRuntime instance\n");
return -1;
diff --git a/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp b/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp
index b03f374..3d6037a 100644
--- a/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp
+++ b/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp
@@ -24,6 +24,7 @@
#define LOG_TAG "OSNetworkSystem"
#include "JNIHelp.h"
+#include "JniConstants.h"
#include "LocalArray.h"
#include "NetworkUtilities.h"
#include "ScopedPrimitiveArray.h"
@@ -95,22 +96,13 @@
#define SOCKET_NOFLAGS 0
static struct CachedFields {
- jfieldID fd_descriptor;
- jclass iaddr_class;
- jclass i4addr_class;
jfieldID iaddr_ipaddress;
- jclass genericipmreq_class;
- jclass integer_class;
jfieldID integer_class_value;
- jclass boolean_class;
jfieldID boolean_class_value;
- jclass byte_class;
jfieldID byte_class_value;
- jclass socketimpl_class;
jfieldID socketimpl_address;
jfieldID socketimpl_port;
jfieldID socketimpl_localport;
- jclass dpack_class;
jfieldID dpack_address;
jfieldID dpack_port;
jfieldID dpack_length;
@@ -600,7 +592,7 @@ static void mcastAddDropMembership(JNIEnv *env, int handle, jobject optVal, int
* is passed in, only support IPv4 as obtaining an interface from an
* InetAddress is complex and should be done by the Java caller.
*/
- if (env->IsInstanceOf(optVal, gCachedFields.iaddr_class)) {
+ if (env->IsInstanceOf(optVal, JniConstants::inetAddressClass)) {
/*
* optVal is an InetAddress. Construct a multicast request structure
* from this address. Support IPv4 only.
@@ -641,12 +633,11 @@ static void mcastAddDropMembership(JNIEnv *env, int handle, jobject optVal, int
*/
// Get the multicast address to join or leave.
- jclass cls = env->GetObjectClass(optVal);
- jfieldID multiaddrID = env->GetFieldID(cls, "multiaddr", "Ljava/net/InetAddress;");
+ jfieldID multiaddrID = env->GetFieldID(JniConstants::genericIPMreqClass, "multiaddr", "Ljava/net/InetAddress;");
jobject multiaddr = env->GetObjectField(optVal, multiaddrID);
// Get the interface index to use.
- jfieldID interfaceIdxID = env->GetFieldID(cls, "interfaceIdx", "I");
+ jfieldID interfaceIdxID = env->GetFieldID(JniConstants::genericIPMreqClass, "interfaceIdx", "I");
interfaceIndex = env->GetIntField(optVal, interfaceIdxID);
LOGI("mcastAddDropMembership interfaceIndex=%i", interfaceIndex);
@@ -712,42 +703,22 @@ static bool initCachedFields(JNIEnv* env) {
memset(&gCachedFields, 0, sizeof(gCachedFields));
struct CachedFields *c = &gCachedFields;
- struct classInfo {
- jclass *clazz;
- const char *name;
- } classes[] = {
- {&c->iaddr_class, "java/net/InetAddress"},
- {&c->i4addr_class, "java/net/Inet4Address"},
- {&c->genericipmreq_class, "org/apache/harmony/luni/net/GenericIPMreq"},
- {&c->integer_class, "java/lang/Integer"},
- {&c->boolean_class, "java/lang/Boolean"},
- {&c->byte_class, "java/lang/Byte"},
- {&c->socketimpl_class, "java/net/SocketImpl"},
- {&c->dpack_class, "java/net/DatagramPacket"}
- };
- for (unsigned i = 0; i < sizeof(classes) / sizeof(classes[0]); i++) {
- classInfo c = classes[i];
- jclass tempClass = env->FindClass(c.name);
- if (tempClass == NULL) return false;
- *c.clazz = (jclass) env->NewGlobalRef(tempClass);
- }
-
struct fieldInfo {
jfieldID *field;
jclass clazz;
const char *name;
const char *type;
} fields[] = {
- {&c->iaddr_ipaddress, c->iaddr_class, "ipaddress", "[B"},
- {&c->integer_class_value, c->integer_class, "value", "I"},
- {&c->boolean_class_value, c->boolean_class, "value", "Z"},
- {&c->byte_class_value, c->byte_class, "value", "B"},
- {&c->socketimpl_port, c->socketimpl_class, "port", "I"},
- {&c->socketimpl_localport, c->socketimpl_class, "localport", "I"},
- {&c->socketimpl_address, c->socketimpl_class, "address", "Ljava/net/InetAddress;"},
- {&c->dpack_address, c->dpack_class, "address", "Ljava/net/InetAddress;"},
- {&c->dpack_port, c->dpack_class, "port", "I"},
- {&c->dpack_length, c->dpack_class, "length", "I"}
+ {&c->iaddr_ipaddress, JniConstants::inetAddressClass, "ipaddress", "[B"},
+ {&c->integer_class_value, JniConstants::integerClass, "value", "I"},
+ {&c->boolean_class_value, JniConstants::booleanClass, "value", "Z"},
+ {&c->byte_class_value, JniConstants::byteClass, "value", "B"},
+ {&c->socketimpl_port, JniConstants::socketImplClass, "port", "I"},
+ {&c->socketimpl_localport, JniConstants::socketImplClass, "localport", "I"},
+ {&c->socketimpl_address, JniConstants::socketImplClass, "address", "Ljava/net/InetAddress;"},
+ {&c->dpack_address, JniConstants::datagramPacketClass, "address", "Ljava/net/InetAddress;"},
+ {&c->dpack_port, JniConstants::datagramPacketClass, "port", "I"},
+ {&c->dpack_length, JniConstants::datagramPacketClass, "length", "I"}
};
for (unsigned i = 0; i < sizeof(fields) / sizeof(fields[0]); i++) {
fieldInfo f = fields[i];
@@ -1746,13 +1717,13 @@ static void osNetworkSystem_setSocketOption(JNIEnv* env, jobject, jobject fileDe
}
int intVal;
- if (env->IsInstanceOf(optVal, gCachedFields.integer_class)) {
+ if (env->IsInstanceOf(optVal, JniConstants::integerClass)) {
intVal = (int) env->GetIntField(optVal, gCachedFields.integer_class_value);
- } else if (env->IsInstanceOf(optVal, gCachedFields.boolean_class)) {
+ } else if (env->IsInstanceOf(optVal, JniConstants::booleanClass)) {
intVal = (int) env->GetBooleanField(optVal, gCachedFields.boolean_class_value);
- } else if (env->IsInstanceOf(optVal, gCachedFields.byte_class)) {
+ } else if (env->IsInstanceOf(optVal, JniConstants::byteClass)) {
intVal = (int) env->GetByteField(optVal, gCachedFields.byte_class_value);
- } else if (env->IsInstanceOf(optVal, gCachedFields.genericipmreq_class) || env->IsInstanceOf(optVal, gCachedFields.iaddr_class)) {
+ } else if (env->IsInstanceOf(optVal, JniConstants::genericIPMreqClass) || env->IsInstanceOf(optVal, JniConstants::inetAddressClass)) {
// we'll use optVal directly
} else {
jniThrowSocketException(env, EINVAL);
@@ -1822,7 +1793,7 @@ static void osNetworkSystem_setSocketOption(JNIEnv* env, jobject, jobject fileDe
case JAVASOCKOPT_IP_MULTICAST_IF:
{
struct sockaddr_storage sockVal;
- if (!env->IsInstanceOf(optVal, gCachedFields.iaddr_class) ||
+ if (!env->IsInstanceOf(optVal, JniConstants::inetAddressClass) ||
!inetAddressToSocketAddress(env, optVal, 0, &sockVal)) {
return;
}
diff --git a/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp b/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp
index fbc99d3..087f2da 100644
--- a/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp
+++ b/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "ExpatParser"
#include "JNIHelp.h"
+#include "JniConstants.h"
#include "LocalArray.h"
#include "ScopedLocalRef.h"
#include "ScopedPrimitiveArray.h"
@@ -108,7 +109,6 @@ static jmethodID startElementMethod;
static jmethodID startNamespaceMethod;
static jmethodID textMethod;
static jmethodID unparsedEntityDeclMethod;
-static jclass stringClass;
static jstring emptyString;
/**
@@ -1379,11 +1379,7 @@ static void staticInitialize(JNIEnv* env, jobject classObject, jstring empty) {
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
if (unparsedEntityDeclMethod == NULL) return;
- // Look up String class.
- stringClass = env->FindClass("java/lang/String");
-
- internMethod = env->GetMethodID(stringClass, "intern",
- "()Ljava/lang/String;");
+ internMethod = env->GetMethodID(JniConstants::stringClass, "intern", "()Ljava/lang/String;");
if (internMethod == NULL) return;
// Reference to "".
diff --git a/luni/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp b/luni/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp
index 9b0f56b..96ef89c 100644
--- a/luni/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp
+++ b/luni/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp
@@ -26,9 +26,6 @@
#include <jni.h>
-#include <JNIHelp.h>
-#include <LocalArray.h>
-
#include <openssl/dsa.h>
#include <openssl/err.h>
#include <openssl/evp.h>
@@ -36,6 +33,9 @@
#include <openssl/rsa.h>
#include <openssl/ssl.h>
+#include "JNIHelp.h"
+#include "JniConstants.h"
+#include "LocalArray.h"
#include "ScopedLocalRef.h"
#include "ScopedPrimitiveArray.h"
#include "ScopedUtfChars.h"
@@ -991,8 +991,7 @@ static void info_callback_LOG(const SSL* s __attribute__ ((unused)), int where,
/**
* Returns an array containing all the X509 certificate's bytes.
*/
-static jobjectArray getCertificateBytes(JNIEnv* env,
- const STACK_OF(X509)* chain)
+static jobjectArray getCertificateBytes(JNIEnv* env, const STACK_OF(X509)* chain)
{
if (chain == NULL) {
// Chain can be NULL if the associated cipher doesn't do certs.
@@ -1004,7 +1003,7 @@ static jobjectArray getCertificateBytes(JNIEnv* env,
return NULL;
}
- jobjectArray joa = env->NewObjectArray(count, env->FindClass("[B"), NULL);
+ jobjectArray joa = env->NewObjectArray(count, JniConstants::byteArrayClass, NULL);
if (joa == NULL) {
return NULL;
}
@@ -2922,24 +2921,16 @@ int register_org_apache_harmony_xnet_provider_jsse_NativeCrypto(JNIEnv* env) {
}
// java.net.Socket
- jclass socket = env->FindClass("java/net/Socket");
- if (socket == NULL) {
- LOGE("Can't find class java.net.Socket");
- return -1;
- }
- field_Socket_mImpl = env->GetFieldID(socket, "impl", "Ljava/net/SocketImpl;");
+ field_Socket_mImpl =
+ env->GetFieldID(JniConstants::socketClass, "impl", "Ljava/net/SocketImpl;");
if (field_Socket_mImpl == NULL) {
LOGE("Can't find field impl in class java.net.Socket");
return -1;
}
// java.net.SocketImpl
- jclass socketImplClass = env->FindClass("java/net/SocketImpl");
- if (socketImplClass == NULL) {
- LOGE("Can't find class java.net.SocketImpl");
- return -1;
- }
- field_Socket_mFD = env->GetFieldID(socketImplClass, "fd", "Ljava/io/FileDescriptor;");
+ field_Socket_mFD =
+ env->GetFieldID(JniConstants::socketImplClass, "fd", "Ljava/io/FileDescriptor;");
if (field_Socket_mFD == NULL) {
LOGE("Can't find field fd in java.net.SocketImpl");
return -1;
diff --git a/luni/src/main/native/sub.mk b/luni/src/main/native/sub.mk
index 1c73e74..755788f 100644
--- a/luni/src/main/native/sub.mk
+++ b/luni/src/main/native/sub.mk
@@ -6,6 +6,7 @@ LOCAL_SRC_FILES := \
BidiWrapper.cpp \
ErrorCode.cpp \
ICU.cpp \
+ JniConstants.cpp \
NativeBreakIterator.cpp \
NativeCollation.cpp \
NativeConverter.cpp \
diff --git a/luni/src/main/native/valueOf.cpp b/luni/src/main/native/valueOf.cpp
index 64cfb1f..a3475e3 100644
--- a/luni/src/main/native/valueOf.cpp
+++ b/luni/src/main/native/valueOf.cpp
@@ -18,27 +18,26 @@
#include "valueOf.h"
#include "JNIHelp.h"
+#include "JniConstants.h"
-jobject booleanValueOf(JNIEnv * env, jboolean value) {
- static jclass c = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Boolean"));
- static jmethodID valueOfMethod = env->GetStaticMethodID(c, "valueOf", "(Z)Ljava/lang/Boolean;");
+template <typename T>
+static jobject valueOf(JNIEnv* env, jclass c, const char* signature, const T& value) {
+ static jmethodID valueOfMethod = env->GetStaticMethodID(c, "valueOf", signature);
return env->CallStaticObjectMethod(c, valueOfMethod, value);
}
+jobject booleanValueOf(JNIEnv* env, jboolean value) {
+ return valueOf(env, JniConstants::booleanClass, "(Z)Ljava/lang/Boolean;", value);
+}
+
jobject doubleValueOf(JNIEnv* env, jdouble value) {
- static jclass c = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Double"));
- static jmethodID valueOfMethod = env->GetStaticMethodID(c, "valueOf", "(D)Ljava/lang/Double;");
- return env->CallStaticObjectMethod(c, valueOfMethod, value);
+ return valueOf(env, JniConstants::doubleClass, "(D)Ljava/lang/Double;", value);
}
jobject integerValueOf(JNIEnv* env, jint value) {
- static jclass c = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Integer"));
- static jmethodID valueOfMethod = env->GetStaticMethodID(c, "valueOf", "(I)Ljava/lang/Integer;");
- return env->CallStaticObjectMethod(c, valueOfMethod, value);
+ return valueOf(env, JniConstants::integerClass, "(I)Ljava/lang/Integer;", value);
}
jobject longValueOf(JNIEnv* env, jlong value) {
- static jclass c = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Long"));
- static jmethodID valueOfMethod = env->GetStaticMethodID(c, "valueOf", "(J)Ljava/lang/Long;");
- return env->CallStaticObjectMethod(c, valueOfMethod, value);
+ return valueOf(env, JniConstants::longClass, "(J)Ljava/lang/Long;", value);
}