diff options
-rw-r--r-- | luni/src/main/native/ICU.cpp | 36 | ||||
-rw-r--r-- | luni/src/main/native/NativeDecimalFormat.cpp | 36 | ||||
-rw-r--r-- | luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp | 68 | ||||
-rw-r--r-- | luni/src/main/native/sub.mk | 3 | ||||
-rw-r--r-- | luni/src/main/native/valueOf.cpp | 44 | ||||
-rw-r--r-- | luni/src/main/native/valueOf.h | 27 |
6 files changed, 110 insertions, 104 deletions
diff --git a/luni/src/main/native/ICU.cpp b/luni/src/main/native/ICU.cpp index 6d60053..329b494 100644 --- a/luni/src/main/native/ICU.cpp +++ b/luni/src/main/native/ICU.cpp @@ -16,31 +16,32 @@ #define LOG_TAG "ICU" +#include "ErrorCode.h" #include "JNIHelp.h" #include "ScopedLocalRef.h" #include "ScopedUtfChars.h" #include "UniquePtr.h" #include "cutils/log.h" -#include "unicode/numfmt.h" -#include "unicode/locid.h" -#include "unicode/ubrk.h" -#include "unicode/ucal.h" -#include "unicode/ucol.h" -#include "unicode/udat.h" -#include "unicode/gregocal.h" -#include "unicode/ucurr.h" #include "unicode/calendar.h" #include "unicode/datefmt.h" -#include "unicode/dtfmtsym.h" -#include "unicode/decimfmt.h" #include "unicode/dcfmtsym.h" -#include "unicode/uclean.h" +#include "unicode/decimfmt.h" +#include "unicode/dtfmtsym.h" +#include "unicode/gregocal.h" +#include "unicode/locid.h" +#include "unicode/numfmt.h" #include "unicode/smpdtfmt.h" #include "unicode/strenum.h" -#include "unicode/ustring.h" #include "unicode/timezone.h" +#include "unicode/ubrk.h" +#include "unicode/ucal.h" +#include "unicode/uclean.h" +#include "unicode/ucol.h" +#include "unicode/ucurr.h" +#include "unicode/udat.h" +#include "unicode/ustring.h" #include "ureslocs.h" -#include "ErrorCode.h" +#include "valueOf.h" #include <stdlib.h> #include <string.h> #include <time.h> @@ -465,15 +466,10 @@ static jstring getIntCurrencyCode(JNIEnv* env, jstring locale) { } static void setIntegerField(JNIEnv* env, jobject obj, const char* fieldName, int value) { - // Convert our int to a java.lang.Integer. - // TODO: switch to Integer.valueOf, add error checking. - jclass integerClass = env->FindClass("java/lang/Integer"); - jmethodID constructor = env->GetMethodID(integerClass, "<init>", "(I)V"); - jobject integerValue = env->NewObject(integerClass, constructor, value); - // Set the field. + 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;"); - env->SetObjectField(obj, fid, integerValue); + env->SetObjectField(obj, fid, integerValue.get()); } static void setStringField(JNIEnv* env, jobject obj, const char* fieldName, jstring value) { diff --git a/luni/src/main/native/NativeDecimalFormat.cpp b/luni/src/main/native/NativeDecimalFormat.cpp index 2f1d344..759a271 100644 --- a/luni/src/main/native/NativeDecimalFormat.cpp +++ b/luni/src/main/native/NativeDecimalFormat.cpp @@ -15,18 +15,20 @@ */ #define LOG_TAG "NativeDecimalFormat" + +#include "ErrorCode.h" #include "JNIHelp.h" +#include "ScopedJavaUnicodeString.h" +#include "ScopedPrimitiveArray.h" +#include "ScopedUtfChars.h" #include "cutils/log.h" -#include "unicode/unum.h" -#include "unicode/numfmt.h" +#include "digitlst.h" #include "unicode/decimfmt.h" #include "unicode/fmtable.h" +#include "unicode/numfmt.h" +#include "unicode/unum.h" #include "unicode/ustring.h" -#include "digitlst.h" -#include "ErrorCode.h" -#include "ScopedJavaUnicodeString.h" -#include "ScopedPrimitiveArray.h" -#include "ScopedUtfChars.h" +#include "valueOf.h" #include <stdlib.h> #include <string.h> @@ -276,18 +278,6 @@ static jstring formatDigitList(JNIEnv* env, jclass, jint addr, jstring value, jo return format(env, addr, fpIter, sp); } -static jobject newLong(JNIEnv* env, jlong value) { - static jclass gLongClass = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Long")); - static jmethodID gLong_init = env->GetMethodID(gLongClass, "<init>", "(J)V"); - return env->NewObject(gLongClass, gLong_init, value); -} - -static jobject newDouble(JNIEnv* env, jdouble value) { - static jclass gDoubleClass = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Double")); - static jmethodID gDouble_init = env->GetMethodID(gDoubleClass, "<init>", "(D)V"); - return env->NewObject(gDoubleClass, gDouble_init, value); -} - 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"); @@ -347,7 +337,7 @@ static jobject parse(JNIEnv* env, jclass, jint addr, jstring text, strncmp(data, "Inf", 3) == 0 || strncmp(data, "-Inf", 4) == 0) { double resultDouble = res.getDouble(status); - return newDouble(env, (jdouble) resultDouble); + return doubleValueOf(env, (jdouble) resultDouble); } return newBigDecimal(env, data, len); } @@ -358,15 +348,15 @@ static jobject parse(JNIEnv* env, jclass, jint addr, jstring text, switch(numType) { case Formattable::kDouble: { double resultDouble = res.getDouble(); - return newDouble(env, (jdouble) resultDouble); + return doubleValueOf(env, (jdouble) resultDouble); } case Formattable::kLong: { long resultLong = res.getLong(); - return newLong(env, (jlong) resultLong); + return longValueOf(env, (jlong) resultLong); } case Formattable::kInt64: { int64_t resultInt64 = res.getInt64(); - return newLong(env, (jlong) resultInt64); + return longValueOf(env, (jlong) resultInt64); } default: { return NULL; 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 c9fa21a..b03f374 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 @@ -28,6 +28,7 @@ #include "NetworkUtilities.h" #include "ScopedPrimitiveArray.h" #include "jni.h" +#include "valueOf.h" #include <arpa/inet.h> #include <assert.h> @@ -97,14 +98,11 @@ static struct CachedFields { jfieldID fd_descriptor; jclass iaddr_class; jclass i4addr_class; - jmethodID i4addr_class_init; jfieldID iaddr_ipaddress; jclass genericipmreq_class; jclass integer_class; - jmethodID integer_class_init; jfieldID integer_class_value; jclass boolean_class; - jmethodID boolean_class_init; jfieldID boolean_class_value; jclass byte_class; jfieldID byte_class_value; @@ -279,35 +277,6 @@ static bool inetAddressToSocketAddress(JNIEnv *env, jobject inetaddress, return byteArrayToSocketAddress(env, NULL, addressBytes, port, sockaddress); } -/** - * Answer a new java.lang.Boolean object. - * - * @param env pointer to the JNI library - * @param anInt the Boolean constructor argument - * - * @return the new Boolean - */ -static jobject newJavaLangBoolean(JNIEnv * env, jint anInt) { - jclass tempClass; - jmethodID tempMethod; - - tempClass = gCachedFields.boolean_class; - tempMethod = gCachedFields.boolean_class_init; - return env->NewObject(tempClass, tempMethod, (jboolean) (anInt != 0)); -} - -/** - * Answer a new java.lang.Integer object. - * - * @param env pointer to the JNI library - * @param anInt the Integer constructor argument - * - * @return the new Integer - */ -static jobject newJavaLangInteger(JNIEnv* env, jint anInt) { - return env->NewObject(gCachedFields.integer_class, gCachedFields.integer_class_init, anInt); -} - // Converts a number of milliseconds to a timeval. static timeval toTimeval(long ms) { timeval tv; @@ -763,27 +732,6 @@ static bool initCachedFields(JNIEnv* env) { *c.clazz = (jclass) env->NewGlobalRef(tempClass); } - struct methodInfo { - jmethodID *method; - jclass clazz; - const char *name; - const char *signature; - bool isStatic; - } methods[] = { - {&c->i4addr_class_init, c->i4addr_class, "<init>", "([B)V", false}, - {&c->integer_class_init, c->integer_class, "<init>", "(I)V", false}, - {&c->boolean_class_init, c->boolean_class, "<init>", "(Z)V", false}, - }; - for (unsigned i = 0; i < sizeof(methods) / sizeof(methods[0]); i++) { - methodInfo m = methods[i]; - if (m.isStatic) { - *m.method = env->GetStaticMethodID(m.clazz, m.name, m.signature); - } else { - *m.method = env->GetMethodID(m.clazz, m.name, m.signature); - } - if (*m.method == NULL) return false; - } - struct fieldInfo { jfieldID *field; jclass clazz; @@ -1672,12 +1620,12 @@ static bool getSocketOption(JNIEnv* env, int fd, int level, int option, T* value static jobject getSocketOption_Boolean(JNIEnv* env, int fd, int level, int option) { int value; - return getSocketOption(env, fd, level, option, &value) ? newJavaLangBoolean(env, value) : NULL; + return getSocketOption(env, fd, level, option, &value) ? booleanValueOf(env, value) : NULL; } static jobject getSocketOption_Integer(JNIEnv* env, int fd, int level, int option) { int value; - return getSocketOption(env, fd, level, option, &value) ? newJavaLangInteger(env, value) : NULL; + return getSocketOption(env, fd, level, option, &value) ? integerValueOf(env, value) : NULL; } static jobject osNetworkSystem_getSocketOption(JNIEnv* env, jobject, jobject fileDescriptor, jint option) { @@ -1717,13 +1665,13 @@ static jobject osNetworkSystem_getSocketOption(JNIEnv* env, jobject, jobject fil { linger lingr; bool ok = getSocketOption(env, fd, SOL_SOCKET, SO_LINGER, &lingr); - return ok ? newJavaLangInteger(env, !lingr.l_onoff ? -1 : lingr.l_linger) : NULL; + return ok ? integerValueOf(env, !lingr.l_onoff ? -1 : lingr.l_linger) : NULL; } case JAVASOCKOPT_SO_RCVTIMEOUT: { timeval timeout; bool ok = getSocketOption(env, fd, SOL_SOCKET, SO_RCVTIMEO, &timeout); - return ok ? newJavaLangInteger(env, toMs(timeout)) : NULL; + return ok ? integerValueOf(env, toMs(timeout)) : NULL; } #ifdef ENABLE_MULTICAST case JAVASOCKOPT_IP_MULTICAST_IF: @@ -1744,7 +1692,7 @@ static jobject osNetworkSystem_getSocketOption(JNIEnv* env, jobject, jobject fil if (family == AF_INET) { struct ip_mreqn multicastRequest; bool ok = getSocketOption(env, fd, IPPROTO_IP, IP_MULTICAST_IF, &multicastRequest); - return ok ? newJavaLangInteger(env, multicastRequest.imr_ifindex) : NULL; + return ok ? integerValueOf(env, multicastRequest.imr_ifindex) : NULL; } else { return getSocketOption_Integer(env, fd, IPPROTO_IPV6, IPV6_MULTICAST_IF); } @@ -1753,7 +1701,7 @@ static jobject osNetworkSystem_getSocketOption(JNIEnv* env, jobject, jobject fil // Although IPv6 was cleaned up to use int, IPv4 multicast loopback uses a byte. u_char loopback; bool ok = getSocketOption(env, fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loopback); - return ok ? newJavaLangBoolean(env, loopback) : NULL; + return ok ? booleanValueOf(env, loopback) : NULL; } else { return getSocketOption_Boolean(env, fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP); } @@ -1763,7 +1711,7 @@ static jobject osNetworkSystem_getSocketOption(JNIEnv* env, jobject, jobject fil // IPv4 multicast TTL uses a byte. u_char ttl; bool ok = getSocketOption(env, fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl); - return ok ? newJavaLangInteger(env, ttl) : NULL; + return ok ? integerValueOf(env, ttl) : NULL; } else { return getSocketOption_Integer(env, fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS); } diff --git a/luni/src/main/native/sub.mk b/luni/src/main/native/sub.mk index 4df8515..1c73e74 100644 --- a/luni/src/main/native/sub.mk +++ b/luni/src/main/native/sub.mk @@ -42,7 +42,8 @@ LOCAL_SRC_FILES := \ org_apache_harmony_luni_util_NumberConvert.cpp \ org_apache_harmony_luni_util_fltparse.cpp \ org_apache_harmony_xml_ExpatParser.cpp \ - org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp + org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp \ + valueOf.cpp LOCAL_C_INCLUDES += \ diff --git a/luni/src/main/native/valueOf.cpp b/luni/src/main/native/valueOf.cpp new file mode 100644 index 0000000..64cfb1f --- /dev/null +++ b/luni/src/main/native/valueOf.cpp @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#define LOG_TAG "valueOf" + +#include "valueOf.h" +#include "JNIHelp.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;"); + return env->CallStaticObjectMethod(c, valueOfMethod, 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); +} + +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); +} + +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); +} diff --git a/luni/src/main/native/valueOf.h b/luni/src/main/native/valueOf.h new file mode 100644 index 0000000..5c8588f --- /dev/null +++ b/luni/src/main/native/valueOf.h @@ -0,0 +1,27 @@ +/* + * 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 VALUE_OF_H_included +#define VALUE_OF_H_included + +#include "JNIHelp.h" + +jobject booleanValueOf(JNIEnv* env, jboolean b); +jobject doubleValueOf(JNIEnv* env, jdouble d); +jobject integerValueOf(JNIEnv* env, jint i); +jobject longValueOf(JNIEnv* env, jlong l); + +#endif // VALUE_OF_H_included |