OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / libcore / luni / src / main / native / java_io_ObjectOutputStream.cpp
1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17
18 #define LOG_TAG "ObjectOutputStream"
19
20 #include "JNIHelp.h"
21 #include "JniConstants.h"
22 #include "ScopedUtfChars.h"
23
24 #define GETTER(FUNCTION_NAME, JNI_C_TYPE, JNI_TYPE_STRING, JNI_GETTER_FUNCTION) \
25     static JNI_C_TYPE FUNCTION_NAME(JNIEnv* env, jclass, jobject instance, jclass declaringClass, \
26             jstring javaFieldName) { \
27         if (instance == NULL) { \
28             return JNI_C_TYPE(); \
29         } \
30         ScopedUtfChars fieldName(env, javaFieldName); \
31         if (fieldName.c_str() == NULL) { \
32             return JNI_C_TYPE(); \
33         } \
34         jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), JNI_TYPE_STRING); \
35         if (fid == 0) { \
36             return JNI_C_TYPE(); \
37         } \
38         return env->JNI_GETTER_FUNCTION(instance, fid); \
39     }
40
41 GETTER(ObjectOutputStream_getFieldBool,   jboolean, "Z", GetBooleanField)
42 GETTER(ObjectOutputStream_getFieldByte,   jbyte,    "B", GetByteField)
43 GETTER(ObjectOutputStream_getFieldChar,   jchar,    "C", GetCharField)
44 GETTER(ObjectOutputStream_getFieldDouble, jdouble,  "D", GetDoubleField)
45 GETTER(ObjectOutputStream_getFieldFloat,  jfloat,   "F", GetFloatField)
46 GETTER(ObjectOutputStream_getFieldInt,    jint,     "I", GetIntField)
47 GETTER(ObjectOutputStream_getFieldLong,   jlong,    "J", GetLongField)
48 GETTER(ObjectOutputStream_getFieldShort,  jshort,   "S", GetShortField)
49
50 static jobject ObjectOutputStream_getFieldObj(JNIEnv* env, jclass, jobject instance,
51         jclass declaringClass, jstring javaFieldName, jstring javaFieldTypeName) {
52     ScopedUtfChars fieldName(env, javaFieldName);
53     if (fieldName.c_str() == NULL) {
54         return NULL;
55     }
56     ScopedUtfChars fieldTypeName(env, javaFieldTypeName);
57     if (fieldTypeName.c_str() == NULL) {
58         return NULL;
59     }
60     jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), fieldTypeName.c_str());
61     if (fid == 0) {
62         return NULL;
63     }
64     return env->GetObjectField(instance, fid);
65 }
66
67 static JNINativeMethod gMethods[] = {
68     NATIVE_METHOD(ObjectOutputStream, getFieldBool, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)Z"),
69     NATIVE_METHOD(ObjectOutputStream, getFieldByte, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)B"),
70     NATIVE_METHOD(ObjectOutputStream, getFieldChar, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)C"),
71     NATIVE_METHOD(ObjectOutputStream, getFieldDouble, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)D"),
72     NATIVE_METHOD(ObjectOutputStream, getFieldFloat, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)F"),
73     NATIVE_METHOD(ObjectOutputStream, getFieldInt, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)I"),
74     NATIVE_METHOD(ObjectOutputStream, getFieldLong, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)J"),
75     NATIVE_METHOD(ObjectOutputStream, getFieldObj, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;"),
76     NATIVE_METHOD(ObjectOutputStream, getFieldShort, "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)S"),
77 };
78 int register_java_io_ObjectOutputStream(JNIEnv* env) {
79     return jniRegisterNativeMethods(env, "java/io/ObjectOutputStream", gMethods, NELEM(gMethods));
80 }