summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/ScopedUtfChars.h17
-rw-r--r--luni/src/main/native/ICU.cpp22
-rw-r--r--luni/src/main/native/NativeBreakIterator.cpp2
-rw-r--r--luni/src/main/native/NativeCollation.cpp5
-rw-r--r--luni/src/main/native/NativeConverter.cpp4
-rw-r--r--luni/src/main/native/UCharacter.cpp13
-rw-r--r--luni/src/main/native/java_io_ObjectInputStream.cpp299
-rw-r--r--luni/src/main/native/java_io_ObjectOutputStream.cpp256
-rw-r--r--luni/src/main/native/java_lang_System.cpp81
-rw-r--r--luni/src/main/native/java_net_InetAddress.cpp63
-rw-r--r--luni/src/main/native/org_apache_harmony_luni_util_fltparse.cpp59
-rw-r--r--luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp104
-rw-r--r--luni/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp20
-rw-r--r--openssl/src/main/native/BNInterface.cpp23
14 files changed, 275 insertions, 693 deletions
diff --git a/include/ScopedUtfChars.h b/include/ScopedUtfChars.h
index bfe9bb9..3051d3b 100644
--- a/include/ScopedUtfChars.h
+++ b/include/ScopedUtfChars.h
@@ -20,12 +20,25 @@
#include "JNIHelp.h"
// A smart pointer that provides read-only access to a Java string's UTF chars.
+// Unlike GetStringUTFChars, we throw NullPointerException rather than abort if
+// passed a null jstring, and c_str will return NULL.
+// This makes the correct idiom very simple:
+//
+// ScopedUtfChars name(env, javaName);
+// if (name.c_str() == NULL) {
+// return NULL;
+// }
class ScopedUtfChars {
public:
ScopedUtfChars(JNIEnv* env, jstring s)
- : mEnv(env), mString(s), mUtfChars(NULL)
+ : mEnv(env), mString(s)
{
- mUtfChars = env->GetStringUTFChars(s, NULL);
+ if (s == NULL) {
+ mUtfChars = NULL;
+ jniThrowNullPointerException(env, NULL);
+ } else {
+ mUtfChars = env->GetStringUTFChars(s, NULL);
+ }
}
~ScopedUtfChars() {
diff --git a/luni/src/main/native/ICU.cpp b/luni/src/main/native/ICU.cpp
index 097bbe3..94bb521 100644
--- a/luni/src/main/native/ICU.cpp
+++ b/luni/src/main/native/ICU.cpp
@@ -90,7 +90,7 @@ static jint getCurrencyFractionDigitsNative(JNIEnv* env, jclass, jstring currenc
return fmt->getMinimumFractionDigits();
}
-static jstring getCurrencyCodeNative(JNIEnv* env, jclass, jstring key) {
+static jstring getCurrencyCodeNative(JNIEnv* env, jclass, jstring javaKey) {
UErrorCode status = U_ZERO_ERROR;
ScopedResourceBundle supplData(ures_openDirect(NULL, "supplementalData", &status));
if (U_FAILURE(status)) {
@@ -102,9 +102,8 @@ static jstring getCurrencyCodeNative(JNIEnv* env, jclass, jstring key) {
return NULL;
}
- const char* keyChars = env->GetStringUTFChars(key, NULL);
- ScopedResourceBundle currency(ures_getByKey(currencyMap.get(), keyChars, NULL, &status));
- env->ReleaseStringUTFChars(key, keyChars);
+ ScopedUtfChars key(env, javaKey);
+ ScopedResourceBundle currency(ures_getByKey(currencyMap.get(), key.c_str(), NULL, &status));
if (U_FAILURE(status)) {
return NULL;
}
@@ -142,10 +141,9 @@ static jstring getCurrencyCodeNative(JNIEnv* env, jclass, jstring key) {
static jstring getCurrencySymbolNative(JNIEnv* env, jclass, jstring locale, jstring currencyCode) {
// LOGI("ENTER getCurrencySymbolNative");
- const char* locName = env->GetStringUTFChars(locale, NULL);
+ ScopedUtfChars localeName(env, locale);
UErrorCode status = U_ZERO_ERROR;
- ScopedResourceBundle root(ures_open(NULL, locName, &status));
- env->ReleaseStringUTFChars(locale, locName);
+ ScopedResourceBundle root(ures_open(NULL, localeName.c_str(), &status));
if (U_FAILURE(status)) {
return NULL;
}
@@ -155,9 +153,8 @@ static jstring getCurrencySymbolNative(JNIEnv* env, jclass, jstring locale, jstr
return NULL;
}
- const char* currName = env->GetStringUTFChars(currencyCode, NULL);
- ScopedResourceBundle currencyElems(ures_getByKey(currencies.get(), currName, NULL, &status));
- env->ReleaseStringUTFChars(currencyCode, currName);
+ ScopedUtfChars currency(env, currencyCode);
+ ScopedResourceBundle currencyElems(ures_getByKey(currencies.get(), currency.c_str(), NULL, &status));
if (U_FAILURE(status)) {
return NULL;
}
@@ -577,10 +574,9 @@ static void setCharField(JNIEnv* env, jobject obj, const char* fieldName, UResou
}
static jboolean initLocaleDataImpl(JNIEnv* env, jclass, jstring locale, jobject localeData) {
- const char* loc = env->GetStringUTFChars(locale, NULL);
+ ScopedUtfChars localeName(env, locale);
UErrorCode status = U_ZERO_ERROR;
- ScopedResourceBundle root(ures_openU(NULL, loc, &status));
- env->ReleaseStringUTFChars(locale, loc);
+ ScopedResourceBundle root(ures_openU(NULL, localeName.c_str(), &status));
if (U_FAILURE(status)) {
LOGE("Error getting ICU resource bundle: %s", u_errorName(status));
status = U_ZERO_ERROR;
diff --git a/luni/src/main/native/NativeBreakIterator.cpp b/luni/src/main/native/NativeBreakIterator.cpp
index e2db39a..cb7b7b9 100644
--- a/luni/src/main/native/NativeBreakIterator.cpp
+++ b/luni/src/main/native/NativeBreakIterator.cpp
@@ -26,7 +26,7 @@
static jint getIterator(JNIEnv* env, jstring locale, UBreakIteratorType type) {
UErrorCode status = U_ZERO_ERROR;
ScopedUtfChars localeChars(env, locale);
- if (!localeChars.c_str()) {
+ if (localeChars.c_str() == NULL) {
return 0;
}
UBreakIterator* it = ubrk_open(type, localeChars.c_str(), NULL, 0, &status);
diff --git a/luni/src/main/native/NativeCollation.cpp b/luni/src/main/native/NativeCollation.cpp
index ce76786..ed2a0e5 100644
--- a/luni/src/main/native/NativeCollation.cpp
+++ b/luni/src/main/native/NativeCollation.cpp
@@ -117,6 +117,9 @@ static jint next(JNIEnv* env, jclass, jint address) {
static jint openCollator(JNIEnv* env, jclass, jstring localeName) {
ScopedUtfChars localeChars(env, localeName);
+ if (localeChars.c_str() == NULL) {
+ return 0;
+ }
UErrorCode status = U_ZERO_ERROR;
UCollator* c = ucol_open(localeChars.c_str(), &status);
icu4jni_error(env, status);
@@ -193,7 +196,7 @@ static JNINativeMethod gMethods[] = {
{ "getOffset", "(I)I", (void*) getOffset },
{ "setOffset", "(II)V", (void*) setOffset }
};
-int register_com_ibm_icu4jni_text_NativeCollator(JNIEnv* env) {
+int register_com_ibm_icu4jni_text_NativeCollator(JNIEnv* env) {
return jniRegisterNativeMethods(env, "com/ibm/icu4jni/text/NativeCollation",
gMethods, NELEM(gMethods));
}
diff --git a/luni/src/main/native/NativeConverter.cpp b/luni/src/main/native/NativeConverter.cpp
index f5de483..edc5f50 100644
--- a/luni/src/main/native/NativeConverter.cpp
+++ b/luni/src/main/native/NativeConverter.cpp
@@ -56,7 +56,7 @@ static UConverter* toUConverter(jlong address) {
static jlong openConverter(JNIEnv* env, jclass, jstring converterName) {
ScopedUtfChars converterNameChars(env, converterName);
- if (!converterNameChars.c_str()) {
+ if (converterNameChars.c_str() == NULL) {
return 0;
}
UErrorCode errorCode = U_ZERO_ERROR;
@@ -591,7 +591,7 @@ static jboolean contains(JNIEnv*, jclass, jlong handle1, jlong handle2) {
static jobject charsetForName(JNIEnv* env, jclass, jstring charsetName) {
ScopedUtfChars charsetNameChars(env, charsetName);
- if (!charsetNameChars.c_str()) {
+ if (charsetNameChars.c_str() == NULL) {
return NULL;
}
// Get ICU's canonical name for this charset.
diff --git a/luni/src/main/native/UCharacter.cpp b/luni/src/main/native/UCharacter.cpp
index 136f58c..09bb90d 100644
--- a/luni/src/main/native/UCharacter.cpp
+++ b/luni/src/main/native/UCharacter.cpp
@@ -156,15 +156,12 @@ static jboolean isLowerCaseImpl(JNIEnv*, jclass, jint codePoint) {
return u_islower(codePoint);
}
-static int forNameImpl(JNIEnv* env, jclass, jstring blockName) {
- if (blockName == NULL) {
- jniThrowNullPointerException(env, NULL);
- return -1;
+static int forNameImpl(JNIEnv* env, jclass, jstring javaBlockName) {
+ ScopedUtfChars blockName(env, javaBlockName);
+ if (blockName.c_str() == NULL) {
+ return 0;
}
- const char* bName = env->GetStringUTFChars(blockName, NULL);
- int result = u_getPropertyValueEnum(UCHAR_BLOCK, bName);
- env->ReleaseStringUTFChars(blockName, bName);
- return result;
+ return u_getPropertyValueEnum(UCHAR_BLOCK, blockName.c_str());
}
static int ofImpl(JNIEnv*, jclass, jint codePoint) {
diff --git a/luni/src/main/native/java_io_ObjectInputStream.cpp b/luni/src/main/native/java_io_ObjectInputStream.cpp
index 57f8afe..224603e 100644
--- a/luni/src/main/native/java_io_ObjectInputStream.cpp
+++ b/luni/src/main/native/java_io_ObjectInputStream.cpp
@@ -16,265 +16,72 @@
*/
#include "JNIHelp.h"
-
-static void java_setFieldBool (JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName,
- jboolean newValue) {
- const char *fieldNameInC;
- jfieldID fid;
- if(targetObject == NULL) {
+#include "ScopedUtfChars.h"
+
+#define SETTER(FUNCTION_NAME, JNI_C_TYPE, JNI_TYPE_STRING, JNI_SETTER_FUNCTION) \
+ static void FUNCTION_NAME(JNIEnv* env, jclass, jobject instance, \
+ jclass declaringClass, jstring javaFieldName, JNI_C_TYPE newValue) { \
+ if (instance == NULL) { \
+ return; \
+ } \
+ ScopedUtfChars fieldName(env, javaFieldName); \
+ if (fieldName.c_str() == NULL) { \
+ return; \
+ } \
+ jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), JNI_TYPE_STRING); \
+ if (fid != 0) { \
+ env->JNI_SETTER_FUNCTION(instance, fid, newValue); \
+ } \
+ }
+
+SETTER(ObjectInputStream_setFieldBool, jboolean, "Z", SetBooleanField)
+SETTER(ObjectInputStream_setFieldByte, jbyte, "B", SetByteField)
+SETTER(ObjectInputStream_setFieldChar, jchar, "C", SetCharField)
+SETTER(ObjectInputStream_setFieldDouble, jdouble, "D", SetDoubleField)
+SETTER(ObjectInputStream_setFieldFloat, jfloat, "F", SetFloatField)
+SETTER(ObjectInputStream_setFieldInt, jint, "I", SetIntField)
+SETTER(ObjectInputStream_setFieldLong, jlong, "J", SetLongField)
+SETTER(ObjectInputStream_setFieldShort, jshort, "S", SetShortField)
+
+static void ObjectInputStream_setFieldObj(JNIEnv* env, jclass, jobject instance,
+ jclass declaringClass, jstring javaFieldName, jstring javaFieldTypeName, jobject newValue) {
+ if (instance == NULL) {
return;
}
- fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- fid = env->GetFieldID(declaringClass, fieldNameInC, "Z");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid != 0) {
- env->SetBooleanField(targetObject, fid, newValue);
- }
-}
-
-static void java_setFieldChar (JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName,
- jchar newValue) {
- const char *fieldNameInC;
- jfieldID fid;
- if(targetObject == NULL) {
+ ScopedUtfChars fieldName(env, javaFieldName);
+ if (fieldName.c_str() == NULL) {
return;
}
- fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- fid = env->GetFieldID(declaringClass, fieldNameInC, "C");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid != 0) {
- env->SetCharField(targetObject, fid, newValue);
- }
-}
-
-static void java_setFieldInt (JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName,
- jint newValue) {
- const char *fieldNameInC;
- jfieldID fid;
- if(targetObject == NULL) {
- return;
- }
- fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- fid = env->GetFieldID(declaringClass, fieldNameInC, "I");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid != 0) {
- env->SetIntField(targetObject, fid, newValue);
- }
-}
-
-static void java_setFieldFloat (JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName,
- jfloat newValue) {
- const char *fieldNameInC;
- jfieldID fid;
- if(targetObject == NULL) {
+ ScopedUtfChars fieldTypeName(env, javaFieldTypeName);
+ if (fieldTypeName.c_str() == NULL) {
return;
}
- fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- fid = env->GetFieldID(declaringClass, fieldNameInC, "F");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid != 0) {
- env->SetFloatField(targetObject, fid, newValue);
+ jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), fieldTypeName.c_str());
+ if (fid != 0) {
+ env->SetObjectField(instance, fid, newValue);
}
}
-static void java_setFieldDouble (JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName,
- jdouble newValue) {
- const char *fieldNameInC;
- jfieldID fid;
- if(targetObject == NULL) {
- return;
- }
- fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- fid = env->GetFieldID(declaringClass, fieldNameInC, "D");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid != 0) {
- env->SetDoubleField(targetObject, fid, newValue);
- }
-
-}
-
-static void java_setFieldShort (JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName,
- jshort newValue) {
- const char *fieldNameInC;
- jfieldID fid;
- if(targetObject == NULL) {
- return;
- }
- fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- fid = env->GetFieldID(declaringClass, fieldNameInC, "S");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid != 0) {
- env->SetShortField(targetObject, fid, newValue);
- }
-
-}
-
-static void java_setFieldLong (JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName,
- jlong newValue) {
- const char *fieldNameInC;
- jfieldID fid;
- if(targetObject == NULL) {
- return;
- }
- fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- fid = env->GetFieldID(declaringClass, fieldNameInC, "J");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid != 0) {
- env->SetLongField(targetObject, fid, newValue);
- }
-}
-
-static jobject java_newInstance (JNIEnv* env, jclass,
- jclass instantiationClass,
- jclass constructorClass) {
- jmethodID mid =
- env->GetMethodID(constructorClass, "<init>", "()V");
-
- if(mid == 0) {
- /* Cant newInstance,No empty constructor... */
- return (jobject) 0;
- } else {
- /* Instantiate an object of a given class */
- return (jobject) env->NewObject(instantiationClass, mid);
- }
-
-}
-
-static void java_setFieldByte (JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName,
- jbyte newValue){
- const char *fieldNameInC;
- jfieldID fid;
- if(targetObject == NULL) {
- return;
- }
- fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- fid = env->GetFieldID(declaringClass, fieldNameInC, "B");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /* Two options now. Maybe getFieldID caused an exception, or maybe it returned the real value */
- if(fid != 0) {
- env->SetByteField(targetObject, fid, newValue);
- }
-}
-
-static void java_setFieldObj (JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName,
- jstring fieldTypeName,
- jobject newValue) {
- const char *fieldNameInC, *fieldTypeNameInC;
- jfieldID fid;
- if(targetObject == NULL) {
- return;
- }
- fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- fieldTypeNameInC = env->GetStringUTFChars(fieldTypeName, NULL);
- fid = env->GetFieldID(declaringClass,
- fieldNameInC, fieldTypeNameInC);
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
- env->ReleaseStringUTFChars(fieldTypeName, fieldTypeNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid != 0) {
- env->SetObjectField(targetObject, fid, newValue);
+static jobject ObjectInputStream_newInstance(JNIEnv* env, jclass,
+ jclass instantiationClass, jclass constructorClass) {
+ jmethodID mid = env->GetMethodID(constructorClass, "<init>", "()V");
+ if (mid == 0) {
+ return NULL;
}
+ return env->NewObject(instantiationClass, mid);
}
static JNINativeMethod gMethods[] = {
- { "setField",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;J)V",
- (void*) java_setFieldLong },
- { "setField",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;S)V",
- (void*) java_setFieldShort },
- { "setField",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;D)V",
- (void*) java_setFieldDouble },
- { "setField",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Z)V",
- (void*) java_setFieldBool },
- { "setField",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;B)V",
- (void*) java_setFieldByte },
- { "setField",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;F)V",
- (void*) java_setFieldFloat },
- { "setField",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;C)V",
- (void*) java_setFieldChar },
- { "setField",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;I)V",
- (void*) java_setFieldInt },
- { "newInstance",
- "(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/Object;",
- (void*) java_newInstance },
- { "objSetField",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V",
- (void*) java_setFieldObj }
-
+ { "newInstance", "(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/Object;", (void*) ObjectInputStream_newInstance },
+ { "objSetField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", (void*) ObjectInputStream_setFieldObj },
+ { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;B)V", (void*) ObjectInputStream_setFieldByte },
+ { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;C)V", (void*) ObjectInputStream_setFieldChar },
+ { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;D)V", (void*) ObjectInputStream_setFieldDouble },
+ { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;F)V", (void*) ObjectInputStream_setFieldFloat },
+ { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;I)V", (void*) ObjectInputStream_setFieldInt },
+ { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;J)V", (void*) ObjectInputStream_setFieldLong },
+ { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;S)V", (void*) ObjectInputStream_setFieldShort },
+ { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Z)V", (void*) ObjectInputStream_setFieldBool },
};
int register_java_io_ObjectInputStream(JNIEnv* env) {
return jniRegisterNativeMethods(env, "java/io/ObjectInputStream", gMethods, NELEM(gMethods));
diff --git a/luni/src/main/native/java_io_ObjectOutputStream.cpp b/luni/src/main/native/java_io_ObjectOutputStream.cpp
index 791e041..c499bac 100644
--- a/luni/src/main/native/java_io_ObjectOutputStream.cpp
+++ b/luni/src/main/native/java_io_ObjectOutputStream.cpp
@@ -16,223 +16,61 @@
*/
#include "JNIHelp.h"
-
-static jlong java_getFieldLong(JNIEnv * env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName) {
- const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "J");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid == 0) {
- // Field not found. I believe we must throw an exception here
- return (jlong) 0L;
- } else {
- return env->GetLongField(targetObject, fid);
+#include "ScopedUtfChars.h"
+
+#define GETTER(FUNCTION_NAME, JNI_C_TYPE, JNI_TYPE_STRING, JNI_GETTER_FUNCTION) \
+ static JNI_C_TYPE FUNCTION_NAME(JNIEnv* env, jclass, jobject instance, jclass declaringClass, \
+ jstring javaFieldName) { \
+ if (instance == NULL) { \
+ return JNI_C_TYPE(); \
+ } \
+ ScopedUtfChars fieldName(env, javaFieldName); \
+ if (fieldName.c_str() == NULL) { \
+ return JNI_C_TYPE(); \
+ } \
+ jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), JNI_TYPE_STRING); \
+ if (fid == 0) { \
+ return JNI_C_TYPE(); \
+ } \
+ return env->JNI_GETTER_FUNCTION(instance, fid); \
}
-}
-static jshort java_getFieldShort(JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName) {
- const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "S");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid == 0) {
- // Field not found. I believe we must throw an exception here
- return (jshort) 0;
- } else {
- return env->GetShortField(targetObject, fid);
+GETTER(ObjectOutputStream_getFieldBool, jboolean, "Z", GetBooleanField)
+GETTER(ObjectOutputStream_getFieldByte, jbyte, "B", GetByteField)
+GETTER(ObjectOutputStream_getFieldChar, jchar, "C", GetCharField)
+GETTER(ObjectOutputStream_getFieldDouble, jdouble, "D", GetDoubleField)
+GETTER(ObjectOutputStream_getFieldFloat, jfloat, "F", GetFloatField)
+GETTER(ObjectOutputStream_getFieldInt, jint, "I", GetIntField)
+GETTER(ObjectOutputStream_getFieldLong, jlong, "J", GetLongField)
+GETTER(ObjectOutputStream_getFieldShort, jshort, "S", GetShortField)
+
+static jobject ObjectOutputStream_getFieldObj(JNIEnv* env, jclass, jobject instance,
+ jclass declaringClass, jstring javaFieldName, jstring javaFieldTypeName) {
+ ScopedUtfChars fieldName(env, javaFieldName);
+ if (fieldName.c_str() == NULL) {
+ return NULL;
}
-}
-
-static jdouble java_getFieldDouble(JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName) {
- const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "D");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid == 0) {
- // Field not found. I believe we must throw an exception here
- return (jdouble) 0.0;
- } else {
- return env->GetDoubleField(targetObject, fid);
+ ScopedUtfChars fieldTypeName(env, javaFieldTypeName);
+ if (fieldTypeName.c_str() == NULL) {
+ return NULL;
}
-}
-
-static jboolean java_getFieldBool(JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName) {
- const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "Z");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid == 0) {
- // Field not found. I believe we must throw an exception here
- return (jboolean) 0;
- } else {
- return env->GetBooleanField(targetObject, fid);
- }
-}
-
-static jbyte java_getFieldByte(JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName) {
- const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "B");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid == 0) {
- // Field not found. I believe we must throw an exception here
- return (jbyte) 0;
- } else {
- return env->GetByteField(targetObject, fid);
- }
-}
-
-static jfloat java_getFieldFloat(JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName) {
- const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "F");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid == 0) {
- // Field not found. I believe we must throw an exception here
- return (jfloat) 0.0f;
- }
- else {
- return env->GetFloatField(targetObject, fid);
- }
-
-}
-
-static jchar java_getFieldChar(JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName) {
- const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "C");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid == 0) {
- // Field not found. I believe we must throw an exception here
- return (jchar) 0;
- } else {
- return env->GetCharField(targetObject, fid);
- }
-}
-
-static jobject java_getFieldObj(JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName,
- jstring fieldTypeName) {
- const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- const char *fieldTypeNameInC =
- env->GetStringUTFChars(fieldTypeName, NULL);
- jfieldID fid = env->GetFieldID(declaringClass,
- fieldNameInC, fieldTypeNameInC);
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
- env->ReleaseStringUTFChars(fieldTypeName, fieldTypeNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused an exception,
- * or maybe it returned the real value
- */
- if(fid == 0) {
- // Field not found. I believe we must throw an exception here
- return (jobject) 0;
- } else {
- return env->GetObjectField(targetObject, fid);
- }
-}
-
-static jint java_getFieldInt(JNIEnv* env, jclass,
- jobject targetObject,
- jclass declaringClass,
- jstring fieldName) {
- const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL);
- jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "I");
- env->ReleaseStringUTFChars(fieldName, fieldNameInC);
-
- /*
- * Two options now. Maybe getFieldID caused
- * an exception, or maybe it returned the real value
- */
- if(fid == 0) {
- // Field not found. I believe we must throw an exception here
- return (jint) 0;
- } else {
- return env->GetIntField(targetObject, fid);
+ jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), fieldTypeName.c_str());
+ if (fid == 0) {
+ return NULL;
}
+ return env->GetObjectField(instance, fid);
}
static JNINativeMethod gMethods[] = {
- { "getFieldLong",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)J",
- (void*) java_getFieldLong },
- { "getFieldShort",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)S",
- (void*) java_getFieldShort },
- { "getFieldDouble",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)D",
- (void*) java_getFieldDouble },
- { "getFieldBool",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)Z",
- (void*) java_getFieldBool },
- { "getFieldByte",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)B",
- (void*) java_getFieldByte },
- { "getFieldFloat",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)F",
- (void*) java_getFieldFloat },
- { "getFieldChar",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)C",
- (void*) java_getFieldChar },
- { "getFieldObj",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;",
- (void*) java_getFieldObj },
- { "getFieldInt",
- "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)I",
- (void*) java_getFieldInt },
-
+ { "getFieldBool", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)Z", (void*) ObjectOutputStream_getFieldBool },
+ { "getFieldByte", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)B", (void*) ObjectOutputStream_getFieldByte },
+ { "getFieldChar", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)C", (void*) ObjectOutputStream_getFieldChar },
+ { "getFieldDouble", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)D", (void*) ObjectOutputStream_getFieldDouble },
+ { "getFieldFloat", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)F", (void*) ObjectOutputStream_getFieldFloat },
+ { "getFieldInt", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)I", (void*) ObjectOutputStream_getFieldInt },
+ { "getFieldLong", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)J", (void*) ObjectOutputStream_getFieldLong },
+ { "getFieldObj", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;", (void*) ObjectOutputStream_getFieldObj },
+ { "getFieldShort", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)S", (void*) ObjectOutputStream_getFieldShort },
};
int register_java_io_ObjectOutputStream(JNIEnv* env) {
return jniRegisterNativeMethods(env, "java/io/ObjectOutputStream", gMethods, NELEM(gMethods));
diff --git a/luni/src/main/native/java_lang_System.cpp b/luni/src/main/native/java_lang_System.cpp
index b114dab..61a784a 100644
--- a/luni/src/main/native/java_lang_System.cpp
+++ b/luni/src/main/native/java_lang_System.cpp
@@ -15,78 +15,45 @@
*/
#include "JNIHelp.h"
+#include "ScopedUtfChars.h"
#include <stdlib.h>
#include <string.h>
-
-/*
- * public static native String getEnvByName(String name)
- *
- * (Calling it plain "getenv" might confuse GDB if you try to put a breakpoint
- * on the libc version.)
- */
-static jstring java_getEnvByName(JNIEnv* env, jclass, jstring nameStr) {
- jstring valueStr = NULL;
-
- if (nameStr != NULL) {
- const char* name = env->GetStringUTFChars(nameStr, NULL);
- const char* val = getenv(name);
- if (val != NULL) {
- valueStr = env->NewStringUTF(val);
- }
- env->ReleaseStringUTFChars(nameStr, name);
- } else {
- jniThrowNullPointerException(env, NULL);
+static jstring System_getEnvByName(JNIEnv* env, jclass, jstring javaName) {
+ ScopedUtfChars name(env, javaName);
+ if (name.c_str() == NULL) {
+ return NULL;
}
-
- return valueStr;
+ return env->NewStringUTF(getenv(name.c_str()));
}
-/*
- * Pointer to complete environment, from Posix.
- */
+// Pointer to complete environment.
extern char** environ;
-/*
- * public static native String getEnvByIndex()
- *
- * (Calling it plain "getenv" might confuse GDB if you try to put a breakpoint
- * on the libc version.)
- */
-static jstring java_getEnvByIndex(JNIEnv* env, jclass, jint index) {
- jstring valueStr = NULL;
-
- char* entry = environ[index];
- if (entry != NULL) {
- valueStr = env->NewStringUTF(entry);
- }
-
- return valueStr;
+static jstring System_getEnvByIndex(JNIEnv* env, jclass, jint index) {
+ return env->NewStringUTF(environ[index]);
}
-/*
- * public static native String setFieldImpl()
- *
- * Sets a field via JNI. Used for the standard streams, which are r/o
- * otherwise.
- */
-static void java_setFieldImpl(JNIEnv* env, jclass clazz,
- jstring name, jstring sig, jobject object) {
- const char* fieldName = env->GetStringUTFChars(name, NULL);
- const char* fieldSig = env->GetStringUTFChars(sig, NULL);
-
- jfieldID fieldID = env->GetStaticFieldID(clazz, fieldName, fieldSig);
+// Sets a field via JNI. Used for the standard streams, which are read-only otherwise.
+static void System_setFieldImpl(JNIEnv* env, jclass clazz,
+ jstring javaName, jstring javaSignature, jobject object) {
+ ScopedUtfChars name(env, javaName);
+ if (name.c_str() == NULL) {
+ return;
+ }
+ ScopedUtfChars signature(env, javaSignature);
+ if (signature.c_str() == NULL) {
+ return;
+ }
+ jfieldID fieldID = env->GetStaticFieldID(clazz, name.c_str(), signature.c_str());
env->SetStaticObjectField(clazz, fieldID, object);
-
- env->ReleaseStringUTFChars(name, fieldName);
- env->ReleaseStringUTFChars(sig, fieldSig);
}
static JNINativeMethod gMethods[] = {
- { "getEnvByName", "(Ljava/lang/String;)Ljava/lang/String;", (void*) java_getEnvByName },
- { "getEnvByIndex", "(I)Ljava/lang/String;", (void*) java_getEnvByIndex },
- { "setFieldImpl", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", (void*) java_setFieldImpl },
+ { "getEnvByIndex", "(I)Ljava/lang/String;", (void*) System_getEnvByIndex },
+ { "getEnvByName", "(Ljava/lang/String;)Ljava/lang/String;", (void*) System_getEnvByName },
+ { "setFieldImpl", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", (void*) System_setFieldImpl },
};
int register_java_lang_System(JNIEnv* env) {
return jniRegisterNativeMethods(env, "java/lang/System", gMethods, NELEM(gMethods));
diff --git a/luni/src/main/native/java_net_InetAddress.cpp b/luni/src/main/native/java_net_InetAddress.cpp
index afd859a..c27114b 100644
--- a/luni/src/main/native/java_net_InetAddress.cpp
+++ b/luni/src/main/native/java_net_InetAddress.cpp
@@ -20,6 +20,7 @@
#include "JNIHelp.h"
#include "ScopedLocalRef.h"
+#include "ScopedUtfChars.h"
#include "utils/Log.h"
#include "jni.h"
@@ -47,7 +48,7 @@ static jstring InetAddress_gethostname(JNIEnv* env, jclass)
}
#if LOG_DNS
-static void logIpString(struct addrinfo* ai, const char* name)
+static void logIpString(addrinfo* ai, const char* name)
{
char ipString[INET6_ADDRSTRLEN];
int result = getnameinfo(ai->ai_addr, ai->ai_addrlen, ipString,
@@ -60,15 +61,18 @@ static void logIpString(struct addrinfo* ai, const char* name)
}
}
#else
-static inline void logIpString(struct addrinfo*, const char*)
+static inline void logIpString(addrinfo*, const char*)
{
}
#endif
-static jobjectArray InetAddress_getaddrinfoImpl(JNIEnv* env, const char* name) {
- struct addrinfo hints, *addressList = NULL, *addrInfo;
- jobjectArray addressArray = NULL;
+static jobjectArray InetAddress_getaddrinfo(JNIEnv* env, jclass, jstring javaName) {
+ ScopedUtfChars name(env, javaName);
+ if (name.c_str() == NULL) {
+ return NULL;
+ }
+ addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_flags = AI_ADDRCONFIG;
@@ -79,12 +83,14 @@ static jobjectArray InetAddress_getaddrinfoImpl(JNIEnv* env, const char* name) {
*/
hints.ai_socktype = SOCK_STREAM;
- int result = getaddrinfo(name, NULL, &hints, &addressList);
+ addrinfo* addressList = NULL;
+ jobjectArray addressArray = NULL;
+ int result = getaddrinfo(name.c_str(), NULL, &hints, &addressList);
if (result == 0 && addressList) {
// Count results so we know how to size the output array.
int addressCount = 0;
- for (addrInfo = addressList; addrInfo; addrInfo = addrInfo->ai_next) {
- if (addrInfo->ai_family == AF_INET || addrInfo->ai_family == AF_INET6) {
+ for (addrinfo* ai = addressList; ai != NULL; ai = ai->ai_next) {
+ if (ai->ai_family == AF_INET || ai->ai_family == AF_INET6) {
addressCount++;
}
}
@@ -100,26 +106,26 @@ static jobjectArray InetAddress_getaddrinfoImpl(JNIEnv* env, const char* name) {
// Examine returned addresses one by one, save them in the output array.
int index = 0;
- for (addrInfo = addressList; addrInfo; addrInfo = addrInfo->ai_next) {
- struct sockaddr* address = addrInfo->ai_addr;
+ for (addrinfo* ai = addressList; ai != NULL; ai = ai->ai_next) {
+ sockaddr* address = ai->ai_addr;
size_t addressLength = 0;
void* rawAddress;
- switch (addrInfo->ai_family) {
+ switch (ai->ai_family) {
// Find the raw address length and start pointer.
case AF_INET6:
addressLength = 16;
- rawAddress = &((struct sockaddr_in6*) address)->sin6_addr.s6_addr;
- logIpString(addrInfo, name);
+ rawAddress = &reinterpret_cast<sockaddr_in6*>(address)->sin6_addr.s6_addr;
+ logIpString(ai, name.c_str());
break;
case AF_INET:
addressLength = 4;
- rawAddress = &((struct sockaddr_in*) address)->sin_addr.s_addr;
- logIpString(addrInfo, name);
+ rawAddress = &reinterpret_cast<sockaddr_in*>(address)->sin_addr.s_addr;
+ logIpString(ai, name.c_str());
break;
default:
// Unknown address family. Skip this address.
- LOGE("getaddrinfo: Unknown address family %d", addrInfo->ai_family);
+ LOGE("getaddrinfo: Unknown address family %d", ai->ai_family);
continue;
}
@@ -131,7 +137,8 @@ static jobjectArray InetAddress_getaddrinfoImpl(JNIEnv* env, const char* name) {
addressArray = NULL;
break;
}
- env->SetByteArrayRegion(byteArray.get(), 0, addressLength, (jbyte*) rawAddress);
+ env->SetByteArrayRegion(byteArray.get(),
+ 0, addressLength, reinterpret_cast<jbyte*>(rawAddress));
env->SetObjectArrayElement(addressArray, index, byteArray.get());
index++;
}
@@ -150,18 +157,6 @@ static jobjectArray InetAddress_getaddrinfoImpl(JNIEnv* env, const char* name) {
return addressArray;
}
-jobjectArray InetAddress_getaddrinfo(JNIEnv* env, jclass, jstring javaName) {
- if (javaName == NULL) {
- jniThrowNullPointerException(env, NULL);
- return NULL;
- }
- const char* name = env->GetStringUTFChars(javaName, NULL);
- jobjectArray out = InetAddress_getaddrinfoImpl(env, name);
- env->ReleaseStringUTFChars(javaName, name);
- return out;
-}
-
-
/**
* Looks up the name corresponding to an IP address.
*
@@ -179,21 +174,21 @@ static jstring InetAddress_getnameinfo(JNIEnv* env, jclass,
}
// Convert the raw address bytes into a socket address structure.
- struct sockaddr_storage ss;
+ sockaddr_storage ss;
memset(&ss, 0, sizeof(ss));
size_t socklen;
const size_t addressLength = env->GetArrayLength(javaAddress);
if (addressLength == 4) {
- struct sockaddr_in* sin = reinterpret_cast<sockaddr_in*>(&ss);
+ sockaddr_in* sin = reinterpret_cast<sockaddr_in*>(&ss);
sin->sin_family = AF_INET;
- socklen = sizeof(struct sockaddr_in);
+ socklen = sizeof(sockaddr_in);
jbyte* dst = reinterpret_cast<jbyte*>(&sin->sin_addr.s_addr);
env->GetByteArrayRegion(javaAddress, 0, 4, dst);
} else if (addressLength == 16) {
- struct sockaddr_in6 *sin6 = reinterpret_cast<sockaddr_in6*>(&ss);
+ sockaddr_in6 *sin6 = reinterpret_cast<sockaddr_in6*>(&ss);
sin6->sin6_family = AF_INET6;
- socklen = sizeof(struct sockaddr_in6);
+ socklen = sizeof(sockaddr_in6);
jbyte* dst = reinterpret_cast<jbyte*>(&sin6->sin6_addr.s6_addr);
env->GetByteArrayRegion(javaAddress, 0, 16, dst);
} else {
diff --git a/luni/src/main/native/org_apache_harmony_luni_util_fltparse.cpp b/luni/src/main/native/org_apache_harmony_luni_util_fltparse.cpp
index d4d0afd..e85b7f1 100644
--- a/luni/src/main/native/org_apache_harmony_luni_util_fltparse.cpp
+++ b/luni/src/main/native/org_apache_harmony_luni_util_fltparse.cpp
@@ -19,6 +19,7 @@
#include <string.h>
#include <math.h>
#include "JNIHelp.h"
+#include "ScopedUtfChars.h"
#include "commonDblParce.h"
#include "cbigint.h"
@@ -542,25 +543,20 @@ Java_org_apache_harmony_luni_util_FloatingPointParser_parseFltImpl (JNIEnv* env,
jclass,
jstring s, jint e)
{
- jfloat flt;
- const char *str = env->GetStringUTFChars(s, 0);
- flt = createFloat (env, str, e);
- env->ReleaseStringUTFChars(s, str);
-
- if (((I_32) FLOAT_TO_INTBITS (flt)) >= 0)
- {
- return flt;
+ ScopedUtfChars str(env, s);
+ if (str.c_str() == NULL) {
+ return 0.0;
}
- else if (((I_32) FLOAT_TO_INTBITS (flt)) == (I_32) - 1)
- { /* NumberFormatException */
- jniThrowException(env, "java/lang/NumberFormatException", "");
+ jfloat flt = createFloat(env, str.c_str(), e);
+
+ if (((I_32) FLOAT_TO_INTBITS (flt)) >= 0) {
+ return flt;
+ } else if (((I_32) FLOAT_TO_INTBITS (flt)) == (I_32) - 1) {
+ jniThrowException(env, "java/lang/NumberFormatException", NULL);
+ } else {
+ jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
}
- else
- { /* OutOfMemoryError */
- jniThrowException(env, "java/lang/OutOfMemoryError", "");
- }
-
- return 0.0;
+ return 0.0;
}
JNIEXPORT jdouble JNICALL
@@ -568,25 +564,20 @@ Java_org_apache_harmony_luni_util_FloatingPointParser_parseDblImpl (JNIEnv* env,
jclass,
jstring s, jint e)
{
- jdouble dbl;
- const char *str = env->GetStringUTFChars(s, 0);
- dbl = createDouble(env, str, e);
- env->ReleaseStringUTFChars(s, str);
-
- if (!ERROR_OCCURED (dbl))
- {
- return dbl;
+ ScopedUtfChars str(env, s);
+ if (str.c_str() == NULL) {
+ return 0.0;
}
- else if (LOW_I32_FROM_VAR (dbl) == (I_32) - 1)
- { /* NumberFormatException */
- jniThrowException(env, "java/lang/NumberFormatException", "");
+ jdouble dbl = createDouble(env, str.c_str(), e);
+
+ if (!ERROR_OCCURED (dbl)) {
+ return dbl;
+ } else if (LOW_I32_FROM_VAR (dbl) == (I_32) - 1) {
+ jniThrowException(env, "java/lang/NumberFormatException", NULL);
+ } else {
+ jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
}
- else
- { /* OutOfMemoryError */
- jniThrowException(env, "java/lang/OutOfMemoryError", "");
- }
-
- return 0.0;
+ return 0.0;
}
static JNINativeMethod gMethods[] = {
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 aaa052a..2ff8a4e 100644
--- a/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp
+++ b/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp
@@ -20,6 +20,7 @@
#include "LocalArray.h"
#include "ScopedLocalRef.h"
#include "ScopedPrimitiveArray.h"
+#include "ScopedUtfChars.h"
#include "UniquePtr.h"
#include "jni.h"
#include "utils/Log.h"
@@ -313,13 +314,7 @@ static void jniThrowExpatException(JNIEnv* env, XML_Error error) {
jniThrowException(env, "org/apache/harmony/xml/ExpatException", message);
}
-/**
- * Allocates a new parsing context.
- *
- * @param jobject the Java ExpatParser instance
- * @returns a newly-allocated ParsingContext
- */
-ParsingContext* newParsingContext(JNIEnv* env, jobject object) {
+static ParsingContext* newParsingContext(JNIEnv* env, jobject object) {
ParsingContext* result = (ParsingContext*) malloc(sizeof(ParsingContext));
if (result == NULL) {
throw_OutOfMemoryError(env);
@@ -840,25 +835,14 @@ static void processingInstruction(void* data, const char* target, const char* in
* @param javaContext that was provided to handleExternalEntity
* @returns the pointer to the C Expat entity parser
*/
-static jint createEntityParser(JNIEnv* env, jobject, jint parentParser,
- jstring javaEncoding, jstring javaContext) {
- const char* encoding = env->GetStringUTFChars(javaEncoding, NULL);
- if (encoding == NULL) {
- return 0;
- }
-
- const char* context = env->GetStringUTFChars(javaContext, NULL);
- if (context == NULL) {
- env->ReleaseStringUTFChars(javaEncoding, encoding);
+static jint createEntityParser(JNIEnv* env, jobject, jint parentParser, jstring javaEncoding, jstring javaContext) {
+ ScopedUtfChars context(env, javaContext);
+ if (context.c_str() == NULL) {
return 0;
}
XML_Parser parent = (XML_Parser) parentParser;
- XML_Parser entityParser
- = XML_ExternalEntityParserCreate(parent, context, NULL);
- env->ReleaseStringUTFChars(javaEncoding, encoding);
- env->ReleaseStringUTFChars(javaContext, context);
-
+ XML_Parser entityParser = XML_ExternalEntityParserCreate(parent, context.c_str(), NULL);
if (entityParser == NULL) {
throw_OutOfMemoryError(env);
}
@@ -1002,14 +986,16 @@ static jint initialize(JNIEnv* env, jobject object, jstring javaEncoding,
// Create a parser.
XML_Parser parser;
- const char* encoding = env->GetStringUTFChars(javaEncoding, NULL);
+ ScopedUtfChars encoding(env, javaEncoding);
+ if (encoding.c_str() == NULL) {
+ return 0;
+ }
if (processNamespaces) {
// Use '|' to separate URIs from local names.
- parser = XML_ParserCreateNS(encoding, '|');
+ parser = XML_ParserCreateNS(encoding.c_str(), '|');
} else {
- parser = XML_ParserCreate(encoding);
+ parser = XML_ParserCreate(encoding.c_str());
}
- env->ReleaseStringUTFChars(javaEncoding, encoding);
if (parser != NULL) {
if (processNamespaces) {
@@ -1047,8 +1033,7 @@ static void append(JNIEnv* env, jobject object, jint pointer,
ParsingContext* context = (ParsingContext*) XML_GetUserData(parser);
context->env = env;
context->object = object;
- if (!XML_Parse(parser, bytes + byteOffset, byteCount, isFinal) &&
- !env->ExceptionCheck()) {
+ if (!XML_Parse(parser, bytes + byteOffset, byteCount, isFinal) && !env->ExceptionCheck()) {
jniThrowExpatException(env, XML_GetErrorCode(parser));
}
context->object = NULL;
@@ -1071,8 +1056,7 @@ static void appendCharacters(JNIEnv* env, jobject object, jint pointer,
append(env, object, pointer, bytes, byteOffset, byteCount, XML_FALSE);
}
-static void appendString(JNIEnv* env, jobject object, jint pointer,
- jstring xml, jboolean isFinal) {
+static void appendString(JNIEnv* env, jobject object, jint pointer, jstring xml, jboolean isFinal) {
const jchar* chars = env->GetStringChars(xml, NULL);
const char* bytes = reinterpret_cast<const char*>(chars);
size_t byteCount = 2 * env->GetStringLength(xml);
@@ -1186,8 +1170,7 @@ static jstring getAttributeQName(JNIEnv* env, jobject, jint pointer,
* @param index of the attribute
* @returns Java string containing attribute's value
*/
-static jstring getAttributeValueByIndex(JNIEnv* env, jobject,
- jint attributePointer, jint index) {
+static jstring getAttributeValueByIndex(JNIEnv* env, jobject, jint attributePointer, jint index) {
const char** attributes = (const char**) attributePointer;
const char* value = attributes[(index << 1) + 1];
return env->NewStringUTF(value);
@@ -1201,24 +1184,22 @@ static jstring getAttributeValueByIndex(JNIEnv* env, jobject,
* @returns index of attribute with the given uri and local name or -1 if not
* found
*/
-static jint getAttributeIndexForQName(JNIEnv* env, jobject,
- jint attributePointer, jstring qName) {
+static jint getAttributeIndexForQName(JNIEnv* env, jobject, jint attributePointer, jstring qName) {
const char** attributes = (const char**) attributePointer;
- const char* qNameBytes = env->GetStringUTFChars(qName, NULL);
- if (qNameBytes == NULL) {
+ ScopedUtfChars qNameBytes(env, qName);
+ if (qNameBytes.c_str() == NULL) {
return -1;
}
int found = -1;
for (int index = 0; attributes[index * 2]; ++index) {
- if (ExpatElementName(NULL, NULL, attributePointer, index).matchesQName(qNameBytes)) {
+ if (ExpatElementName(NULL, NULL, attributePointer, index).matchesQName(qNameBytes.c_str())) {
found = index;
break;
}
}
- env->ReleaseStringUTFChars(qName, qNameBytes);
return found;
}
@@ -1231,33 +1212,26 @@ static jint getAttributeIndexForQName(JNIEnv* env, jobject,
* @returns index of attribute with the given uri and local name or -1 if not
* found
*/
-static jint getAttributeIndex(JNIEnv* env, jobject,
- jint attributePointer, jstring uri, jstring localName) {
- const char** attributes = (const char**) attributePointer;
-
- const char* uriBytes = env->GetStringUTFChars(uri, NULL);
- if (uriBytes == NULL) {
+static jint getAttributeIndex(JNIEnv* env, jobject, jint attributePointer,
+ jstring uri, jstring localName) {
+ ScopedUtfChars uriBytes(env, uri);
+ if (uriBytes.c_str() == NULL) {
return -1;
}
- const char* localNameBytes = env->GetStringUTFChars(localName, NULL);
- if (localNameBytes == NULL) {
- env->ReleaseStringUTFChars(uri, uriBytes);
+ ScopedUtfChars localNameBytes(env, localName);
+ if (localNameBytes.c_str() == NULL) {
return -1;
}
- int found = -1;
+ const char** attributes = (const char**) attributePointer;
for (int index = 0; attributes[index * 2]; ++index) {
- if (ExpatElementName(NULL, NULL, attributePointer, index)
- .matches(uriBytes, localNameBytes)) {
- found = index;
- break;
+ if (ExpatElementName(NULL, NULL, attributePointer, index).matches(uriBytes.c_str(),
+ localNameBytes.c_str())) {
+ return index;
}
}
-
- env->ReleaseStringUTFChars(uri, uriBytes);
- env->ReleaseStringUTFChars(localName, localNameBytes);
- return found;
+ return -1;
}
/**
@@ -1271,10 +1245,8 @@ static jint getAttributeIndex(JNIEnv* env, jobject,
*/
static jstring getAttributeValueForQName(JNIEnv* env, jobject clazz,
jint attributePointer, jstring qName) {
- jint index = getAttributeIndexForQName(
- env, clazz, attributePointer, qName);
- return index == -1 ? NULL
- : getAttributeValueByIndex(env, clazz, attributePointer, index);
+ jint index = getAttributeIndexForQName(env, clazz, attributePointer, qName);
+ return index == -1 ? NULL : getAttributeValueByIndex(env, clazz, attributePointer, index);
}
/**
@@ -1288,10 +1260,8 @@ static jstring getAttributeValueForQName(JNIEnv* env, jobject clazz,
*/
static jstring getAttributeValue(JNIEnv* env, jobject clazz,
jint attributePointer, jstring uri, jstring localName) {
- jint index = getAttributeIndex(
- env, clazz, attributePointer, uri, localName);
- return index == -1 ? NULL
- : getAttributeValueByIndex(env, clazz, attributePointer, index);
+ jint index = getAttributeIndex(env, clazz, attributePointer, uri, localName);
+ return index == -1 ? NULL : getAttributeValueByIndex(env, clazz, attributePointer, index);
}
/**
@@ -1428,10 +1398,8 @@ static JNINativeMethod parserMethods[] = {
{ "append", "(ILjava/lang/String;Z)V", (void*) appendString },
{ "append", "(I[CII)V", (void*) appendCharacters },
{ "append", "(I[BII)V", (void*) appendBytes },
- { "initialize", "(Ljava/lang/String;Z)I",
- (void*) initialize},
- { "createEntityParser", "(ILjava/lang/String;Ljava/lang/String;)I",
- (void*) createEntityParser},
+ { "initialize", "(Ljava/lang/String;Z)I", (void*) initialize},
+ { "createEntityParser", "(ILjava/lang/String;Ljava/lang/String;)I", (void*) createEntityParser},
{ "staticInitialize", "(Ljava/lang/String;)V", (void*) staticInitialize},
{ "cloneAttributes", "(II)I", (void*) cloneAttributes },
};
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 b91c8e6..ffffb66 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
@@ -596,6 +596,9 @@ static void NativeCrypto_EVP_DigestInit(JNIEnv* env, jclass, EVP_MD_CTX* ctx, js
}
ScopedUtfChars algorithmChars(env, algorithm);
+ if (algorithmChars.c_str() == NULL) {
+ return;
+ }
const EVP_MD *digest = EVP_get_digestbynid(OBJ_txt2nid(algorithmChars.c_str()));
@@ -675,6 +678,9 @@ static void NativeCrypto_EVP_VerifyInit(JNIEnv* env, jclass, EVP_MD_CTX* ctx, js
}
ScopedUtfChars algorithmChars(env, algorithm);
+ if (algorithmChars.c_str() == NULL) {
+ return;
+ }
const EVP_MD *digest = EVP_get_digestbynid(OBJ_txt2nid(algorithmChars.c_str()));
@@ -811,18 +817,20 @@ static int NativeCrypto_verifysignature(JNIEnv* env, jclass,
return -1;
}
- int result = -1;
-
ScopedByteArrayRO msgBytes(env, msg);
ScopedByteArrayRO sigBytes(env, sig);
ScopedByteArrayRO modBytes(env, mod);
ScopedByteArrayRO expBytes(env, exp);
ScopedUtfChars algorithmChars(env, algorithm);
+ if (algorithmChars.c_str() == NULL) {
+ return -1;
+ }
JNI_TRACE("NativeCrypto_verifysignature algorithmChars=%s", algorithmChars.c_str());
Unique_RSA rsa(rsaCreateKey((unsigned char*) modBytes.get(), modBytes.size(),
(unsigned char*) expBytes.get(), expBytes.size()));
+ int result = -1;
if (rsa.get() != NULL) {
result = rsaVerify((unsigned char*) msgBytes.get(), msgBytes.size(),
(unsigned char*) sigBytes.get(), sigBytes.size(),
@@ -851,11 +859,10 @@ static void NativeCrypto_RAND_seed(JNIEnv* env, jclass, jbyteArray seed) {
static int NativeCrypto_RAND_load_file(JNIEnv* env, jclass, jstring filename, jlong max_bytes) {
JNI_TRACE("NativeCrypto_RAND_load_file filename=%p max_bytes=%lld", filename, max_bytes);
- if (filename == NULL) {
- jniThrowNullPointerException(env, "filename == null");
+ ScopedUtfChars file(env, filename);
+ if (file.c_str() == NULL) {
return -1;
}
- ScopedUtfChars file(env, filename);
int result = RAND_load_file(file.c_str(), max_bytes);
JNI_TRACE("NativeCrypto_RAND_load_file file=%s => %d", file.c_str(), result);
return result;
@@ -1896,6 +1903,9 @@ static void NativeCrypto_SSL_set_cipher_lists(JNIEnv* env, jclass,
ScopedLocalRef<jstring> cipherSuite(env,
reinterpret_cast<jstring>(env->GetObjectArrayElement(cipherSuites, i)));
ScopedUtfChars c(env, cipherSuite.get());
+ if (c.c_str() == NULL) {
+ return;
+ }
JNI_TRACE("ssl=%p NativeCrypto_SSL_set_cipher_lists cipherSuite=%s", ssl, c.c_str());
bool found = false;
for (int j = 0; j < num_ciphers; j++) {
diff --git a/openssl/src/main/native/BNInterface.cpp b/openssl/src/main/native/BNInterface.cpp
index a40192c..ea93895 100644
--- a/openssl/src/main/native/BNInterface.cpp
+++ b/openssl/src/main/native/BNInterface.cpp
@@ -20,6 +20,7 @@
#include "JNIHelp.h"
#include "ScopedPrimitiveArray.h"
+#include "ScopedUtfChars.h"
#include "jni.h"
#include <assert.h>
#include <openssl/bn.h>
@@ -150,27 +151,23 @@ static jboolean NativeBN_putLongInt(JNIEnv* env, jclass cls, BIGNUM* a, long lon
*/
static int NativeBN_BN_dec2bn(JNIEnv* env, jclass, BIGNUM* a, jstring str) {
if (!oneValidHandle(env, a)) return -1;
- char* tmpStr = (char*)env->GetStringUTFChars(str, NULL);
- if (tmpStr != NULL) {
- int len = BN_dec2bn(&a, tmpStr);
- env->ReleaseStringUTFChars(str, tmpStr);
- return len; // len == 0: Error
+ ScopedUtfChars chars(env, str);
+ if (chars.c_str() == NULL) {
+ return -1;
}
- else return -1; // Error outside BN.
+ return BN_dec2bn(&a, chars.c_str());
}
/**
* public static native int BN_hex2bn(int, java.lang.String)
*/
static int NativeBN_BN_hex2bn(JNIEnv* env, jclass, BIGNUM* a, jstring str) {
- if (!oneValidHandle(env, a)) return -1;
- char* tmpStr = (char*)env->GetStringUTFChars(str, NULL);
- if (tmpStr != NULL) {
- int len = BN_hex2bn(&a, tmpStr);
- env->ReleaseStringUTFChars(str, tmpStr);
- return len; // len == 0: Error
+ if (!oneValidHandle(env, a)) return -1;
+ ScopedUtfChars chars(env, str);
+ if (chars.c_str() == NULL) {
+ return -1;
}
- else return -1; // Error outside BN.
+ return BN_hex2bn(&a, chars.c_str());
}
/**