java_lang_System.cpp revision e22935d3c7040c22b48d53bd18878844f381287c
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License.
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
17abf945fb9ce99d8c2769ac5b2691b2732fa59887Elliott Hughes#define LOG_TAG "System"
18abf945fb9ce99d8c2769ac5b2691b2732fa59887Elliott Hughes
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "JNIHelp.h"
20e22935d3c7040c22b48d53bd18878844f381287cElliott Hughes#include "JniConstants.h"
2105960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes#include "ScopedUtfChars.h"
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <stdlib.h>
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include <string.h>
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2605960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughesstatic jstring System_getEnvByName(JNIEnv* env, jclass, jstring javaName) {
2705960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes    ScopedUtfChars name(env, javaName);
2805960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes    if (name.c_str() == NULL) {
2905960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes        return NULL;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
3105960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes    return env->NewStringUTF(getenv(name.c_str()));
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
3405960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes// Pointer to complete environment.
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectextern char** environ;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
3705960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughesstatic jstring System_getEnvByIndex(JNIEnv* env, jclass, jint index) {
3805960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes    return env->NewStringUTF(environ[index]);
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
4105960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes// Sets a field via JNI. Used for the standard streams, which are read-only otherwise.
4205960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughesstatic void System_setFieldImpl(JNIEnv* env, jclass clazz,
4305960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes        jstring javaName, jstring javaSignature, jobject object) {
4405960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes    ScopedUtfChars name(env, javaName);
4505960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes    if (name.c_str() == NULL) {
4605960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes        return;
4705960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes    }
4805960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes    ScopedUtfChars signature(env, javaSignature);
4905960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes    if (signature.c_str() == NULL) {
5005960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes        return;
5105960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes    }
5205960876dff6a5b686821eed8f7ae7cef5af4f50Elliott Hughes    jfieldID fieldID = env->GetStaticFieldID(clazz, name.c_str(), signature.c_str());
5394367e0ead84fc2228799a78ec207ea52e203f1aElliott Hughes    env->SetStaticObjectField(clazz, fieldID, object);
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectstatic JNINativeMethod gMethods[] = {
57e22935d3c7040c22b48d53bd18878844f381287cElliott Hughes    NATIVE_METHOD(System, getEnvByIndex, "(I)Ljava/lang/String;"),
58e22935d3c7040c22b48d53bd18878844f381287cElliott Hughes    NATIVE_METHOD(System, getEnvByName, "(Ljava/lang/String;)Ljava/lang/String;"),
59e22935d3c7040c22b48d53bd18878844f381287cElliott Hughes    NATIVE_METHOD(System, setFieldImpl, "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V"),
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project};
6194367e0ead84fc2228799a78ec207ea52e203f1aElliott Hughesint register_java_lang_System(JNIEnv* env) {
62c08f9fb2a3be82bb1a3f477ca1524ddcf7a1d4b8Elliott Hughes    return jniRegisterNativeMethods(env, "java/lang/System", gMethods, NELEM(gMethods));
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
64