summaryrefslogtreecommitdiffstats
path: root/luni/src/main/native/java_lang_System.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'luni/src/main/native/java_lang_System.cpp')
-rw-r--r--luni/src/main/native/java_lang_System.cpp81
1 files changed, 24 insertions, 57 deletions
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));